没有完全访问权限的自定义 iOS 键盘访问容器

Custom iOS keyboard accesses container without Full Access privileges

总结

我目前正在实施自定义 iOS 键盘。我需要在键盘和包含的应用程序之间共享数据。即使用户禁用了完全访问权限,这在某种程度上也能奏效。为什么?

详情

为了在键盘和包含的应用程序之间共享数据,我安装了一个应用程序组并使用

NSFileManager
    .defaultManager()
    .containerURLForSecurityApplicationGroupIdentifier("mySuiteName")

共享文件和

NSUserDefaults(suiteName:"mySuiteName")

其他设置。

据我了解,用户必须在系统设置中激活对我的键盘的完全访问权限。 App Extension Programming Guide 状态:

If you request open access by setting this key’s value to YES, your keyboard gains the following capabilities [...]:

  • Option to use a shared container with the keyboard’s containing app, which enables features such as providing a custom lexicon management UI in the containing app

我已将所需的 属性 添加到 plist 文件中,并在键盘设置中查看了相应的选项。为了测试用户是否允许完全访问键盘,我采用了已知的方法并测试了粘贴板的可用性

UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)

按预期工作。

但是,我注意到如果完全访问权限被禁用,我仍然可以使用

从键盘加载图像
UIImage(contentsOfFile: imagePath)

imagePath 指向共享容器中的文件。我已经在两个设备 运行 iOS 9.2 上对此进行了测试。这不应该是不可能的吗?我想知道我是否误解了对共享容器的限制。

在 iOS 8.0 和 9.0 之间的某个时间点(我想说 8.3,但我不记得确切的版本)Apple 更改了对自定义键盘的限制,以便它们 read-only 访问共享容器 -- 文件系统和与之关联的 NSUserDefaults,即使完全访问被禁用。

文档尚未更新。你应该提交一个雷达。