0

NSUserDefaultsアプリとキーボード拡張機能で同じものにアクセスできるように、アプリのアプリ グループを設定しました。でも問題があります。ブール値をデフォルトに正常に書き込むことができますが、キーボードでアクセスすると、常に false が返されます。キーに使用しているIDとスイート名がまったく同じであることは事実です。アプリ グループが実際にアプリとキーボードの両方で有効になっており、スイート名がアプリ グループ識別子と正確に一致することを確認しました。falseキーボード内からアクセスするときに常にそうなる原因は何ですか?

アプリ内:

NSUserDefaults *SharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myname.sharedPrefsName"];
[SharedDefaults setBool:YES forKey:@"com.myname.appname.dataName"];
[SharedDefaults synchronize];

次回アプリを起動したときに、正常にYESに設定されたことを確認しました:

NSUserDefaults *SharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myname.sharedPrefsName"];
BOOL dataIsYes = [SharedDefaults boolForKey:@"com.myname.appname.dataName"]; //YES

ただし、キーボードでは常に false です。

let sharedprefs = NSUserDefaults(suiteName: "group.com.myname.sharedPrefsName")!
let data = sharedprefs.boolForKey("com.myname.appname.dataName") //false
4

2 に答える 2

1

App Extension Programming guideで答えを見つけました。

デフォルトでは、キーボードはネットワークにアクセスできず、コンテナを含むアプリと共有できません。これらを有効にするには、Info.plist ファイルの RequestsOpenAccess Boolean キーの値を YES に設定します。

この問題を解決するには、キーボードの Info.plist > NSExtension > NSExtensionAttributes > RequestOpenAccess で RequestsOpenAccess フィールドを YES に変更する必要がありました。次に、[設定] でキーボードを削除し、アプリを削除してから再度実行し、キーボードを再度追加します。次に、必ずキーボード名をタップしてから、スイッチを [フル アクセスを許可] に切り替えます。

ユーザーがフル アクセスを有効にしない場合、拡張機能は引き続き共有コンテナーにアクセスできます (iOS 8.3 以降のみ) が、セキュリティとプライバシーの理由から、それに書き込むことはできません。8.2 では、オープン アクセスが許可されていないと読み取ることができません。

于 2014-11-23T23:15:28.783 に答える