32

常にではありませんが (これは少しの間機能していました)、アプリ/拡張機能は、コンパニオン アプリとアプリ拡張機能の間のアプリ グループに設定されたフラグを読み取ることができない状態になります。この状態になる方法や値が異なる理由はわかりませんが、私のアプリケーションにとってこれらが常に同期していることが重要です。

コンパニオン アプリ viewDidLoad :

NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"];

.....

[myAppSettings setBool:true forKey:@"myBool"];

[myAppSettings synchronize];

NSLog([myAppSettings boolForKey:@"myBool"] ? @"Companion app - bool TRUE" : @"Companion app - bool FALSE");

アプリ拡張 viewDidLoad

NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"];

[myAppSettings synchronize];

NSLog([myAppSettings boolForKey:@"myBool"] ? @"App extension app - bool TRUE" : @"App extension - bool FALSE");

コンソール出力

Companion app - bool TRUE
App extension - bool FALSE

また、コンパニオン アプリがバックグラウンドに入る前に同期します。ポータルなどでアプリ グループを設定しています。

私は何を間違っていますか?

編集

どうやら他の人もこの問題を抱えているようです: https://devforums.apple.com/message/977151#977151

「これは現在非常に問題があると思います。

時々、データ共有が機能し、その後変更が行われ、突然、ウィジェットが共有データを表示できなくなります (シミュレーターとデバイスの両方で)。

うっとうしいので、次のベータ版でもう少し信頼性が高まることを願っています!"

EDIT 2 別の人がこの正確な問題も報告しているようです:

「私も同じことに気付きました。これは NSUserDefaults だけでなく、コンテナー フォルダー内のすべてのファイルにも発生します。キーボード拡張機能は、しばらくキーボードを使用した後、コンテナー フォルダーへの読み取り/書き込み許可を突然失います。」

編集 3 さらなる証拠: https://devforums.apple.com/message/1028078#1028078

beta 3 にアップグレードした後、DB ファイルへのアクセスに失敗したため、キーボードでデータベースを開けないことがあることに気付きました。キーボードは以前にファイルにアクセスできました。

ここに画像の説明を入力 ここに画像の説明を入力

編集4

RequestsOpenAccessこれは、キーボードがフラグを失ったためと思われます。しかし、それを再現することはできず、確実に判断する方法はありません。

編集5

他の人が iOS8 GM ビルドでこれを報告しているようです:

この問題は、GM でも引き続き発生します。キーボードのクラッシュに関連しているようです..しかし、誰がどの順序でスイートを作成するかという点で、キーボードとそれを含むアプリの間にいくつかの競合があるようです. この問題は Apple 側にあると思います。私を信じてください、私はそれが私のせいであることを望んでいますが、私は試行錯誤に数え切れないほどの時間を費やしてきました. コードで何をして NSLog で検証しても、最終的にはこの状態になります。誰かが魔法の薬を見つけてくれることを願っています。:S

誰もこれを解決しましたか?

4

2 に答える 2

2

shared にアクセスするには、オープン アクセスをリクエストする必要NSUserDefaultsがあります。App Extension Programming guideに直接記載されています:

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

RequestsOpenAccessフィールドを に変更してくださいYES。キーボードの Info.plist > NSExtension > NSExtensionAttributes > RequestOpenAccess で見つけることができます。次に、[設定] でキーボードを削除し、アプリを削除してから再度実行し、キーボードを再度追加します。追加したら、キーボード名をタップし、スイッチを切り替えて [フル アクセスを許可] を有効にします。同じ手順に従ってアクセスを許可するようにユーザーに指示する必要があります (そして、あなたが悪人ではないことを安心させてください)。そうしないと、単に機能せず、共有コンテナーに保存されているデータを取得することはできません。iOS 8.3 以降では、ユーザーがフル アクセスを有効にしていない場合、キーボードは共有コンテナーにアクセスできますが、セキュリティとプライバシーの目的で、それに書き込みを行ってもデータは保存されないことに注意してください。8.2 では、次のことができます。

于 2014-11-23T23:10:22.340 に答える
0

RequestsOpenAccess問題がフラグに関連していることを確認できます。すべてが正しく行われたと仮定すると (NSUserDefaults は initWithSuiteName を使用し、メイン アプリケーションとカスタム キーボードのすべての機能が設定されているなど)、次のステップがあります。

1) デバイスにメイン アプリケーションとカスタム キーボードをインストールする

2)カスタム キーボードの[フル アクセスを許可]を [はい] に設定します。

3) メイン アプリにいくつかの項目を追加します (私の場合、これは単純なテキスト テンプレートです)。

4) キーボードに移動し、メイン アプリから追加されたすべての項目がカスタム キーボードに表示されていることを確認します

5) メインアプリに移動し、さらにいくつかのアイテムを追加します

6) キーボードに移動すると、何も変わっていないことがわかります

7)設定に移動し、[フル アクセスを許可する] を [いいえ] に切り替えてから [はい] に切り替えます。

8) 再度カスタム キーボードに移動し、手順 5 で追加した項目が表示されていることを確認します。

于 2015-05-04T00:46:14.160 に答える