首次启动时无法识别iCloud Key Value商店

时间:2012-07-16 16:15:12

标签: objective-c ios icloud key-value-store

我的应用使用iCloud(键值存储)来同步多个设备之间的唯一ID。在第一次启动应用程序时,这项工作接受了它真的必须工作。看起来设备在首次启动时还不熟悉iCloud的值,只有在安装了应用程序并且已运行一段时间之后。

我在应用主视图的viewDidLoad函数中检查iCloud值。

所以,我的问题:

  • 这是预期的行为吗?
  • 如果是,是否有另一种解决方案?
  • 从Xcode运行时,这只是一个问题,而不是发货版本?如果是的话,如何测试?

谢谢!

碧玉

3 个答案:

答案 0 :(得分:7)

我遇到类似的问题,无论我等多久,NSUbiquitousKeyValueStoreDidChangeExternallyNotification都没有在安装后的第一次启动时触发。在NSUBiquitousKeyValueStore中设置初始密钥似乎可以解决这个问题。

将观察者添加到默认商店后,我立即调用:

[[NSUbiquitousKeyValueStore defaultStore] setString:@"testValue" forKey:@"testKey"];
[[NSUbiquitousKeyValueStore defaultStore] synchronize];

我使用不同的密钥(即不是 testKey )来表示我想要同步的实际数据。

答案 1 :(得分:2)

首次运行支持iCloud的应用程序时,必须从Apple服务器提取所有数据。这样做所需的时间取决于许多因素,例如您目前所处的网络类型(Edge,3G,GPRS,WLAN)。它还取决于iCloud服务器当前必须处理多少流量,因此无论您使用何种类型的网络连接,对iCloud服务器的请求可能需要几秒钟。

总结一下:是的,听起来绝对正常。

如果运行您的应用程序取决于这些设置,请考虑实施“等待”或“加载”视图,只要应用程序执行初始同步并从云中加载所有需要的数据,该视图就会保留在屏幕上。要不永久阻止UI,也要为此视图实现超时(如果在X秒内未加载iCloud数据,则关闭视图并通知用户)。

答案 2 :(得分:1)

首次启动应用时,您无法保证NSUbiquitousKeyValueStore已完成首次同步。 (事实上​​,在iOS 5上,它通常会在您第一次启动应用时开始同步。)

无法知道第一次初始同步是否已经发生,正在进行还是已经完成。您可以(事实上应该)订阅NSUbiquitousKeyValueStoreDidChangeExternallyNotification。诀窍是,如果您的商店在iCloud服务器上是空的,那么在初始同步之后您将不会收到任何通知(因为您的本地商店是空的并且云存储也是空的,在初始之后没有真正改变“外部”同步...)

通常,您不应该依赖初始同步。

在发布时要保持乐观,即使您的商店是空的,也要立即推送您的价值(例如您唯一的ID)。如果初始同步同时或之后发生且服务器上已存在某些值,则您的本地值将重置为服务器值,并且您将收到NSUbiquitousKeyValueStoreDidChangeExternallyNotification通知NSUbiquitousKeyValueStoreInitialSyncChange

最后,如果你真的想到了解初始同步是否已经完成,请向bugreport.apple.com提交一个错误并解释为什么你真的需要它。