Ich versuche, einen Hintergrund-Upload von Bildern und Videos in derselben Anfrage zu erstellen. Ich habe einen benutzerdefinierten Sessionmanager für Hintergrundaufgaben:Alamofire Abschluss, wenn App im Hintergrund
let configuration = URLSessionConfiguration.background(withIdentifier: "by.wink.citynews.upload.background")
configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
let sessionManager = Alamofire.SessionManager(configuration: configuration)
Und dann mache ich die Anfrage mit dem folgenden Code:
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)
}
}
}
Das Problem ist, dass die Fertigstellung des Antrags (*), wird nur aufgerufen, wenn App im Vordergrund ist. Es scheint, dass, wenn die App im Hintergrund läuft, alamofire weiterhin hochlädt (wegen URLSessionConfiguration.background), aber die Fertigstellung wird nur aufgerufen, wenn die App wieder in den Vordergrund tritt. Ich möchte eine UNNotification anzeigen, wenn der Upload abgeschlossen ist, während sich die App im Hintergrund befindet. Ist es möglich?
Der viewController mit der Abschlussverriegelung hat ein schwaches Selbst in der Erfassungsliste, aber dieser Ansichtscontroller wird nicht zerstört, wenn die App im Hintergrund läuft. Wenn App im Vordergrund zurückkehrt, wird die Beendigung aufgerufen und die Benachrichtigung erscheint. –