如何测试Cocoa应用程序和iOS应用程序之间的iCloud同步

时间:2014-05-26 03:34:08

标签: objective-c macos cocoa icloud nsubiquitouskeyvaluestore

我的问题很简单:

我现在正在开发 Cocoa应用程序,它将数据存储在 iCloud (键值存储区)中。为了测试 iCloud同步,我构建了一个简单的 iOS应用,并将其安装在我的设备中。

我在cocoa app中做了 iCloud初始化

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataUpdatedFromCloud:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:[NSUbiquitousKeyValueStore defaultStore]];
[[NSUbiquitousKeyValueStore defaultStore] synchronize];

和选择器:

+(void)dataUpdatedFromCloud:(NSNotification *)notification {
    NSLog(@"dataUpdatedFromCloud: %@", [[NSUbiquitousKeyValueStore defaultStore] objectForKey:@"theKey"]);
}

以便在来自iCloud时捕获数据。

我在iOS应用程序中执行所有操作,在将数据存储在 NSUbiquitousKeyValueStore 中时执行额外操作:

// Script 1
[[NSUbiquitousKeyValueStore defaultStore] setDictionary:@{@"id":@1} forKey:@"theKey"];

我的测试场景是:

  1. 在Xcode中运行cocoa应用程序
  2. 在我的设备
  3. 中运行iOS应用
  4. 在iOS应用中,我有一个按钮,可以调用脚本1
  5. 这里我希望在Cocoa应用程序上以10-20秒的时间调用 dataUpdatedFromCloud ,但它没有!
  6. 我做的一切都是正确的,还是我理解错了?

2 个答案:

答案 0 :(得分:2)

嗯,可能,但可能失败的原因包括:

  • iCloud容器ID在两个应用上并不完全相同。一方面这是显而易见的,但另一方面,这是最容易搞砸的事情,所以再次检查。
  • iCloud容器ID正常,但配置文件实际上并未在两个应用中启用iCloud。您应该检查两个应用中的ubiquityIdentityToken以验证这一点。
  • 该值已经同步,例如,当应用程序未运行时。如果在应用运行时发生更改,则会发布您正在查找的通知;如果新值与旧值不同,则会发布。由于您始终将@1设置为值,因此完全有可能已经收到该值并且新尝试不会更改任何内容。对于测试,可能有助于将@1替换为@([NSDate timeIntervalSinceReferenceDate]),以确保每次都获得不同的值。
  • iCloud暂时混淆/失败/破碎/只是简单慢。虽然10-20秒是合理的,但没有性能保证。如果它在30秒甚至30分钟后出现,它仍然像宣传的那样工作。

答案 1 :(得分:0)

通过重置iCloud的文档和数据,我已经成功完成了iCloud同步:http://support.apple.com/kb/HT5824

有时候,iCloud会对已经同步的内容和测试内容感到困惑,特别是当您重复进行相同的更新时,我的体验更有可能。