0

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

在应用程序中:

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
4

2 回答 2

1

我在App Extension Programming guide中找到了答案。

默认情况下,键盘无法访问网络,并且无法与其包含的应用共享容器。要启用这些功能,请将 Info.plist 文件中 RequestsOpenAccess 布尔键的值设置为 YES。

为了解决这个问题,我必须在键盘的 Info.plist > NSExtension > NSExtensionAttributes > RequestOpenAccess 中将 RequestsOpenAccess 字段更改为 YES。然后在设置中移除键盘,删除应用程序,再次运行,再次添加键盘。然后确保点击键盘名称,然后将开关切换到允许完全访问。

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

于 2014-11-23T23:15:28.783 回答
-1

不要将 alloc/init 用于 NSUserDefaults。这是一个单例。您应该使用类方法 standardUserDefaults 来获取指向共享用户默认对象的指针:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
于 2014-11-23T23:09:03.490 回答