【发布时间】:2016-12-12 18:17:39
【问题描述】:
我正在尝试在同一请求中创建图像和视频的后台上传。我为后台任务创建了一个自定义 SessionManager:
let configuration = URLSessionConfiguration.background(withIdentifier: "by.wink.citynews.upload.background")
configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
let sessionManager = Alamofire.SessionManager(configuration: configuration)
然后我使用以下代码发出请求:
func uploadNews(newsCreating: NewsCreating, progressHandler: @escaping (Double)->Void, completion: @escaping NewsCreatingCallback) {
let parameters: [String: String] = ["text" : newsCreating.text, "category" : newsCreating.category.id]
backgroundManager.upload(multipartFormData: { multipartFormData in
for (key, value) in parameters {
multipartFormData.append(value.data(using: .utf8)!, withName: key)
}
newsCreating.images.forEach({ image in multipartFormData.append(image.jpegCompressedData, withName: "images[]", fileName: "\(image.name).jpg", mimeType: "image/jpeg") })
if let video = newsCreating.video {
multipartFormData.append(video.url, withName: "video", fileName: "\(video.name).mp4", mimeType: "video/mp4")
}
}, to: URL(string: "http://api.someapi.com/endpoint")!, method: .post) { encodingResult in
switch encodingResult {
case .success(let uploadRequest , _, _):
// custom response for auto-parsing of json
uploadRequest.responseServiceObject { (response: DataResponse<ServiceResult<NewsReporting, NewsCreatingServiceError>>) in
// (*) alamofire completion, here is the problem.
switch(response.result) {
case .success(let serviceResult):
if serviceResult.success {
completion(.success(serviceResult.response))
} else {
completion(.clientError(serviceResult.errors))
}
case .failure(let error):
completion(.error(error as! CityNewsError))
}
uploadRequest.uploadProgress() { requestProgressHandler in
progressHandler(requestProgressHandler.fractionCompleted)
}
}
case .failure(let error):
print(error)
}
}
}
问题是请求的完成(*),只有在应用程序处于前台时才被调用。似乎当应用程序进入后台时,alamofire 仍然继续上传(因为 URLSessionConfiguration.background),但只有当应用程序再次进入前台时才会调用完成。如果在应用程序处于后台时上传完成,我想显示一个 UNNotification。有可能吗?
【问题讨论】: