iCloud&核心数据:当应用程序处于后台时,可能会获得NSPersistentStoreDidImportUbiquitousContentChangesNotification吗?

时间:2016-03-27 18:33:10

标签: ios core-data synchronization icloud

我的应用根据使用Core Data记录的事件的时间使用本地通知。

如果设备上的核心数据存储发生重大变化,我会调用一个名为updateLocalNotifications()的函数来清除现有的本地通知,并根据核心数据中的更新数据设置新的通知。

我的核心数据NSPersistentStoreCoordinator设置为NSPersistentStoreUbiquitousContentNameKey,因此它会使用iCloud自动同步设备。

理想情况下,如果用户在两台或更多设备上运行我的应用,我希望只要iCloud上的核心数据发生变化,就可以在所有设备上运行updateLocalNotifications()

我在AppDelegate中有这个简单的代码来监听和响应iCloud上数据的变化:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    // update local notifications whenever new iCloud data is received
    notificationCenter.addObserver(self, selector: #selector(updateLocalNotifications), name: NSPersistentStoreDidImportUbiquitousContentChangesNotification, object: nil)

...

    return true
}

如果应用程序在两台设备上都处于打开状态并处于前台,并且我在一台设备上记录了一个事件,那么我会在大约20秒内在另一台设备上获得NSPersistentStoreDidImportUbiquitousContentChangesNotification

问题是,当应用程序在第二台设备的后台运行时,我似乎永远不会得到NSPersistentStoreDidImportUbiquitousContentChangesNotification。我已经做了很多挖掘,但似乎无法找到 iCloud同步是否真的应该在后台发生,或者只会在我的应用程序位于前台时发生。我还在测试这个,看看当应用程序在后台时,它只是一个更长的更新间隔。

可能的解决方案#1 (到目前为止基于测试似乎不可行,但这是我想要做的)

此时,我正在寻找一种解决方案让第二台设备检查iCloud是否在后台进行更改,因此当有更改并触发此通知时会触发NSPersistentStoreDidImportUbiquitousContentChangesNotification,即使它比应用程序在前台的频率低。这种方法肯定存在缺陷,例如,如果此人在启动后手动退出应用程序,则无法调用此方法。

可能的解决方案#2 (似乎可能但很复杂)

我正在考虑的另一个可能的解决方案是设置服务器并使用content-available的静默推送通知。这样,当有人在一台设备上记录事件时,我会ping服务器并要求它向用户的其他设备发送content-available推送,并且在响应该推送通知时我可以呼叫updateLocalNotifications()。这有一些缺点。一个是如果在设备启动或手动退出后尚未启动应用程序(类似于解决方案#1),content-available推送将无效。第二个问题是,每当设备上的事件发生变化时,设置服务器和ping服务器都会产生更多的开销,即使该信息已经通过iCloud发送到服务器。

我发现了一些其他类似的问题(比如这个问题:How can I act on Core Data iCloud sync notification when the app is in the background?),但他们没有提出任何可能的解决方案,所以我认为值得发布我的情况和可能的解决方案,以防万一是其他人试图解决类似的问题。

1 个答案:

答案 0 :(得分:1)

我更喜欢这个问题的UX设计解决方案。

用户希望在她的所有设备上弹出提醒是值得怀疑的。您应该提供一个设置,用户可以将其关闭,或者更确切地说,打开。向用户明确提醒将是设备特定的,并且只有在应用处于活动状态时才会更新,但会根据其他设备的输入进行更新。

对于大多数用户来说,这是预期和可接受的行为。