最近,我做了一个简单的iOS 8共享扩展来了解系统的工作原理。正如苹果在其App Extension Programming Guide中所说:
默认情况下,您的包含应用程序及其扩展无法直接访问彼此的容器。
这意味着扩展和包含的应用程序不共享数据。但在同一页中,苹果带来了一个解决方案:
如果希望包含的应用程序及其扩展程序能够共享数据,请使用Xcode或开发人员门户为应用程序及其扩展程序启用应用程序组。接下来,在门户中注册应用程序组,并指定要在包含的应用程序中使用的应用程序组。
然后可以使用NSUserDefaults在包含的应用程序和扩展程序之间共享数据。这正是我想做的。但由于某种原因,它不起作用。
在同一页中,苹果提出了标准默认值:
var defaults = NSUserDefaults.standardUserDefaults()
在WWDC演示(217)中,他们建议使用一个通用包:
var defaults = NSUserDefaults(suiteName: kDefaultsPackage)
此外,我还为包含应用程序目标和扩展目标启用了应用程序组,并使用相同的应用程序组名称:
但所有这些设置都是徒劳的。我无法从扩展中检索我存储在包含应用程序中的数据。就像两个目标使用完全不同的NSUserDefaults存储一样。
所以,
这种方法有解决办法吗?
如何在包含应用程序和共享扩展之间共享简单数据?数据只是API的用户凭证。
最佳答案
您应该像这样使用NSUserDefaults:
保存数据:
目标
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.yougroup"];
[shared setObject:object forKey:@"yourkey"];
[shared synchronize];
敏捷的
let defaults = UserDefaults(suiteName: "group.yourgroup")
defaults?.set(5.9, forKey: "yourKey")
读取数据:
目标
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.yougroup"];
id value = [shared valueForKey:@"yourkey"];
NSLog(@"%@",value);
敏捷的
let defaults = UserDefaults(suiteName: "group.yourgroup")
let x = defaults?.double(forKey: "yourKey")
print(x)
这样就行了!