CFPrefsPlistSource iOS10で値を読み取れませんでした


87

今日、Xcode 8をベータ2に更新し、AppとTodayExtensionの間でデータを共有しようとしています。私はこのログ警告に直面しています:

2016-07-08 18:00:24.732472 ProjetctX [941:42801] [ユーザーデフォルト] CFPrefsPlistSource <0x1700f1280>の値の読み取りに失敗しました(ドメイン:group.xpto、ユーザー:kCFPreferencesAnyUser、ByHost:はい、コンテナー:(null)) :コンテナでのkCFPreferencesAnyUserの使用は、cfprefsdからデタッチするシステムコンテナでのみ許可されます

誰でも私を助けることができますか?


7
私は私のアプリでこれと同じ問題を抱えています
Pravin Kamble 2016

@PravinKambleこのエラーが発生しましたが、すべてにアクセスできます(ユーザーデフォルトのアプリグループ)。
クレビソン2016

1
9.3で展開ターゲットを変更すると、デバイス上で完全に実行されますが、iOS 10では機能しません。解決策を探しています。解決策が見つかったらすぐにここに投稿します
Pravin Kamble 2016

@PravinKamble Xcode 8ベータ2を使用してプロジェクトを作成しましたか?
クレビソン2016

私はXCodeの8のベータ4と共有してデフォルトを使用して同じことを得る
Gruntcakes

回答:


79

これは実際には、iOS10およびmacOS10.12で導入された偽の警告です。

NSUserDefaultsのヒント:現在のOSでは、「…コンテナはシステムコンテナにのみ許可されています…」というエラーがログに記録されます。

これは偽物です。

特定の障害モードをキャッチしようとして、同時に通常の操作ケースをキャッチしました。

UserDefaultsの後継者も、症状のあるケースをデバッグできなくすることなく、これをそれほど警戒しないようにする方法を考え出していません:/

https://twitter.com/Catfish_Man/status/784460565972332544 [スレッド]

チームIDを前に付けるというアドバイスは警告を沈黙させますが、新しい空のユーザーデフォルトも作成します。これにより、以前に保存されたデータが読み取れなくなります。

当分の間、解決策はそれを無視することです。

また、フォーラムのAppleスタッフメンバーCFM :

ログに記録されたメッセージは、プライベート関数を使用しないと不可能だと思われる非常に具体的なことを行わない限り、偽のメッセージです(これらの関数の誤用を検出するために追加されましたが、残念ながら通常の使用例も検出されました)。


1
チームIDで始まるアプリグループを作成しようとしましたが、「group」で始まるように強制されます。だから-2つは一致しないはずですか?
SAHM 2017年

3
HighSierraでこのログメッセージが表示されます。チームIDを前に付けて、警告は表示されません。Appleはこれを修正するつもりですか?
mschmidt

1
すみません、詳しく教えていただけますか?「チームIDを付加する」とは?
MottiShneor19年

19

アプリグループでUserDefaultsを使用して、メインアプリと拡張機能の間でデータを渡す方法は次のとおりです。

  1. メインアプリで、プロジェクトナビゲーターでプロジェクトを選択します。

  2. メインのアプリターゲットを選択し、[機能]タブを選択します。

  3. アプリグループスイッチをオンに切り替えます。これは、一連のエンタイトルメントを生成するために開発者ポータルと通信します。

  4. 新しいコンテナを作成します。Appleによれば、コンテナIDは「group」で始まる必要があるため、「group.io.intrepid.myapp」などの名前が最適です。

  5. 拡張機能のターゲットを選択し、アプリグループを有効にするプロセスを繰り返します。新しいアプリグループを作成するのではなく、メインのアプリターゲットで作成したばかりのグループを選択するだけです。

  6. アプリまたは拡張機能のいずれかでUserDefaultsを読み書きするときは、にアクセスしないでくださいUserDefaults.standard。代わりにUserDefaults(suiteName: "group.io.intrepid.myapp")。を使用してください。注:スイート名は、手順4で作成したアプリグループコンテナーの名前です。

必ず、グループを有効にして、拡張機能とアプリ機能の両方のセクションで同じグループIDを使用してください。

クレジットはhttp://blog.intrepid.io/ios-app-extensionsに移動します


「メインアプリのターゲットで作成したばかりのグループを選択するだけです」=>表示されなかった場合はどうすればよいですか?
user3722523 2017

