3

我正在使用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]);
}

有解决办法吗?或者我做错了什么?

4

1 回答 1

3

首先-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 秒。

于 2012-08-04T05:21:37.393 回答