我的应用程序使用 iCloud(键值存储)在多个设备之间同步唯一 ID。如果它真的必须在应用程序的第一次启动时工作,那么这项工作就可以接受。看起来设备在首次启动时还不熟悉 iCloud 的值,只有在安装了应用程序并运行了一段时间之后。
我在应用程序主视图的 viewDidLoad 函数中检查 iCloud 值。
所以,我的问题:
- 这是预期的行为吗?
- 如果是,是否有其他解决方案?
- 难道这只是从 Xcode 运行时出现的问题,而不是发货版本?如果是这样,如何测试?
谢谢!
碧玉
我的应用程序使用 iCloud(键值存储)在多个设备之间同步唯一 ID。如果它真的必须在应用程序的第一次启动时工作,那么这项工作就可以接受。看起来设备在首次启动时还不熟悉 iCloud 的值,只有在安装了应用程序并运行了一段时间之后。
我在应用程序主视图的 viewDidLoad 函数中检查 iCloud 值。
所以,我的问题:
谢谢!
碧玉
我有一个类似的问题,无论我等了多长时间,NSUbiquitousKeyValueStoreDidChangeExternallyNotification 都没有在安装后的第一次启动时触发。在 NSUBiquitousKeyValueStore 中设置一个初始键似乎可以解决这个问题。
在将观察者添加到默认存储后,我立即调用:
[[NSUbiquitousKeyValueStore defaultStore] setString:@"testValue" forKey:@"testKey"];
[[NSUbiquitousKeyValueStore defaultStore] synchronize];
我对要同步的实际数据使用不同的键(即不是testKey )。
当您第一次运行启用了 iCloud 的应用程序时,它必须从 Apple 服务器中提取所有数据。执行此操作所需的时间取决于许多因素,例如您当前使用的网络类型(Edge、3G、GPRS、WLAN)。它还取决于 iCloud 服务器当前必须处理多少流量,因此无论您拥有何种类型的网络连接,对 iCloud 服务器的请求都可能需要几秒钟的时间。
总结一下:是的,这听起来很正常。
如果运行您的应用程序取决于这些设置,请考虑实现一个“等待”或“加载”视图,只要应用程序执行初始同步并从云加载所有需要的数据,它就会一直停留在屏幕上。为了不永远阻塞 UI,还为此视图实现超时(如果 iCloud 数据未在 X 秒内加载,则关闭视图并通知用户)。
当您的应用程序首次启动时,您无法保证NSUbiquitousKeyValueStore
会完成第一次同步。(事实上,在 iOS 5 上,它通常会在您第一次启动应用程序时开始同步)。
无法知道第一次初始同步是否已经发生、正在进行或已完成。您可以(实际上应该)订阅NSUbiquitousKeyValueStoreDidChangeExternallyNotification
. 诀窍是,如果您的存储在 iCloud 服务器上为空,则在初始同步后您将不会收到任何通知(因为您的本地存储为空且云存储也为空,所以在初始同步之后“外部”没有真正改变同步…)
通常,您不应依赖已完成的初始同步。
在发布时保持乐观,即使您的商店是空的,也要立即推动您的价值观(例如您的唯一 ID)。如果初始同步同时或之后发生,并且服务器上已经有一些值,您的本地值将重置为服务器值,您将收到NSUbiquitousKeyValueStoreDidChangeExternallyNotification
带有NSUbiquitousKeyValueStoreInitialSyncChange
原因的通知。
最后,如果您真的想知道初始同步是否已完成,请向 bugreport.apple.com 提交错误并解释您真正需要它的原因。