Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iCloud&;核心数据:当应用程序处于后台时,是否可能获取NSPersistentStoreDidImportubiQuantiousContentChangesNotification?_Ios_Core Data_Synchronization_Icloud - Fatal编程技术网

Ios iCloud&;核心数据:当应用程序处于后台时,是否可能获取NSPersistentStoreDidImportubiQuantiousContentChangesNotification?

Ios iCloud&;核心数据:当应用程序处于后台时,是否可能获取NSPersistentStoreDidImportubiQuantiousContentChangesNotification?,ios,core-data,synchronization,icloud,Ios,Core Data,Synchronization,Icloud,我的应用程序根据使用核心数据记录的事件的时间使用本地通知 每当设备上的核心数据存储发生重大更改时,我都会调用一个名为updateLocalNotifications()的函数,该函数将清除现有的本地通知,并根据核心数据中的更新数据设置新的通知 核心数据的MyNSPersistentStoreCoordinator是使用NSPersistentStoreUbiquitousContentNameKey设置的,因此它可以使用iCloud自动跨设备同步 理想情况下,如果用户在两台或多台设备上运行我的应

我的应用程序根据使用核心数据记录的事件的时间使用本地通知

每当设备上的核心数据存储发生重大更改时,我都会调用一个名为
updateLocalNotifications()
的函数,该函数将清除现有的本地通知,并根据核心数据中的更新数据设置新的通知

核心数据的My
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秒内在另一台设备上获得
NSPersistentStoredImportubiquitousContentChangesNotification

问题是,当应用程序在第二台设备的后台运行时,我似乎从未获得过NSPersistentStoredImportubiQuantiousContentChangesNotification。我做了很多挖掘工作,但似乎无法确定iCloud同步是应该在后台进行,还是只有在我的应用程序位于前台时才会进行。我仍在测试,看看当应用程序在后台时,是否只是更新间隔更长


可能的解决方案#1(根据目前的测试,似乎不可行,但这正是我想要做的)

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

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

我正在考虑的另一个可能的解决方案是设置一个服务器,并在
内容可用的情况下使用静默推送通知。这样,当有人在一台设备上记录事件时,我会ping服务器并要求它向用户的其他设备发送
可用内容
推送,我可以在响应推送通知时调用
updateLocalNotifications()
。这有一些缺点。一个是,如果设备启动后应用程序未启动或手动退出(类似于解决方案#1),则可用的
内容
推送将无法工作。第二个原因是,即使信息已经通过iCloud发送到服务器,但每次设备上的事件发生变化时,设置服务器和ping服务器的开销都要大得多


我还发现了一些其他类似的问题(比如这个:),但他们没有提出任何可能的解决方案,所以我认为有必要公布我的情况和可能的解决方案,以防有其他人试图解决类似的问题。

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

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


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

有趣的解决方案!谢谢分享。我从未想过只在最近使用的设备上显示通知(事件记录在设备上),但正如您所说,这可能是预期的行为,或者我可以通知用户这一点,并在将来提出通知同步解决方案时为他们提供启用选项。