当应用程序未运行时,通过静默推送通知在后台更新本地数据库
Posted
技术标签:
【中文标题】当应用程序未运行时,通过静默推送通知在后台更新本地数据库【英文标题】:Update local database in the background through silent push notification when app is not running 【发布时间】:2015-07-19 12:35:44 【问题描述】:是否可以接收静默推送通知(“content-available”:“1”)并运行一个函数来更改NSUserDefaults.standardUserDefaults()
中的数据,而无需用户点击通知(通知中没有通知中心,因为它是静默推送通知)。
该应用程序根本没有运行(例如,用户强制退出)。我已经尝试了下面的代码,如果应用程序正在运行或在后台运行,它可以工作,但如果应用程序被强制退出(根本不运行),我也希望它工作。
我已启用后台获取和远程通知。
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
handleNotification()
//this works, the someData is not a problem
func handleNotification() -> Void
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setValue(someData, forKey: "key")
defaults.synchronize()
当我发送推送通知时,如果应用程序处于活动状态或在后台,数据会更新,但如果应用程序根本没有运行,则数据不会更新。
【问题讨论】:
我写道:我启用了后台获取和远程通知。在功能-后台模式中,我都检查了它们 我把所有的东西都拿回来了:( 好吧,有可能做这种事吗? 据我了解文档,是的。到目前为止还没有尝试过 您之前是否强制退出该应用程序?据我了解文档,您不得这样做:“此外,如果您启用了远程通知后台模式,系统会启动您的应用程序(或将其从挂起状态唤醒)并在远程时将其置于后台状态通知到达。但是,如果用户强制退出,系统不会自动启动您的应用" 【参考方案1】:简短回答:当应用强制退出(未运行)时,如果没有用户交互,(几乎)无法做任何事情。
解释见文档:
Handling Remote Notifications - application:didReceiveRemoteNotification:fetchCompletionHandler:
使用此方法为您的应用处理传入的远程通知。 与 application:didReceiveRemoteNotification: 方法不同,它是 仅当您的应用程序在前台运行时调用,系统 当您的应用在前台运行时调用此方法或 背景。此外,如果您启用了远程通知 后台模式,系统启动您的应用程序(或从 挂起状态),并在远程时将其置于后台状态 通知到达。 但是,系统不会自动 如果用户强制退出它,则启动您的应用程序。在这种情况下, 用户必须在系统之前重新启动您的应用程序或重新启动设备 尝试再次自动启动您的应用。
Understanding When Your App Gets Launched into the Background:
支持后台执行的应用程序可能会被系统重新启动 处理传入事件。 如果应用因任何原因被终止 除了用户强制退出,系统启动应用 当下列事件之一发生时:
对于位置应用程序:系统收到满足 应用程序配置的交付标准。输入的设备或 退出注册区域。 (区域可以是地理区域或 iBeacon 区域。) 对于音频应用,音频框架需要应用 处理一些数据。 (音频应用程序包括播放音频或使用 麦克风。) 对于蓝牙应用程序:扮演中心角色的应用程序 从连接的外围设备接收数据。一个应用在 外围角色从连接的中心接收命令。 对于后台下载应用程序:应用程序的推送通知到达,并且 通知的有效负载包含内容可用密钥 值为 1。系统在机会主义时刻唤醒应用程序 开始下载新内容。 对于下载内容的应用程序 后台使用 NSURLSession 类,所有任务关联 该会话对象要么成功完成,要么收到一个 错误。报亭应用程序启动的下载完成。多数情况 在这种情况下,系统在应用程序被强制退出后不会重新启动它们 用户。一个例外是位置应用程序,在 iOS 8 及更高版本中 在被用户强制退出后重新启动。 但在其他情况下, 用户必须先明确启动应用程序或重新启动设备 该应用程序可以由后台自动启动 系统。
如您所见,唯一的例外是位置应用程序,但这对您没有帮助。 只需处理以下事实,这是一个操作系统限制,您对此无能为力。
【讨论】:
以上是关于当应用程序未运行时,通过静默推送通知在后台更新本地数据库的主要内容,如果未能解决你的问题,请参考以下文章