背景请求未执行 Alamofire Swift

10

我正在尝试在后台进行像POST、GET这样的呼叫,更准确地说,在didReceiveRemoteNotification方法中,因为它们在推送通知到达时开始工作。我的问题是,直到我打开应用程序之前,所有Alamofire请求都不会在后台模式下调用。到目前为止,我尝试了打开一个session但它无法使请求正常工作。

这就是我想要在后台执行的内容(手机在后台运行)

Alamofire.Manager(configuration: configuration).request(.GET, url, parameters: nil)
                        .responseJSON { (_, _, JSON, _) in
                            //println(JSON)
                                println(JSON)
                REST OF THE CODE 

但是它不起作用,即使我在这些请求下方添加代码也没用,请求的返回甚至请求本身都没有发出。

1个回答

20

虽然方法说“后台配置”,但它实际上是指网络会话已经配置允许中断和继续上传/下载。您需要做的是扩展应用程序的执行时间,使其即使在后台也可以工作。

有一个特别设计用于此目的的beginBackgroundTaskWithExpirationHandler:方法。当您使用它时,您将获得更多时间来执行您需要的操作(在此限制之后,无论如何都会终止您的应用程序,现在您的应用程序会立即终止)。

您可以编写以下方法:

func beginBackgroundTask() -> UIBackgroundTaskIdentifier {
    return UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({})
}

func endBackgroundTask(taskID: UIBackgroundTaskIdentifier) {
    UIApplication.sharedApplication().endBackgroundTask(taskID)
}
当您想要使用它时,只需在开始/完成下载调用时简单地开始/结束任务即可:
// Start task
let task = self.beginBackgroundTask()

// Do whatever you need, like download of the images
self.someBackgroundTask()

...

// End task once everything you need to do is done
self.endBackgroundTask(task)

希望这能帮到你!

编辑1:

如果问题是您的下载方法从未被调用,那么这意味着您在通知负载中没有发送适当的数据:

要使推送通知触发下载操作,通知负载必须包含content-available密钥及其值设置为1。 当该键存在时,系统会在后台唤醒应用程序(或将其启动到后台),并调用应用程序委托的application:didReceiveRemoteNotification:fetchCompletionHandler:方法。 您对该方法的实现应下载相关内容并将其整合到您的应用程序中。 https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html


嗨,谢谢你的回答,但我的问题是如何关联Alamofire会话或者我需要运行哪些请求,因为你写的那些函数可以运行代码,但是请求从来没有返回,甚至在我打开应用之前也没有调用。再次感谢。 - Daniel Romero
看看我的更新答案 - 如果问题是你的方法根本没有被调用,上面的内容应该会有所帮助 :) - Jiri Trecak
1
我知道关于content-available的内容,因为它是一种静默通知。例如,如果我收到推送通知,didReceiveRemoteNotification会被激活,然后我想使用Alamofire发出请求,我的主要问题是当iPhone处于非活动/后台状态(未打开)时,didReceiveRemoteNotification中的代码可以正常工作,但调用或请求不会执行任何操作,然后当我打开应用程序时,它会像应该做的那样运行。 - Daniel Romero
也许你的问题在这里有答案,我建议你去看一下:https://github.com/Alamofire/Alamofire/issues/194 - Jiri Trecak
有运气了吗?@DanielRomero - rclark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接