2015-07-19 101 views
2

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

当我发送推送通知,如果应用程序是主动或在后台,数据更新,但如果应用程序没有运行在所有的数据不会被更新。

+0

我写道:我有背景获取和远程通知启用。在能力背景模式我检查他们都 – user5132182

+0

我把一切都回( – luk2302

+0

好吧,有可能做这样的事情吗? – user5132182

回答

1

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

为了说明请参阅文档:

  • Handling Remote Notifications - application:didReceiveRemoteNotification:fetchCompletionHandler

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

  • Understanding When Your App Gets Launched into the Background:支持背景执行

    应用程序可以由系统 被重新启动来处理进入的事件。 如果应用被终止以任何理由 比用户力退出它其他,系统启动应用程序 在以下事件中的一个发生

    • 对于位置信息的应用:该系统接收的位置更新符合 应用程序的配置标准进行投放。输入的设备或 退出注册区域。 (区域可以是地理区域或 iBeacon区域。)
    • 对于音频应用程序,音频框架需要应用程序以 处理一些数据。 (音频应用程序包括播放音频或使用麦克风的应用程序。)
    • 对于蓝牙应用程序:以中心角色 作用的应用程序会从连接的外围设备接收数据。一个以 外设角色行事的应用程序接收来自连接中央的命令。
    • 对于后台下载的应用程序:一个推送通知到达一个应用程序,并 通知的有效载荷包含内容可用密钥 与1系统的值在醒来的瞬间机会的 应用开始下载新的内容。
    • 对于使用NSURLSession类下载 后台中的内容的应用程序,所有与 关联的会话对象成功完成或收到 错误。由报亭应用发起的下载完成。在大多数 的情况下,系统在用户强制退出 之后不会重新启动应用程序。

    一个例外是位置信息的应用,其中在IOS 8及以后的 可由所述用户退出力之后重新启动。在其他情况下,虽然 用户必须明确地启动应用程序或在 之前重新启动设备,但应用程序可由 系统自动启动到后台。

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

相关问题