2013-10-04 14 views
18

新しいiOS7 API(NSURLSession)でバックグラウンドダウンロードに関するAppleのドキュメントを読んだ後、少し失望しています。私はAppleがバックグラウンドでネットワークの可用性を一時停止/再開を管理していたことを確認した(あるいはそうするためのオプションを提供)が、無...NSURLSession background download - ネットワーク障害で再開

だから、これは我々が持っているもので、ドキュメントを読ん:

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/URLLoadingSystem/NSURLSessionConcepts/NSURLSessionConcepts.html

When any task completes, the NSURLSession object calls the delegate’s URLSession:task:didCompleteWithError: method with either an error object, or nil if the task completed successfully. If the task is a resumable download task, the NSError object’s userInfo dictionary contains a value for the NSURLSessionDownloadTaskResumeData key. Your app should use reachability APIs to determine when to retry, and should then call downloadTaskWithResumeData: or downloadTaskWithResumeData:completionHandler: to create a new download task to continue that download. Go to step 3 (creating and resuming task objects).

は、これまでのところ私は解決策を理解し、私の質問は:ネットワークの損失を処理し、バックグラウンドでダウンロードを再開するのが最適です何アーキテクチャ?

私の側では、到達可能性を使用しており、ネットワークが利用可能になるたびに、ネットワークを失ったときにすべてのタスク(作成時にNSArrayで参照されます)を再開します。これは、フォアグラウンドで正常に機能しますが、バックグラウンドのために、私は以下の点に役立つ必要があります:私のアプリがフォアグラウンドには接続していない場合は

  • 、私は接続せずに、バックグラウンドに行けばすべての私の作業中断としませんままにネットワークが利用可能な場合は戻ってきました...

  • バックグラウンドでネットワークが失われると、すべてのダウンロード/タスクが停止します。 シナリオ:フォアグラウンドで

    • 、私は私がバックグラウンドに行くと10Sは、「aireplanモード」
    • に切り替えた後ですべての私のタスクはエラーを得た私のタスク
    • のダウンロードを開始します。だからメソッドURLSessionで:タスク:didCompleteWithError: downloadTaskWithResumeDataを使用して再開しますか(できない場合はいくつかが 十分なレジュームデータを持っていないため)私はそれを再開せずに新しいタスクを作成しています当時)。
    • は、それから私は、私はこれらの点に対処するにはどうすればよい...私は、バックグラウンドでまだだように、ネットワーク、アプリケーションを起動せずに帰ってきたとき、私は「再開」をトリガーすることができません

を無線LANを設置しました?私は何かを逃したか?

+0

私はあなたの失望を共有します。あなたはこれについてAppleからの答えを待っていると言います。あなたは彼らから聞いたことがありますか?解決策とは何ですか? – gavdotnet

+0

アップルとの交換は多かったが生産的ではなかったため、これらのケースを世話するべき裁量旗を使用することが推奨される。このモードは私の目標ではありませんでしたが、私はこれにほとんど焦点を当てませんでしたが、私のテストは成功しませんでした。この部分についてテストしたことがあれば、まだ情報を得るのは興味深いでしょう。 – Gros

答えて

3

私は、ネットワーク、アプリケーションを起動せずに帰ってきたとき、私は「再開」をトリガーすることができない背景にはまだだとして...


アプリがフェッチによって起動されたときに、「背景フェッチ」を使用することができ、ネットワークを確認してダウンロードタスクを再開することができます。

+0

これは回避策になる可能性があります...現在、Appleからの回答を待っています。 – Gros

+0

@Grosこれについてアップルから回答がありましたか?私は同じ問題を抱えている。 – Keith

+0

これに関するいかなる言葉ですか? – Siriss

2

バックグラウンド設定でNSURLSessionを作成する必要があります。タスクがバックグラウンドデーモンに送信され、完了するとアプリケーションが呼び出されます。

2

実装:アプリのデリゲートで

application:handleEventsForBackgroundURLSession:completionHandler: 

は - completionHandlerを呼び出さずに - 一時停止しながら、デバイスが接続を失った後、アプリがバックグラウンドでたむろする原因となります。こうすれば、ネットワーク接続がもう一度利用可能になったときでも、アプリは到達可能性の通知を聞き取り、ダウンロードを再開できます。しかし、これはかなり厄介なアプローチであり、アップルのApp Storeの提出ガイドラインに合格しない可能性があります。さらに、アプリケーションがフォアグラウンドになっている間に接続が失われ、アプリケーションが中断されている間に接続が回復した場合、この方法はあまり役に立ちません。

  • がバックグラウンドで私のダウンロードを一時停止するapplication:handleEventsForBackgroundURLSession:completionHandler:通知を利用した:私は次のようでした最後に

  • 間欠的なバックグラウンドフェッチ通知(つまり、application:performFetchWithCompletionHandler:completionHandler)を使用して接続状態を確認し、一時停止したダウンロードを再開します。 (ハットチップ@gugupluto)

これはまだ最適なダウンロードパフォーマンスを提供せず、ユーザーがアプリケーションを再オープンした後に「バックグラウンドダウンロード」がなぜ終了しなかったのか疑問に思うかもしれませんが、私たちがAppleにとって今のところ望むことができる最高のものです。

+0

私が知る限り、アプリケーションには、渡された補完ハンドラを呼び出すために一定の時間(約30秒)が与えられ、それをしなければ、ウォッチドッグで殺される*デバッグされた、すなわちXcodeを介して起動されると、いくつかの開発者が完了ハンドラを無視すると思うようになる可能性があります。 –

+0

@oscahieそれは理にかなっていましたが、これは私がiPad 4th genでテストしたときに目にしたものではありませんでした。アプリは無期限にバックグラウンドに留まり、ネットワーク到達可能性の通知に応答しました。 – gavdotnet

関連する問題