在后台状态iOS

时间:2016-11-10 14:47:52

标签: ios swift

当ios应用程序使用URLSession进入后台状态时,是否有任何可能的方法来完成Web服务任务? 我不是试图将一个巨大的文件上传到服务器,而是我试图上传一个4位数的密钥。 我已经尝试了以下方法进行后台任务。

var bgTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {})

出于测试目的,我在循环中调用webservice并记录。当我进入后台模式时,网络服务电话就会卡住。

2 个答案:

答案 0 :(得分:1)

大量上传/下载文件

在iOS 7中推出。

这实际上取决于任务花费多少时间。如果这是一个大的下载或上传任务(例如下载视频),您应该使用NSURLSession和后台配置来执行任务。 iOS系统将处理上传/下载任务。下载完成后,下载的文件将保存到临时文件中(因此您可能需要稍后将其复制到其他位置)。 Downloading in background and waking app when finished

普通网络服务(我认为这就是你想要的)

在iOS 6中推出

对于有限长度操作,您可以使用beginBackgroundTaskWithExpirationHandler。

var task = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler(){}
//do your job (call the service)
//on completion you shouldcall the bellow two lines
UIApplication.sharedApplication().endBackgroundTask(task)
task = UIBackgroundTaskInvalid

无需使用后台配置配置NSURLSession。

答案 1 :(得分:0)

class func generalPost(url: String, postCompleted : (response: String) -> ()) {
        let request = NSMutableURLRequest(URL: NSURL(string: url)!)
        let session = NSURLSession.sharedSession()
        request.HTTPMethod = "POST"
        let dataString = "" 
        request.HTTPBody = dataString.dataUsingEncoding(NSUTF8StringEncoding)

        let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
             let strData = NSString(data: data!, encoding: NSUTF8StringEncoding)                    

             postCompleted(response: strData)                  
        })
        task.resume()
    }

你可以使用

 generalPost(url: "http://stackoverflow.com/") { (response) in
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                UIAlertView(title: "Message", message: response, delegate: nil, cancelButtonTitle: "Ok").show()                
            })
        }