当应用程序未运行时,通过静默推送通知在后台更新本地数据库

是否可以接收静默推送通知(“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() } 

当我发送推送通知时,如果应用程序处于活动状态或在后台,则数据会更新,但如果应用程序根本没有运行,则数据不会更新。

简短的回答: 当应用程序被强制退出(没有运行)时,没有用户交互(几乎)没有办法做任何事情。

有关解释请参阅文档:

  • 处理远程通知 – application:didReceiveRemoteNotification : fetchCompletionHandler :

    使用此方法处理传入的应用程序的远程通知。 与应用程序不同的是:didReceiveRemoteNotification:只在应用程序在前台运行时调用,方法是当您的应用程序在前台或后台运行时调用此方法。 另外,如果启用了远程通知后台模式,系统将启动您的应用程序(或将其从暂停状态唤醒),并在远程通知到达时将其置于后台状态。 但是,如果用户强制退出,系统不会自动启动您的应用程序。 在这种情况下,用户必须重新启动应用程序或在系统尝试再次自动启动应用程序之前重新启动设备

  • 了解您的应用程序何时启动到后台 :

    支持后台执行的应用程序可能会被系统重新启动以处理传入的事件。 如果应用程序由于用户强制退出而被终止,系统会在发生以下事件之一时启动应用程序

    • 对于位置应用程序:系统会收到符合应用程序configuration的传送条件的位置更新。 设备进入或退出注册区域。 (地区可以是地理区域或iBeacon地区。)
    • 对于audio应用程序,audio框架需要应用程序来处理一些数据。 (audio应用程序包括播放audio或使用麦克风的应用程序。)
    • 对于蓝牙应用程序:以中央angular色行事的应用程序会从连接的外围设备接收数据。 以外设angular色行事的应用程序会从连接的中心接收命令。
    • 对于后台下载应用程序:推送通知到达应用程序,通知的有效负载包含值为1的内容可用键。系统在机会时刻醒过来开始下载新内容。
    • 对于使用NSURLSession类在后台下载内容的应用程序,与该会话对象关联的所有任务要么成功完成,要么收到错误。 由报亭应用发起的下载完成。 在大多数情况下,系统在用户强制退出后不会重新启动应用程序。

    位置应用程序是一个例外,iOS 8和更高版本在用户强制退出后重新启动。 然而,在其他情况下,用户必须明确地启动应用程序或重新启动设备,然后系统才能将应用程序自动启动到后台。

正如你所看到的,只有例外的位置应用程序,但这不会帮助你。 只要处理这个事实, 这是一个操作系统的限制,你不能做任何事情。