8

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

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

所以,我的问题:

  • 这是预期的行为吗?
  • 如果是,是否有其他解决方案?
  • 难道这只是从 Xcode 运行时出现的问题,而不是发货版本?如果是这样,如何测试?

谢谢!

碧玉

4

3 回答 3

8

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

在将观察者添加到默认存储后,我立即调用:

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

我对要同步的实际数据使用不同的键(即不是testKey )。

于 2012-11-20T14:53:06.580 回答
2

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

总结一下:是的,这听起来很正常。

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

于 2012-07-16T16:32:09.393 回答
1

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

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

通常,您不应依赖已完成的初始同步。

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

最后,如果您真的想知道初始同步是否已完成,请向 bugreport.apple.com 提交错误并解释您真正需要它的原因。

于 2012-07-20T01:50:49.100 回答