拡張機能でも同じグループを有効にして選択してください!
Arfan Mirza 2017

繰り返しますが、拡張子の選択が空の場合に同じグループを選択する方法???
user3722523 2017

[互換性]セクションでグループを切り替えて有効にすると、グループのリストが自動的に表示されます。表示されていない場合は、チーム(署名開発者アカウント)を確認してください。チームにも同じことが必要です。チームを設定し、グループをもう一度切り替えます!
Arfan Mirza 2017

それでも機能しません...ただし、iOSプロジェクトでは機能します。:I'vは、スレッド作成stackoverflow.com/questions/44914304/...
user3722523


4

Xcodeエンタイトルメントのグループ名を次の場所から変更します。

group.com.mycompany.myapp

group.MYTEAMID.com.mycompany.myapp

ps:MYTEAMIDはdeveloper.apple.comメンバーシップで見つけることができます



3

私にとっての解決策は、アプリケーションのバンドル識別子と「グループ」の後の部分に同じ識別子を使用しないことでした。

たとえば、アプリバンドルIDが「com.app.id」の場合、「group.com.app.id」としてのグループIDが問題を引き起こしています。「group.com.app.id.something」に変更すると停止します。


0

Xcode 8.1 Betaでビルドすると、同じ警告が表示されますが、値も取得されます。


0

initWithSuiteNameを使用しようとすると、これと同じ問題が発生します。これはAppleのバグのようです。私が見つけた唯一の解決策/回避策は、デバイスのすべての設定をリセットすることです。移動設定- >一般- >リセット- > [すべての設定をリセットします。

これはiPhoneのコンテンツを消去するのではなく、すべての設定を消去するだけです。設定をリセットした後、すべてが正常に機能しました。それがあなたにも役立つかどうか私に知らせてください。


0

デフォルトでは、Apple設定アプリを介してアプリ設定を表示および編集するためにSettings.Bundle / Root.plistを使用している場合、UserDefaults.standardディクショナリが使用されます。

したがって、アプリグループを使用していて、このデフォルト/設定をアプリと拡張機能内で共有する場合は、設定のコンテナーを変更する必要があります。

ステップ1:Settings.Bundle-> Root.plistを開きます

Settings.Bundle-> Root.plistを開きます

ステップ2:キーApplicationGroupContainerIdentifierを追加し、値として、署名と機能で定義されたApp-Group-Idを設定します:group.xx.yyのようになります

ApplicationGroupContainerIdentifierのキーと値のペアを追加します

この手順を実装すると、App-SettingsのデフォルトコンテナがUserDefaults.standard(アプリのパス)から共有パスに切り替わります。


-3

を使用して拡張APPにデータを保存しようとしたときにこの問題が発生した場合はuserDefault、次のコードを記述している可能性があります。

[[NSUserDefaults standardUserDefaults] initWithSuiteName:@"group.xxx.com"];

このコードはデフォルトをリセットしますuserDefault

実際、正しいコードは次のとおりです。

[[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com"];

http://www.jianshu.com/p/e782104c3bc3


-10

から変更する

[[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];

[[NSUserDefaults alloc] initWithSuiteName:@"nnnnnnnnnn.group.com.xxx.xxx"]; 

nnnnnnnnnコードに署名するために使用するチーム番号はどこにありますか。

Xcode 8GMおよびiOS10 GMでテストされ、動作しました。


2
メインアプリでの書き込みにも「nnnnnnnnnn.group.com.xxx.xxx」を使用するのでしょうか、それとも拡張機能でチームIDを使用するのでしょうか。私の場合、チームIDを追加すると、アプリの「group.com.xxx.xxx」に保存したデータがなくても、空白のUserDeaultsがプルされるように見えます。iOS 10のアップデートをブロックしているので、これが修正されることを本当に望んでいます。
timgcarlson 2016

2
それでもデータは同期されません。エラーはなくなります。
Jeet 2016

3
現在、このエラーはアプリに影響を与えていないようです。ただし、チームIDを追加すると、エラーは表示されませんが、データをフェッチできません。
scorpiozj 2016

4
これは良い答えではありません。あなたは何か他のものを置き、あなたがキーを変えるときの助けとしてエラーをスキップするでしょう。
kokluch 2016年

私の場合には動作しない、エラーは消えますが、データがフェッチされていません
TibiaZ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.