Ios iCloud&;核心数据:当应用程序处于后台时,是否可能获取NSPersistentStoreDidImportubiQuantiousContentChangesNotification?
我的应用程序根据使用核心数据记录的事件的时间使用本地通知 每当设备上的核心数据存储发生重大更改时,我都会调用一个名为Ios iCloud&;核心数据:当应用程序处于后台时,是否可能获取NSPersistentStoreDidImportubiQuantiousContentChangesNotification?,ios,core-data,synchronization,icloud,Ios,Core Data,Synchronization,Icloud,我的应用程序根据使用核心数据记录的事件的时间使用本地通知 每当设备上的核心数据存储发生重大更改时,我都会调用一个名为updateLocalNotifications()的函数,该函数将清除现有的本地通知,并根据核心数据中的更新数据设置新的通知 核心数据的MyNSPersistentStoreCoordinator是使用NSPersistentStoreUbiquitousContentNameKey设置的,因此它可以使用iCloud自动跨设备同步 理想情况下,如果用户在两台或多台设备上运行我的应
updateLocalNotifications()
的函数,该函数将清除现有的本地通知,并根据核心数据中的更新数据设置新的通知
核心数据的MyNSPersistentStoreCoordinator
是使用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设计解决方案
用户希望在其所有设备上弹出您的提醒,这是值得怀疑的。您应该提供一个设置,用户可以在其中关闭它们,或者更确切地说,打开它们。向用户明确提醒将是特定于设备的,并且仅当应用程序处于活动状态时才会更新提醒,但要基于其他设备的输入
对于大多数用户来说,这是预期的和可接受的行为 有趣的解决方案!谢谢分享。我从未想过只在最近使用的设备上显示通知(事件记录在设备上),但正如您所说,这可能是预期的行为,或者我可以通知用户这一点,并在将来提出通知同步解决方案时为他们提供启用选项。