次のコードを実行してアプリをバックグラウンドにすると、ダウンロードは続行されます。最後に、ダウンロードが完了すると、正しいコールバックを取得できます。
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(SessionProperties.identifier)
let backgroundSession = NSURLSession(configuration: configuration, delegate: self.delegate, delegateQueue: nil)
let url = NSURLRequest(URL: NSURL(string: data[1])!)
let downloadTask = backgroundSession.downloadTaskWithRequest(url)
downloadTask.resume()
しかし、私には要件があります。つまり、サーバーが返すものを判断する必要があります。それがjsonの場合、ダウンロードは行わないため、最初に応答ヘッダーを取得し、ダウンロードする必要がある場合は、データタスクをダウンロードタスクに変更したので、次のコードのようにしました
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(SessionProperties.identifier)
let backgroundSession = NSURLSession(configuration: configuration, delegate: self.delegate, delegateQueue: nil)
let url = NSURLRequest(URL: NSURL(string: data[1])!)
//I change the downloadTaskWithRequest to dataTaskWithRequest
let downloadTask = backgroundSession.dataTaskWithRequest(url)
downloadTask.resume()
次に、コールバックで応答ヘッダーを取得できます。ファイルをダウンロードする必要がある場合は、次のようにデータ タスクをダウンロード タスクに変更できます。
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
if let response = response as? NSHTTPURLResponse {
let contentType = response.allHeaderFields["Content-Type"] as! String
if contentType == "image/jpeg" {
//change the data task to download task
completionHandler(.BecomeDownload)
return
}
}
completionHandler(.Allow)
}
ここまでは順調ですね。アプリをフォアグラウンドで実行すると、思った通りの効果が得られます。しかし、アプリがバックグラウンドで実行された後、ダウンロードが停止し、アプリを開くと、コンソールに「バックグラウンド転送サービスへの接続が失われました」と表示されます。
Apple はとても賢く、便利なコールバックをたくさん提供してくれると思っていましたが、どこが間違っているのかわかりませんでした。また、AFNetworking と Alamofire に関するソース コードも見ましたが、参照しているものは見つかりませんでした。
それも一般的な要件だと思いますが、インターネット上で役立つ情報を見つけることができません。奇妙すぎます。
だから、あなたが私を助けてくれることを願っています、ありがとう、10億。