在应用程序扩展和主应用程序中使用 NSUbiquitousKeyValueStore

Jor*_*n H 4 nsuserdefaults ios icloud nsubiquitouskeyvaluestore ios-app-extension

我已经设置了应用程序组并且正在使用NSUserDefaults initWith suiteName以允许我的应用程序和我的扩展程序访问相同的首选项集。我现在想用一个将通过 iCloud 同步这些首选项的实现替换该实现(如果它们启用了 iCloud)。

我已经阅读了NSUbiquitousKeyValueStore这似乎正是我所需要的。但是,文档指出“应用必须始终使用默认的 iCloud 键值存储对象来获取和设置值。此存储与您的应用在其权利请求中提供的唯一标识符字符串相关联。” 这让我相信,如果我采用这一点,应用扩展将不会访问与主应用相同的商店。扩展编程指南中没有提到共享这样​​的存储,它只提到了一个允许访问相同首选项但仅存储在该设备本地的解决方案。

如何实现也可以从该应用程序的扩展访问的简单首选项的 iCloud 同步?

另一个快速问题,iOS 8 有什么变化吗?我知道 iCloud API 发生了重大变化,但也许他们没有触及简单的首选项同步,只是实现了 iCloud Drive?

Fra*_*ank 8

我最近遇到了同样的问题,我在这里分享我的解决方案,希望它可以帮助某人。

com.apple.developer.ubiquity-kvstore-identifier 主应用程序和扩展应用程序之间必须相同。

如果您创建一个扩展应用程序(今天的扩展程序),您将有 2 个.entitlements文件,一个用于主应用程序,另一个用于扩展应用程序。

您可以com.apple.developer.ubiquity-kvstore-identifier从两个.entitlments文件中找到 的值。您需要确保两个相同的

我正在使用$(TeamIdentifierPrefix)$(CFBundleIdentifier)这两个.entitlements文件,这是错误的。因为$(CFBundleIdentifier)是 bundle id,所以主应用和扩展应用实际上是不同的值。

修复方法是使用硬编码的 bundle id: $(TeamIdentifierPrefix)com.youcompnay.app