2014-11-23 47 views
0

我已经为我的应用设置了应用组,以便我可以在应用和键盘扩展中访问相同的NSUserDefaults。我有一个问题,但。我可以成功地将布尔值写入默认值,但是当我在键盘上访问它时,它总是返回false。我知道一个事实,它使用的密钥ID和套件名称完全相同。我确认应用程序组和应用程序键盘都已启用,并且套件名称与应用程序组标识符完全匹配。当从键盘访问时,什么可能导致它始终为false在共享NSUserDefaults中存储布尔总是返回假

在应用程序中:

NSUserDefaults *SharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myname.sharedPrefsName"]; 
[SharedDefaults setBool:YES forKey:@"com.myname.appname.dataName"]; 
[SharedDefaults synchronize]; 

我没有证实它并顺利拿到设置为YES,下一次我启动的应用程序:

NSUserDefaults *SharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myname.sharedPrefsName"]; 
BOOL dataIsYes = [SharedDefaults boolForKey:@"com.myname.appname.dataName"]; //YES 

然而,在键盘它始终是假的:

let sharedprefs = NSUserDefaults(suiteName: "group.com.myname.sharedPrefsName")! 
let data = sharedprefs.boolForKey("com.myname.appname.dataName") //false 

回答

1

我发现在App Extension Programming guide答案。

默认情况下,键盘没有网络访问权限,不能共享包含其应用程序的容器。要启用这些功能,请将Info.plist文件中的RequestsOpenAccess布尔键值设置为YES。

要解决此问题,我必须将键盘的Info.plist> NSExtension> NSExtensionAttributes> RequestOpenAccess中的RequestsOpenAccess字段更改为YES。然后在设置中删除键盘,删除应用程序,再次运行,然后再次添加键盘。然后一定要点击键盘名称,然后将开关拨到“允许完全访问”。

如果用户未启用完全访问权限,则出于安全和隐私的原因,该扩展仍将能够访问共享容器(仅适用于iOS 8.3+),但无法写入共享容器。在8.2中,如果没有授予开放权限,您无法读取它。

-1

不要对NSUserDefaults使用alloc/init。这是一个单身人士。你应该使用类方法 standardUserDefaults得到一个指针共享用户默认对象:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
+0

从应用程序与键盘访问时,标准用户默认值不同 - 这是两个不同的容器,因此您需要使用相同的套件名称初始化默认值。 – Joey 2014-11-23 23:11:34