当接收到推送通知时,在后台执行代码

问题描述:

我试图找出当涉及到后台任务时,iOS上实际可能实现的功能。 我有一个应用程序在后台运行并跟踪设备上的位置更改。当接收到推送通知时,在后台执行代码

现在,是否可以向设备发送推送通知,并让设备将当前位置发送到服务器,而无需用户打开应用程序,以便它在前台运行?

不幸的是,我不这么认为。当您的应用处于暂停(冻结)状态时,推送通知由SO管理,用户需要重新打开该应用。另一种方式是为重要更改创建本地通知,当通知到达您的应用程序的时间最短时,发布数据将不够,但您可以学习一些内容。我会建议你阅读这个关于蓝牙和地理定位的问题link

这是不可能的。这个操作系统有一个原则 - 用户应该知道你(你的应用)做了什么。当您的应用程序被暂停时,您的推送消息将被通知中心收到。让您的应用程序知道发生此事的唯一方法是通过通知中心启动您的应用程序。因此.....

+0

你确定吗?根据这个线程的答案(http://*.com/questions/15225677/ios-push-notifications-update-badge-without-alert)它可能发送空的通知。不会显示任何警报或徽章,并且您可以包含一些自定义词典数据。但是你要说的是,这些数据不会被传送到应用程序,直到应用程序启动?我的应用程序正在运行后台监视位置更改。 – Trj 2013-03-08 07:50:57

+0

没有警报或徽章通知用于将其他自定义词典数据发送到您的应用程序。您的后台工作也是从系统注册,当您的应用程序到达后台时,无法接收推送消息,您的通知是从系统注册的情况,太。 – junkor 2013-03-08 08:10:06

我知道这个问题有点老,但我正在回答那些和我一样,在提问后很久就到达这里的人。

现在,是否可以向设备发送推送通知,并让设备将当前位置发送到服务器,而无需用户打开应用程序,以便在前台运行?

是的。你现在可以做到这一点。我目前在我的应用中做了非常类似的事情。还有一些其他的问题现在可以正确地说明这一点。 This is one

基本上,你必须启用Background ExecutionRemote Notifications。您可以通过转到您的应用的目标来在XCode中执行此操作。打开Capabilities选项卡,启用Background Modes功能并检查清单中的Remote Notifications项目。 (我假设你已经启用了Push Notifications功能)。

有了这个你用来处理前台通知的代码也会在后台为你服务 application:didReceiveRemoteNotification:fetchCompletionHandler方法将在你的应用程序在后台时被调用。 下面是雨燕3.0的样本代码:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { 
    // Print full message. 
    print(userInfo) 
} 

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], 
       fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 

    // Print full message. 
    print(userInfo) 

    completionHandler(UIBackgroundFetchResult.newData) 
} 

你可能想看看这个如何处理在后台网络请求,以便问题(和接受的答案)。 Background request not execute Alamofire Swift

Check our the docs about Background Execution.特别是关于推送通知的部分