2016-10-11 13 views
1

私は共有拡張子を持つiOSアプリを持っています。 NSUserDefaultsとApp Groupsを使用してデータを共有しようとしていますが、NSUDオブジェクトに書き込むことができますが、synchronize()はエラーなしで、拡張子は常にnilになります。NSUserDefaultsがアプリと共有拡張の間で動作しないのはなぜですか?

私は、アプリケーショングループがあります。リテラル文字列 "group.net.foo.bar"は、&という拡張子がCapabilities - > App Groupsで設定されています。この文字列は、私のアプリでは、定数の構造体である:

私はUserDefaultsオブジェクトを作成し、それへの書き込みのメインアプリで
struct Forum { 
    static let APP_GROUP = "group.net.foo.bar" 
    static let AUTH_KEY = "AUTH_KEY" 
} 

fileprivate lazy var userDefaults: UserDefaults = { 
    let defaults = UserDefaults() 
    defaults.addSuite(named: Forum.APP_GROUP) 
    return defaults 
}() 

// later 
userDefaults.set(apiKey, forKey: Forum.AUTH_KEY) 
userDefaults.synchronize() 

そのsynchronize()後に新しいNSUDオブジェクトの作成と取得しますAUTH_KEYは機能します。拡張では、私は無駄に、NSUDを作成し、値を取得しよう:私は何を占うことはできませんここでは、スタックオーバーフローのアップルドキュメントと情けない-同様の質問の私の読書のすべてにおいて

private lazy var userDefaults: UserDefaults = { 
    let defaults = UserDefaults() 
    defaults.addSuite(named: Forum.APP_GROUP) 
    return defaults 
}() 

// later 
private func getApiKey() -> String? { 
    return userDefaults.string(forKey: Forum.AUTH_KEY) 
} 
// returns nil 

を私は間違ってやった。

Xcodeのバージョン8.0(8A218a)、また私のiPhone 6Sはdefaults.addSuite(named: ...)UserDefaults(suiteName: ...)と同じにしなければわからないのiOS 10.

答えて

4

を実行しているシミュレータアンディ上のXcode 8.1ベータ2と同じ動作をテストしました。私のアプリでは、私はappGroupsこの方法を使用し、それが期待どおりに動作:あなたはuserDefaultを使用して拡張APPにデータを保存しようとすると、この問題に苦しむ場合

// write 
if let userDefaults = UserDefaults(suiteName: appGroupName) { 
    userDefaults.set("---" as AnyObject, forKey: "distance") 
    userDefaults.set("---" as AnyObject, forKey: "altitude") 
    ... 
    userDefaults.synchronize() 
} 

// read 
if let userDefaults = UserDefaults(suiteName: appGroupName) { 
    self.distanceLabel.text = userDefaults.string(forKey: "distance") 
    self.altitudeLabel.text = userDefaults.string(forKey: "altitude") 
} 
+0

ブラボー、それです。 'defaults.addSuite(named:...)'が何のためのものなのか? –

+0

よろしくお願いします。上記のように、私はよく分かりません。ドキュメントは多少混乱しています。 – zisoft

+0

実際、私が見つけた現在の例はすべて、 'initWithSuiteName'を使ったObjCやSwift 2.3で見つかったので、私はうまくいったと思います。 Swift 3.0はこれを改名し、 'userDefaultsObject.addSuite(named:...)'が私が見た最も近いものだと思いました。名前が変更されたコンストラクタが見つかりませんでした。 –

0

は、多分あなたは、このコードを書いていた:[[NSUserDefaults standardUserDefaults] initWithSuiteName:@ "group.xxx.com"];このコードはデフォルトのuserDefaultをリセットします。実際には、正しいコードは次のとおりです。[[NSUserDefaults alloc] initWithSuiteName:@ "group.xxx.com"]; enter link description here

関連する問題