如何执行alamofire后台上传请求?

Ale*_*nko 5 xcode swift alamofire

我需要将zip文件发送到服务器端。

有我的要求,我需要在后台工作

let configuration = URLSessionConfiguration.default
    configuration.timeoutIntervalForRequest = 10 // seconds
    alamoFireManager = Alamofire.SessionManager(configuration: configuration)

appDeligate.log.debug("request was sended")

    alamoFireManager.upload(deligate.data!,
                            to: deligate.url,
                            method: .post,
                            headers: headers)
        .uploadProgress(closure: {
            progress in
            print("Upload Progress: \(progress.fractionCompleted)")
        })
        .validate()
        .responseJSON {}
Run Code Online (Sandbox Code Playgroud)

现在它可以正常工作,但是我需要在后台执行此操作。根据Alamofire自述文件

https://github.com/Alamofire/Alamofire

它说

使用后台配置创建会话管理器

让配置= URLSessionConfiguration.background(withIdentifier:“ com.example.app.background”)

让sessionManager = Alamofire.SessionManager(configuration:配置)

我更改了配置以对应后台配置

现在看起来像这样

let configuration = URLSessionConfiguration.background(withIdentifier: "com.room.myApp")
configuration.timeoutIntervalForRequest = 10 // seconds
    alamoFireManager = Alamofire.SessionManager(configuration: configuration)

alamoFireManager.upload(deligate.data!,
                            to: deligate.url,
                            method: .post,
                            headers: headers)
        .uploadProgress(closure: {
            progress in
            print("Upload Progress: \(progress.fractionCompleted)")
        })
        .validate()
        .responseJSON {}
Run Code Online (Sandbox Code Playgroud)

我得到错误

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Upload tasks from NSData are not supported in background sessions.'
*** First throw call stack:
(0x18ec511b8 0x18d68855c 0x18f33808c 0x18f33796c 0x18f336e68  0x100ef9218 0x100f05dc8 0x18f336dc8 0x18f3378cc 0x100255890 0x1002518e8  0x100234200 0x100234448 0x100ef9218 0x100f05dc8 0x100233fc4 0x100255290  0x10029d238 0x10029ae4c 0x10029ac34 0x10006dd78 0x100071044 0x100082708  0x10002b310 0x100ef9258 0x100ef9218 0x100f0726c 0x100f08e2c 0x100f08b78  0x18dce32a0 0x18dce2d8c)
libc++abi.dylib: terminating with uncaught exception of type NSException
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

是从我这边还是在库边?

随便问

编辑

有发送流

这是我创建zip文件的方法

internal func madeRequest() {
    DispatchQueue.global().async {
        if self.createZipPhotoDir() {
            self.appDeligate.log.debug("zip dir was created")
            self.serverConnection.makeServerRequest()
        } else {
            self.appDeligate.log.error("can NOT execute createZipPhotoDir()")
        }
    }
}

private func createZipPhotoDir() -> Bool {
    let withContentsOfDirectory: String! = UtilDirectory.pathToMyCurrentAvatarDir.tweak() // "/var/mobile/Containers/Data/Application/739A895E-7BCA-47A8-911F-70FBC812CEB3/Documents/default@domein.com/AvatarPackage/name/"
    let atPath: String! = UtilDirectory.tempZipPath.tweak() // "/var/mobile/Containers/Data/Application/739A895E-7BCA-47A8-911F-70FBC812CEB3/Documents/default@domein.com/tmpZipDir.zip"

    return SSZipArchive.createZipFile(atPath: atPath, withContentsOfDirectory: withContentsOfDirectory)
}
Run Code Online (Sandbox Code Playgroud)

zip文件创建成功

然后我提出服务器请求

required init() {
    configureAlamofireManager()
}

private func configureAlamofireManager() {
    let configuration = URLSessionConfiguration.background(withIdentifier: "com.fittingroom.newtimezone.Fitzz")
    alamoFireManager = Alamofire.SessionManager(configuration: configuration)
}

internal func makeServerRequest() {
    appDeligate.log.debug("request was sended")

    alamoFireManager.upload(deligate.data!,
                            to: deligate.url,
                            method: .post,
                            headers: headers)
        .uploadProgress(closure: {
            progress in
            print("Upload Progress: \(progress.fractionCompleted)")
        })
        .validate()
        .responseJSON {
            [weak self]
            response in

            self?.appDeligate.log.debug("response : \(response)")
            self?.appDeligate.log.debug(String(describing: response.timeline))

            switch response.result {
            case .success(let value):
                self?.appDeligate.log.debug("succes in server connection response")
                let result = self?.getStatusCodeAndData(json: JSON(value))
                self?.deligate.onSuccess(statusCode: result?.statusCode, data: result?.data)
            case .failure(let error):
                self?.appDeligate.log.error("error in UploadingRequest : \(error)")
                self?.deligate.onError()
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

有一种方法可以让我发送数据

internal var data: Data {
    var data = Data()
    let filePath = UtilDirectory.tempZipPath.tweak()

    if let result = UtilFile.exists(path: filePath), result.isFileExist == true, result.whatIsIt == .file {
        if let fileData = FileManager.default.contents(atPath: filePath) {
            data = fileData
            appDeligate.log.debug("*** DATA : \(data) ***")
        } else {
            print("Could not parse the file")
        }

    } else {
        appDeligate.log.error("some ERROR here: file not exist")
    }

    return data
}
Run Code Online (Sandbox Code Playgroud)

mue*_*cha 4

来自后台传输注意事项

仅支持从文件上传任务(程序退出后从数据对象或流上传将失败)。

这意味着它受到 NSURLSession 的限制 - 您需要从文件上传,然后尝试使用文件解决其他错误

更新

appDeligate.log.debug("request was sended")

let tempZipFilePath = UtilDirectory.tempZipPath.tweak()

alamoFireManager.upload(tempZipFilePath,
                        to: deligate.url,
                        method: .post,
                        headers: headers)
Run Code Online (Sandbox Code Playgroud)