32

有时,但并非总是如此(我已经让这个工作了一段时间),应用程序/扩展程序进入我无法读取我的应用程序组中在我的配套应用程序和我的应用程序扩展程序之间设置的标志的状态。不知道它是如何进入这种状态的,也不知道为什么这些值不同,但对于我的应用程序来说,这些始终保持同步至关重要。

配套应用 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 版本中报告了这一点:

这个问题在我的 GM 中仍然存在。它似乎与键盘崩溃有关..但键盘和包含应用程序之间似乎存在一些争论,即谁以什么顺序创建套件。我认为这个问题是在苹果的一端。相信我,我希望这是我的错,但我花了无数个小时反复试验。无论我在代码中做什么并使用 NSLog 进行验证,它最终都会处于这种状态。希望有人能找到灵丹妙药。:S

有人解决了这个问题吗?

4

2 回答 2

2

必须请求开放访问才能访问 shared NSUserDefaults。它直接在App Extension Programming guide中说明:

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

确保将RequestsOpenAccess字段更改为YES。您可以在键盘的 Info.plist > NSExtension > NSExtensionAttributes > RequestOpenAccess 中找到它。然后在设置中移除键盘,删除应用程序,再次运行,再次添加键盘。添加后,点击键盘名称,然后翻转开关以启用允许完全访问。您需要指示用户按照相同的步骤授予访问权限(并向他们保证您不是邪恶的),否则它根本不起作用,您将永远无法获得存储在共享容器中的数据。请注意,在 iOS 8.3+ 中,如果用户尚未启用完全访问权限,则键盘将能够访问共享容器,但出于安全和隐私目的,写入它不会保存数据。在 8.2- 你可以'

于 2014-11-23T23:10:22.340 回答
0

我可以确认问题与RequestsOpenAccess标志有关。假设一切正常(NSUserDefaults 使用 initWithSuiteName,主应用程序和自定义键盘的所有功能都已设置,等等)我有接下来的步骤:

1) 在设备上安装主应用程序和自定义键盘

2)将自定义键盘的“允许完全访问”设置为“是”

3)在主应用程序中添加一些项目(在我的情况下这是一个简单的文本模板)

4)转到键盘并检查从主应用程序添加的所有项目是否出现在自定义键盘中

5)转到主应用程序并添加更多项目

6)转到键盘,现在你会看到没有任何改变

7)转到设置并将“允许完全访问”切换到NO,然后切换到YES

8) 再次转到自定义键盘并检查在步骤 5 中添加的项目是否出现。

于 2015-05-04T00:46:14.160 回答