3

私のアプリは、フォアグラウンドでサーバーへのコンテンツのアップロードを開始します。このプロセスには時間がかかる可能性があるため、ユーザーはアプリをバックグラウンドに移行できます。

AFHTTPSessionManager を使用してアップロードを送信しています。

let sessionManager = AFHTTPSessionManager()
sessionManager.requestSerializer.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-type")
sessionManager.POST(urlStr, parameters: params, constructingBodyWithBlock: { (formData) -> Void in
    formData.appendPartWithFileData(dataObject, name: "object", fileName: mimeType == "image/jpg" ? "pic.jpg" : "pic.mp4", mimeType: mimeType)
}, progress: { (progress) -> Void in
}, success: { (task, responseObject) -> Void in
    print(responseObject)
    success(responseObject: responseObject)
}, failure: { (task, error) -> Void in
    print(error)
    if let errorData = error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] as? NSData {
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(errorData, options: NSJSONReadingOptions.MutableContainers)
            failure(error: error, responseObject: json)
        } catch let error {
            print(error)
        }
    }
})

アプリが完了するまでバックグラウンド状態にある間、このプロセスを続行する必要があります。ここには優れたSOの答えがあり、正しい軌道に乗っていますが、いくつかの場所ではまだ暗闇の中にいます。リンクされた回答の「BackgroundSessionManager」クラスを使用して、アップロード呼び出しをこれに変更しようとしました:

BackgroundSessionManager.sharedManager().POST(NetworkManager.kBaseURLString + "fulfill_request", parameters: params, constructingBodyWithBlock: { (formData) -> Void in
    formData.appendPartWithFileData(dataObject, name: "object", fileName: mimeType == "image/jpg" ? "pic.jpg" : "pic.mp4", mimeType: mimeType)
}, progress: nil, success: nil, failure: nil)?.resume()

そして、これを私の AppDelegate に追加しました:

func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
    BackgroundSessionManager.sharedManager().savedCompletionHandler = completionHandler
}

しかし、情報がほとんどないバックグラウンド スレッドで EXC_BAD_ACCESS クラッシュが発生しています。私はこれに正しく近づいていますか?

4

1 に答える 1