2017-08-10 39 views
0

今日のウィジェットを作成していて、私はUserDefaults(suiteName:)を使ってデータを保持しています。主なアプリケーションで私はUserDefaults.standard()を使用しています。これは私がsuiteName:コンストラクタを使用している理由である拡張機能によって読み取られることはできません(または可能ですか?)。拡張機能間でUserDefaultsを共有

メインアプリケーションのユーザーがUserDefaults.standard()のままでいるデータは、拡張機能で利用できる必要があります。値が

UserDefaults.standard().set:...forKey:... 
UserDefaults(suiteName:...)().set:...forKey:... 
... 

質問を共有することができるように、私は両方を持続しています。このとき

は、私はすべて一緒 UserDefaults.standard()をドロップすると、ちょうど私のアプリケーションで UserDefaults(suiteName:)を使用すべきである、またはこの悪い習慣で、もしそうであればどうして?

編集:私はAppグループコンテナを使用しています。わかりやすくするために、私はstandard()をsuiteNameに置き換えるべきか質問しています:私のプロジェクト全体を通して?

+1

拡張子とアプリケーションの間でリソースを共有したい場合は、最良の方法です( '-suiteName:')またはデフォルトの 'FileManager'(' -forSecurityApplicationGroupIdentifier: ')でのみ使用する_AppGroup_を作成し、標準のユーザーデフォルトまたはファイルマネージャーを必要としません。より長いです (ただし、拡張機能からデータを分離する必要がある場合は、引き続きそのサンドボックスを使用できます)。 – holex

+0

ありがとうございました – RyanTCB

答えて

4

を共有して、A pp ExtensionとそのHost Appの間でデータを共有することはできません。データを共有するにはApp Group、つまり共有コンテナUserDefaults(suiteName:)を使用する必要があります。アプリの拡張バンドルは、そのアプリを アプリのバンドル、実行中のアプリの拡張子を含むと含む内にネストされていても

は互いのコンテナへの 直接アクセスすることはできません。

データ共有を有効にするには、Xcodeまたはデベロッパーポータルを使用して、含まれているアプリと含まれているアプリ拡張のアプリグループを にする。 次に、ポータルにアプリグループを登録し、含まれているアプリで使用するアプリグループ を指定します。

アプリグループを有効にすると、アプリエクステンションとそのアプリを含む は、どちらもNSUserDefaults APIを使用して、ユーザー の設定へのアクセスを共有できます。この共有を有効にするには、initWithSuiteName:メソッド を使用して、新しいNSUserDefaultsオブジェクトをインスタンス化し、共有グループの識別子 を渡します。より多くの場合

、を参照してください:https://github.com/pgpt10/Today-Widget

StandardまたはSuitName:アプリケーショングループを使用する方法https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

ホストアプリケーション専用のデータには標準のものを使用してください。 ExtensionとHost Appの間で共有するデータにはsuiteNameを使用します。両方のデータに同じデータを保持しないでください。データの冗長性を避ける。状況に応じて両方を使用してください。

+0

申し訳ありませんが、私は 'initSuiteName:'を使っていたので、Appグループを使っていたという印象を与えていると思いました。私は誰ですか。これを明確にするためにOQを更新しました。ありがとう – RyanTCB

+0

あなたは直面している問題は何ですか? – PGDev

+0

私は現在、標準とスイート名の両方のコンストラクタに対して同じデータを保持しています。私は単にstandard()を落としてsuiteNameを使うべきですか? – RyanTCB

1

簡単な例:

if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") { 
userDefaults.set("test 1" as AnyObject, forKey: "key1") 
userDefaults.set("test 2" as AnyObject, forKey: "key2") 
userDefaults.synchronize() 

、あなたは後でそれを赤いすることができます

if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") { 
let value1 = userDefaults.string(forKey: "key1") 
let value2 = userDefaults.string(forKey: "key2") 
... 

}

関連する問題