2016-10-11 28 views
1

我有一个共享扩展的iOS应用程序。我试图使用NSUserDefaults和App Groups在它们之间共享数据,但是,虽然我可以写入NSUD对象,但是没有错误,并且synchronize()没有错误,读取扩展总是导致nil为什么NSUserDefaults在我的应用程序和共享扩展之间不起作用?

我有一个应用程序组,文本字符串“group.net.foo.bar”,这两个应用程序&扩展在Capabilities - > App Groups下配置。此字符串是一个常量结构在我的应用程序:

struct Forum { 
    static let APP_GROUP = "group.net.foo.bar" 
    static let AUTH_KEY = "AUTH_KEY" 
} 

在主应用程序创建一个UserDefaults对象和写入:

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),也和Xcode 8.1 Beta 2版相同的行为测试的模拟器安迪我的iPhone 6S运行iOS 10.

回答

4

不知道defaults.addSuite(named: ...)不一样UserDefaults(suiteName: ...)。在我的应用我使用appGroups这样的,它按预期工作:

// 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(命名:...)'用于? –

+0

很高兴为您效劳。如上所述,我不确定。这里的文档有点混乱。 – zisoft

+0

事实上 - 我想我被绊倒了,因为我发现的所有当前示例都是使用'initWithSuiteName'的ObjC或Swift 2.3。 Swift 3.0重命名了这个,我认为'userDefaultsObject.addSuite(named:...)'是我看到的最接近的东西,我错过了重命名的构造函数。 –

0

如果当您尝试使用userDefault将数据保存到扩展APP遭遇这个问题,也许你这样写代码:[[NSUserDefaults的standardUserDefaults] initWithSuiteName:@“group.xxx.com”];此代码重置默认userDefault。其实,正确的代码是:[[NSUserDefaults alloc] initWithSuiteName:@“group.xxx.com”]; enter link description here

相关问题