Objective c 在应用程序组中,伴随应用程序和;应用程序扩展

Objective c 在应用程序组中,伴随应用程序和;应用程序扩展,objective-c,nsuserdefaults,ios8,ios-app-group,Objective C,Nsuserdefaults,Ios8,Ios App Group,有时,但并非总是(我已经让它工作了一段时间),应用程序/扩展程序处于一种状态,我无法读取我的应用程序组中设置在我的同伴应用程序和我的应用程序扩展程序之间的标志。不知道它是如何进入这种状态的,也不知道为什么值会不同,但对于我的应用程序来说,这些值总是同步的,这是非常关键的 配套应用程序viewDidLoad: NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"]; ...

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

配套应用程序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
在我的同伴应用程序进入后台之前,我也会进行同步。我在门户中设置了我的应用程序组等

我做错了什么

编辑

显然,其他人也有这个问题:

“我认为这是目前非常棘手的问题

有时数据共享工作,然后发生变化,突然小部件无法再看到共享的数据(在模拟器和设备上)

烦人,希望在下一个测试版中更可靠一点!”

编辑2 看起来另一个人也报告了这个问题:

“我也注意到了同样的事情。这不仅发生在 NSUserDefault,但也包括容器文件夹中的所有文件 键盘扩展突然将丢失对键盘的读/写权限 使用键盘一段时间后的容器文件夹。“

编辑3 更多证据:

升级到beta 3后,我注意到有时键盘 无法打开数据库,因为它无法访问数据库 文件键盘以前已经能够访问该文件

编辑4

这可能是因为键盘丢失了
RequestsOpenAccess
标志。但我无法复制它,也无法确定

编辑5

似乎其他人在iOS8 GM版本中报告了这一点:

这个问题对我在通用汽车公司仍然存在。它似乎与 键盘崩溃。。但两人之间似乎也存在一些争论 键盘和包含应用程序的人在什么地方创建套件 秩序。我认为这个问题是苹果的问题。相信我,我想要它 这是我的错,但我已经花了无数个小时的尝试和错误。不 无论我在代码中做什么,并使用NSLog进行验证,它最终都会出现在 国家最终。希望有人能找到一颗神奇的药丸


有人解决了这个问题吗?

您必须请求开放访问才能访问共享的
NSUserDefaults
。直接在以下文件中说明:

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


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

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

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

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

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

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

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

6) 转到键盘,现在您将看到没有任何更改

7) 进入设置并将“允许完全访问”切换到否,然后切换到是


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

您已将其标记为iOS 8。具体问题是什么?是的-这涉及应用程序扩展,只有在iOS 8中才能找到。据我所知,你做的每件事都是正确的,这闻起来肯定像苹果的bug:[我也无法使用Gold Master Xcode和iOS 8将其用于键盘扩展。非常令人沮丧。在设备上进行了测试,但一次也没有看到它工作。只是在模拟器上试用了一下,它工作了,但不是很令人放心。有人运气好吗?我想这一定是苹果的错误。查看iOS 8发行说明,这里是what's inc键盘禁用。“网络访问”是共享数据存储所必需的。“键盘已知问题-从同一捆绑包中添加新键盘后,网络访问将被禁用。自定义键盘在应用程序切换后可能会变为空白。解决方法:关闭键盘并重新打开它;这将重新加载视图。”