【问题标题】:iOS - NSUbiquitousKeyValueStore doesn't "actually" synciOS - NSUbiquitousKeyValueStore 不“实际上”同步
【发布时间】:2012-08-02 02:39:41
【问题描述】:

我正在使用NSUbiquitousKeyValueStore 同步我的应用程序首选项,我正在使用两台设备 iPhone 3GS 和 iPhone 4 测试同步过程。

当我在一台设备(比如 iPhone 3GS)中更改首选项时,它会使用以下代码将首选项同步到 NSUbiquitousKeyValueStore

NSUbiquitousKeyValueStore *keyStore = [NSUbiquitousKeyValueStore defaultStore];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    [keyStore setObject:[userDefaults objectForKey:S_KEY_UI_SOUNDS]
                 forKey:S_KEY_UI_SOUNDS];

if ([keyStore synchronize]) {
    NSLog(@"TO ICLOUD - UI SOUNDS %@", [keyStore objectForKey:S_KEY_UI_SOUNDS]);
}

但是会出现两个问题:

第一:虽然注册了NSUbiquitousKeyValueStoreDidChangeExternallyNotification,但我从未在 iPhone 4 上收到它。因此,如果 iPhone 4 处于活动状态,而 iPhone 3GS 更改了偏好,iPhone 4 将不会意识到它.

第二:当 iPhone 开始从 NSUbiquitousKeyValueStore 同步首选项时,它永远不会使用 iPhone 3GS 获得新的首选项集(见下面的代码)。尽管与NSUbiquitousKeyValueStore 成功同步(同步方法返回YES)。

NSUbiquitousKeyValueStore *keyStore = [NSUbiquitousKeyValueStore defaultStore];
if ([userDefaults synchronize]) {
    NSLog(@"FROM - UI SOUNDS %@", [keyStore objectForKey:S_KEY_UI_SOUNDS]);
}

有解决办法吗?还是我做错了什么?

【问题讨论】:

  • 另外,别忘了您应该在两台设备上都为 iCload 设置 Apple ID 帐户...

标签: iphone objective-c ios synchronization icloud


【解决方案1】:

First -synchronize 不是关于“与 iCloud 服务器同步”。这是关于同步您的更改和磁盘上的本地存储。一旦它在磁盘上,底层引擎会在它认为合适的时候将你的更改推送到云端(通常在大约 3 秒之后)。

其次,您应该订阅商店更改通知。

简而言之,使用NSUbiquitousKeyValueStore 时应该做的第一件事是:

store = [NSUbiquitousKeyValueStore defaultStore];
// subscribe immediately to any change that might happen to the store
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(storeDidChangeExternally:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:store];

// get any changes since the last app launch right now (safer)
[store synchronize];

最后,与云的同步发生在“适当的时间”(您暂时无法控制)。

只是给您一个想法,一旦您将内存中的更改“同步”到磁盘,引擎通常会“很快”开始与云同步并推送您的更改。

服务器随后会将通知推送到其他设备,然后这些设备也会安排与云的同步。

在正常情况下,设备同步大约需要 7 秒。

【讨论】:

  • 首先,我将对其进行测试并考虑一整分钟进行同步。其次,我已经这样做了,并且在被调用的方法中没有收到任何内容(在您的代码中,即 storeDidChangeExternally:)。可能是因为第一个问题。
  • 检查您的 iCloud 帐户,检查文档和数据开关是否打开以及您是否通过 Wifi(或蜂窝网络文档和数据允许通过蜂窝网络同步)
  • 另外,iOS 5 并没有为您提供查看 iCloud 同步实际发生时间的好方法。你应该提交一个关于这个的错误。
  • 是的,一切都很好,实际上我正在与 iCloud 同步文档。用户将能够同步文档但不能同步用户首选项,这真的很奇怪!我尝试了整整 2 分钟,但没有发生同步。
  • 您能否查看完整的控制台(使用 Xcode 管理器),看看您是否看到与 syncdefaultsd 相关的内容?
猜你喜欢
  • 2012-07-08
  • 2014-12-13
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2014-02-05
  • 2012-07-31
  • 2020-01-14
  • 2017-08-16
相关资源
最近更新 更多