Обратный вызов Alamofire перестает работать после возвращения из фона - PullRequest
0 голосов
/ 04 марта 2019

У меня есть метод, который загружает (видео) данные на сервер, и он выглядит следующим образом:

 static func upload(video data:Data, named name:String, parameters:[String:Any],  toUrl url:URL, progress:@escaping (Double)->Void, completion:@escaping(Bool)->Void){
manager = Alamofire.SessionManager(configuration: URLSessionConfiguration.background("com.app.backgroundtransfer")
        manager.upload(multipartFormData: { (multipartFormData) in

            multipartFormData.append(data, withName: "filedata", fileName: name, mimeType: "video/quicktime")

            for key in parameters.keys{

                if let val = parameters[key] as? String{

                    multipartFormData.append(val.data(using: .utf8, allowLossyConversion: false)!, withName: key)
                }
            }

        }, to: url) {
            (encodingResult) in
            switch encodingResult {
            case .success(let upload, _, _):
                upload.uploadProgress(closure: { (uploadProgress) in

                    progress(uploadProgress.fractionCompleted)
                    //this one stops getting called

                })
                upload.responseJSON { response in
                   // but this one gets called at the end.
                }
            case .failure(let encodingError):
              print(encodingError)
            }
        }
    }

Так что проблема в том, что я не могу должным образом обновить пользовательский интерфейс при возврате из фона (покав середине загрузки).

Почему этот обратный вызов прогресса перестает работать (после возврата из фона)?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Итак, что я сделал, использовал фоновое задание (также сделал это без Alamofire полностью), и это сработало.Например:

 var backgroundTask: UIBackgroundTaskIdentifier = .invalid

    func registerBackgroundTask() {
        backgroundTask = UIApplication.shared.beginBackgroundTask {
            self.endBackgroundTask()
        }
        assert(backgroundTask != .invalid)
    }

    func endBackgroundTask() {
        print("Background task ended.")
        UIApplication.shared.endBackgroundTask(backgroundTask)
        backgroundTask = .invalid
    }

 APIClient.manager = Alamofire.SessionManager(configuration: URLSessionConfiguration.background(withIdentifier: "com.app.backgroundtransfer"))
            self.registerBackgroundTask()

            APIClient.upload(video: video, named: videoDetailsModel.videoURL!.lastPathComponent, parameters: self.uploadParameters, toUrl: url, progress: {[weak self] (percentage) in
                guard let `self` = self else {return}

                print("Progress \(percentage)")
                self.progressBar.progress = CGFloat(percentage)
                }, completion: { [weak self] (success) in
                    guard let `self` = self else {return}
                    if(success){
                        print("Video successfully uploaded")
                        self.endBackgroundTask()
                        self.progressBar.progress = 1.0
                    }else{
                        print("Video upload was not successfull")
                    }
            })

Теперь обратные вызовы прогресса работают нормально, и вы все еще можете использовать Alamofire для упаковки данных multipartformd, как я их использовал, или по любой другой причине, по которой вы их используете.

0 голосов
/ 05 марта 2019

Alamofire не совместим с фоновыми сессиями.Поскольку это API-интерфейс на основе замыканий, который не может быть сохранен, когда приложение переходит в фоновый режим, замыкания хода выполнения не переподключаются, когда приложение заранее.Мы рекомендуем использовать URLSession напрямую или использовать API фоновых задач вместо фоновых сессий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...