私のアプリは、フォアグラウンドでサーバーへのコンテンツのアップロードを開始します。このプロセスには時間がかかる可能性があるため、ユーザーはアプリをバックグラウンドに移行できます。
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 クラッシュが発生しています。私はこれに正しく近づいていますか?