2

私はフレームワークの使用について誤解をしていますNSURLSession。そのため、AFFramework/Alamofire を使用せずに小さなアプリをゼロから作成することにしました。

ファイルをアップロードするために次の手順を必要とする API があります。

  1. POST ファイルのデータ
  2. 応答を取得 (JSON)
  3. いくつかの json フィールドを投稿しますapi/save

私はそのような設定でバックグラウンドセッションを持っています:

let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("myBackground")
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)

私は2つの方法を実装しました:

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData)

すべてのデータを集計する場所

func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?)

このデータを応答オブジェクトに変換します。私にとって非常に重要な場合、この応答オブジェクト。

アプリがフォアグラウンドにある間はすべて正常に動作しますが、バックグラウンドで問題があります。

ケース1

データのアップロードを開始した直後にアプリがクラッシュしました。WWDCによると、実装する必要があります

func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void)

メソッドでこのハンドラを呼び出しますdidCompleteWithError。しかし、このメソッドを呼び出す前にapi/save、アップロード応答からのデータで呼び出す必要があります。このデータを取得するにはどうすればよいですか?

ケース 2

似たようなケースがほとんどです。アップロードの進行中にユーザーがアプリを停止しました。セッションが私のタスクで動作している間、アプリは数秒でロードされます。セッションが呼び出されるようdidReceiveDataになりましたが、もちろん、一部のデータが欠落しています。このような場合はどうすればよいですか?応答データを復元する方法は?

4

2 に答える 2

0

バックグラウンド セッション コードをテストするには、実際のデバイスでテストすることをお勧めします。NSURLSession のバックグラウンド セッション サポートを使用するアプリを作成する場合、開発プロセスの次の 3 つの明白でないアーティファクトによって混乱しがちです。

  • Xcode からアプリを実行すると、Xcode はアプリを新しいコンテナーにインストールします。つまり、アプリへのパスが変更されます。これにより、NSURLSession のバックグラウンド セッション サポートが混乱する可能性があります。 : この問題は iOS 9 で修正されました。iOS 9 以降で NSURLSession がコンテナ パスの変更を処理しないという問題が発生した場合は、バグを報告してください。
  • Xcode のデバッグは、システムがアプリを一時停止するのを防ぎます。そのため、アプリを Xcode から実行するか、起動後しばらくしてからプロセスにアタッチし、アプリをバックグラウンドに移動すると、アプリはシステムによって中断された状況でも実行を継続します。
  • 同様に、iOS シミュレーターは、アプリの一時停止と再開を正確にシミュレートしません。これは過去に機能していましたが、iOS 8 または iOS 9 シミュレーターでは機能しません。

出典: Apple 開発者フォーラム

于 2016-02-16T09:16:38.703 に答える