0

次のコードを実行してアプリをバックグラウンドにすると、ダウンロードは続行されます。最後に、ダウンロードが完了すると、正しいコールバックを取得できます。

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億。

4

3 に答える 3

0

私が見る主な問題は、あなたがcompletionHandler2 回電話をかけていることです。次のように content-type 条件から戻る必要があります。

if contentType == "image/jpeg" {
    //change the data task to download task
    completionHandler(.BecomeDownload)
    return
}

そうでなければ、ロジックを正しく使用しているように見えます。それが役立つことを願っています。

于 2016-05-08T01:55:10.093 に答える
0

Xcode->Target->Capabilities->On Background Mode で Background Mode を有効にし、オプション Background Fetch を選択します。

于 2016-05-07T17:38:17.617 に答える