不时(但并非总是如此)(我已经开始工作了一段时间),应用程序/扩展程序处于一种状态,我无法读取我的应用程序组在我的随播应用程序和我的应用程序之间设置的标记延期。不知道它是如何处于这种状态或为什么值不同,但它对我的应用程序 critical 这些始终是同步的。
Companion app viewDidLoad :
NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"];
.....
[myAppSettings setBool:true forKey:@"myBool"];
[myAppSettings synchronize];
NSLog([myAppSettings boolForKey:@"myBool"] ? @"Companion app - bool TRUE" : @"Companion app - bool FALSE");
应用扩展程序viewDidLoad
NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"];
[myAppSettings synchronize];
NSLog([myAppSettings boolForKey:@"myBool"] ? @"App extension app - bool TRUE" : @"App extension - bool FALSE");
控制台输出
Companion app - bool TRUE
App extension - bool FALSE
我也会在我的同伴应用程序进入后台之前进行同步。我在门户网站等设置了我的应用程序组。
我做错了什么?
修改
显然其他人也有这个问题: https://devforums.apple.com/message/977151#977151
“我认为这目前非常糟糕。
有时数据共享起作用,然后发生变化,窗口小部件突然无法再看到共享数据(在模拟器和设备上)。
烦人并希望它在下一个测试版中更加可靠!“
编辑2 看起来其他人也报告过这个问题:
“我也注意到了同样的事情。这不仅发生在 NSUserDefaults,也是容器文件夹中的所有文件。该 键盘扩展突然会失去读/写权限 使用键盘一段时间后的容器文件夹。“
编辑3 更多证据:https://devforums.apple.com/message/1028078#1028078
升级到beta 3后,我注意到有时键盘 无法打开数据库,因为它无法访问数据库 文件。键盘之前已能够访问该文件。
编辑4
似乎这可能是因为键盘丢失了RequestsOpenAccess
标志。但是我无法重现它,而且我无法确定。
编辑5
似乎其他人在iOS8 GM版本中报告此事:
这个问题在全球机制中仍然存在。它似乎与a有关 键盘崩溃..但似乎也存在一些争论 键盘和包含应用程序的人在什么创建套件 订购。我认为这个问题在苹果公司的最后。相信我,我希望它 是我的错,但我花了无数个小时进行反复试验。没有 无论我在代码中执行什么操作并使用NSLog进行验证,它都会以此结束 最终状态。希望有人找到一个神奇的药丸。 :S
有人解决了这个问题吗?
答案 0 :(得分:2)
您必须请求开放访问才能访问共享的NSUserDefaults
。它直接在App Extension Programming guide:
默认情况下,键盘没有网络访问权限,无法与包含应用程序的容器共享容器。要启用这些功能,请将Info.plist文件中的RequestsOpenAccess布尔值的值设置为YES。
请务必将RequestsOpenAccess
字段更改为YES
。您可以在键盘的Info.plist>中找到它。 NSExtension> NSExtensionAttributes> RequestOpenAccess。然后在“设置”中删除键盘,删除应用程序,再次运行,再次添加键盘。添加后,点击键盘名称,然后翻转开关以启用“允许完全访问”。您需要指示用户遵循相同的步骤来授予访问权限(并向他们保证您不是邪恶的),否则它将无法正常工作,您将永远无法获得数据&#39 ; s存储在您的共享容器中。请注意,在iOS 8.3+中,如果用户未启用完全访问权限,则键盘将能够访问共享容器,但出于安全和隐私目的,写入该文件将不会保存数据。在8.2-您无法在未授予开放访问权限的情况下访问该数据。
答案 1 :(得分:0)
我可以确认问题与RequestsOpenAccess
标志有关。
假设一切正常(NSUserDefaults使用initWithSuiteName,主应用程序和自定义键盘的所有功能都已设置等),我接下来的步骤:
1)在设备上安装主应用程序和自定义键盘
2)设置' 允许完全访问权限'自定义键盘为YES
3)在主应用程序中添加一些项目(在我的例子中,这是一个简单的文本模板)
4)转到键盘并检查从主应用添加的所有项目, 出现在自定义键盘中
5)转到主应用程序并添加更多项目
6)转到键盘,现在你会发现没有任何改变
7)转到设置并切换“允许完全访问权限”#39;到NO然后到YES
8)再次转到自定义键盘并检查在步骤5中添加的项目是否出现。