后台请求未执行Alamofire Swift

时间:2015-07-31 15:38:06

标签: swift alamofire uiapplicationdelegate background-task backgroundtaskidentifier

我正在尝试在POST,GET等后台进行调用,以便在didReceiveRemoteNotification方法中更加精确,因为它们会在推送通知到达时开始工作。我的问题是,在我打开应用程序之前,所有Alamofire.request都不会在后台模式中调用。我现在有

我正在尝试打开一个会话,但它不会使请求有效。

这些是我想在后台执行的(后台手机)

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

但是它不起作用,即使我在这些请求下面添加代码它也可以工作,但是请求的返回甚至是请求都没有。

1 个答案:

答案 0 :(得分:16)

虽然方法显示“后台配置”,但实际上意味着网络会话已配置为to allow for interruptions and continuation上传/下载。你需要做的是延长应用程序的执行时间,使其即使在后台运行一段时间

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:

如果问题是您的下载方法永远不会被调用,那么这意味着您没有在通知有效负载中发送正确的数据:

  

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