Ios 根据核心数据的更改计划UILocalNotification

Ios 根据核心数据的更改计划UILocalNotification,ios,swift,core-data,uilocalnotification,today-extension,Ios,Swift,Core Data,Uilocalnotification,Today Extension,我正在制作一个简单的应用程序,带有一个记录事件的Today小部件扩展 用户可以点击应用程序中的按钮或相关的“今日”小部件来记录事件。无论何时按下按钮,这些事件都会与核心数据一起保存 每当应用程序中记录新事件时,我都会运行一个名为updateLocalNotificationsFromCoreData()的函数。它在清除适当的现有通知后,根据核心数据中的最新事件处理UILocalNotifications的设置 但是,当从Today小部件记录新事件时,我无法使用此函数,因为我需要向UIApplic

我正在制作一个简单的应用程序,带有一个记录事件的Today小部件扩展

用户可以点击应用程序中的按钮或相关的“今日”小部件来记录事件。无论何时按下按钮,这些事件都会与核心数据一起保存

每当应用程序中记录新事件时,我都会运行一个名为
updateLocalNotificationsFromCoreData()
的函数。它在清除适当的现有通知后,根据核心数据中的最新事件处理UILocalNotifications的设置

但是,当从Today小部件记录新事件时,我无法使用此函数,因为我需要向
UIApplication.sharedApplication().scheduleLocalNotification()
,注册本地通知,并且UIApplication在Today小部件扩展中不可用

我意识到我可能需要做一些非传统的或黑客的事情来让它工作,所以我正在尝试评估可能的方法,并提出一个相对健壮的解决方案

基本上,我想找到一种方法,我可以把我的
updateLocalNotificationsFromCoreData()
在记录新事件时立即运行。

如果我不能在每次记录事件时都执行此操作,另一种方法是以另一种方式定期(稍微频繁)触发
updateLocalNotificationsFromCoreData()
函数。以下是我正在考虑使用的一些解决方案,但我不喜欢其中任何一个:

启动应用程序(或其他状态更改)时在AppDelegate中执行此操作 我正在考虑的一种方法是在AppDelegate的某处运行我的
updateLocalNotificationsFromCoreData()
函数,比如
didfishLaunchingwithOptions

缺点是需要用户定期打开应用程序。如果用户不经常打开它,则通知行为将不一致。我更喜欢这样一种解决方案:用户只需与Today小部件交互,就可以可靠地获取本地通知,而无需打开应用程序

将事件同步到服务器并使用推送通知 我曾考虑将核心数据中的数据同步到服务器,然后在此基础上设置到用户手机的推送通知

我不喜欢这样,因为我希望用户在没有互联网连接的情况下仍然能够获得通知。它还引入了大量与服务器同步数据的额外开销

Ping服务器,并发送内容可用推送通知 当有人用小部件记录事件时,我可以ping服务器。该服务器可以发送回静默内容可用推送通知,以触发应用程序在后台运行
updateLocalNotificationsFromCoreData()

我发现了一个类似的问题(),其中一个答案提出了类似的解决方案。与以前的解决方案不同,接收通知不需要Internet连接,但需要Internet连接以确保在记录新事件时通知是最新的

后台提取 我考虑使用后台获取从服务器获取任意内容,然后运行
updateLocalNotificationsFromCoreData()
。这将是一种在后台触发更新的方法,尽管如果数据没有被使用,那么获取数据似乎很愚蠢,而且应用程序可能会被拒绝。如果用户不经常打开应用程序并且主要使用Today小部件,那么系统似乎也有不定期调用后台更新的风险

使用后台位置更新 这似乎是最愚蠢的方法,但我想我无论如何都会提到它,因为我已经考虑过了。我可以使用一种低精度后台位置更新模式来触发
updateLocalNotificationsFromCoreData()

这将要求用户允许在后台定位,这很难解释。而且,它需要用户至少移动几个块来触发该功能,这可能会提供不一致的用户体验。此外,由于一个愚蠢的原因,它会增加应用程序的功耗


如果核心数据在没有互联网连接的设备上发生变化时,我想知道如何可靠地安排本地通知,我将非常感激

或者,如果这似乎不可能的话,我会感谢关于哪种方法最有意义的反馈


编辑:我想出了一个新的解决方案。这并不理想,但我认为它比我考虑的其他方法要好。当有人点击按钮记录事件时,我启动完整的应用程序。这很烦人,因为我拥有当时需要的所有数据,可以在不启动应用程序的情况下向用户提供反馈并在“今日”窗口小部件中记录事件,但通过启动应用程序,我有机会检查和安排本地通知

此外,在iOS 9中,对用户的烦恼会稍微减少,因为一旦我的应用程序从“今日”窗口小部件启动,系统范围内的“后退”按钮将出现,并允许用户轻松返回到以前的应用程序

在未来,我可能会尝试一种解决方案,其中一种基于服务器的方法在互联网连接可用时使用,然后我会回到这个系统,仅在网络连接不可用时打开应用程序,并且我需要在应用程序内安排本地通知