5

私はこのコードを使用してバックグラウンドセッションを作成していますで回復が遅く、バックグラウンドでNSURLSessionDownloadTask屋台、...フォアグラウンド

let configuration = URLSessionConfiguration.background(withIdentifier: UUID().uuidString) 
    configuration.sessionSendsLaunchEvents = true 
    configuration.isDiscretionary = false 
    self.session = Foundation.URLSession(configuration: configuration, delegate: self, delegateQueue: nil) 

...とダウンロードタスク:

let downloadTask = self.session.downloadTask(with: request as URLRequest)   
    downloadTask.resume() 

をマイ要求オブジェクトは次のようになります。

let request = NSMutableURLRequest(url: someURL) 
    request.httpMethod = "POST" 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    do { 
     try request.httpBody = JSONSerialization.data(withJSONObject: someDictionary, options: JSONSerialization.WritingOptions()) 
    } catch let error as NSError { 
     // logging calls 
    } 

ダウンロード中のリソースは〜20MBのzipファイルです。

フォアグラウンドで4回の同時ダウンロードを実行できますが、問題はありません。予想されるすべてのデリゲートメソッドが呼び出され、転送は通常の速度で完了します。

私が見ている問題は、フォアグラウンドでダウンロードを開始してからホームボタンを押すとダウンロードが停止することがあるということです。私はデバイスを目覚めさせようとしたが、ネットワークは1時間スピンアップし、転送はまだバックグラウンドで完了していない。さらに、アプリをフォアグラウンドに戻すと、転送がすぐに再び開始されることはありません。アプリをフォアグラウンドで約4分間座らせると、目を覚まして再び作業を開始します。彼らは、アプリがバックグラウンドに入ったときの完全なパーセンテージで再開し、完了するまで通常の速度で転送します。決してエラーはありません。転送は最終的には成功です。バックグラウンドでは「離れて」いるだけで、アプリがフォアグラウンドに戻ったときに再開するのは非常に遅いです。

iOS 10を実行しているiPhone 6でテストしています。私はXcodeや外部電源に接続していないため、アプリケーションを寒いです。 WiFiと携帯電話の両方の接続で問題を再現できます。私は、アプリケーションを削除し、それを複数回再読み込みしました。

正常に動作している時間の約20%が原因でこれを追跡できません。私はそれが一貫して機能するか失敗するかの特定の変数セットを発見していません。複数のダウンロードが発生している場合、より頻繁に発生するように見えます。その状況では、すべてのダウンロードが上記の動作を示します。

ご指摘いただければ幸いです!

マット

+0

別のセッション構成を試しましたか?背景のものではない – iWheelBuy

答えて

0

あなたはiOSのバグのような音を記述している行動が、私はしようとするだろういくつかあります:

  • はYESに任意設定してみてください。これにより、バックグラウンドの再起動の速度が制限されます。
  • 誤って、既存のものと同じIDを持つ新しいバックグラウンドセッションを作成していないことを確認してください(イベントを処理するために再起動したときと、完了ハンドラを呼び出した後のみ)。
  • 関連するクラスのサブクラス、特にNSURLまたはNSURLRequestを作成していないことを確認してください。
  • shouldUseExtendedBackgroundIdleModeをYESに設定してみてください。
  • UIBackgroundModesでバックグラウンドフェッチを有効にしてみてください。

最後の2つのいずれも役立たず、もしそうであれば、バグを報告してください。

また、IIRCの場合、バックグラウンドで再起動が多すぎるとアプリが処罰される可能性があるため、バックグラウンドタスクで短期間のリクエストを積み重ねる場合は、そうしないでください。また、アプリがバックグラウンドで再起動されたときにクラッシュすると、それは非常に悪いこともあります。

最後に、ホーム画面に移動していることを確認します。アプリを強制終了した場合(ダブルタップ、スワイプ)、バックグラウンドリクエストは終了します。それが期待される行動です。

これらのヒントが役立たない場合は、bugreporter.apple.comでバグレポートを提出してください。記述していることは予想された動作ではないからです。

関連する問題