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 {}

これで正常に動作しますが、これをバックグラウンドで実行する必要があります。AlamofireREADMEドキュメントによると

https://github.com/Alamofire/Alamofire

それは言う

バックグラウンド構成でのセッションマネージャーの作成

let configuration = URLSessionConfiguration.background(withIdentifier: "com.example.app.background")

sessionManager = Alamofire.SessionManager(configuration: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 {}

そして、私はエラーが発生します

*** 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

私は何が間違っているのですか?

それは私の側からの問題ですか、それともlib側からの問題ですか?

遠慮なく尋ねてください

編集

送信フローがあります

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/[email protected]/AvatarPackage/name/"
    let atPath: String! = UtilDirectory.tempZipPath.tweak() // "/var/mobile/Containers/Data/Application/739A895E-7BCA-47A8-911F-70FBC812CEB3/Documents/[email protected]/tmpZipDir.zip"
    
    return SSZipArchive.createZipFile(atPath: atPath, withContentsOfDirectory: withContentsOfDirectory)
}

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()
            }
    }
}

送信するデータを取得する方法があります

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
}
ムエシャ

バックグラウンド転送の考慮事項から

ファイルからのアップロードタスクのみがサポートされています(データオブジェクトまたはストリームからのアップロードは、プログラムの終了後に失敗します)。

つまり、NSURLSessionからの制限です。ファイルからアップロードしてから、ファイルで他のエラーを解決する必要があります。

更新

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

let tempZipFilePath = UtilDirectory.tempZipPath.tweak()

alamoFireManager.upload(tempZipFilePath,
                        to: deligate.url,
                        method: .post,
                        headers: headers)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

バックグラウンドWebAPIでストアドプロシージャを実行する

分類Dev

バックグラウンドスレッドでSQLクエリを正しく実行する方法は?

分類Dev

iOS-アプリを閉じた状態でバックグラウンドでネットワークリクエストを実行する

分類Dev

Linuxでバックグラウンドで無限にスクリプトを実行する方法は?

分類Dev

バックグラウンドでシェルスクリプトを実行する方法は?

分類Dev

バックグラウンドでbashスクリプトを自動的に実行する方法は?

分類Dev

バックグラウンドスクリプトをリロードする方法は?

分類Dev

J2MEアプリケーションをバックグラウンドで実行する方法は?

分類Dev

閉じたアプリケーションをバックグラウンドで実行する方法は?

分類Dev

PHP:バックグラウンドでバッチスクリプトを実行する方法[Windows]

分類Dev

PHPスクリプトをバックグラウンドで実行する

分類Dev

Pythonスクリプトをバックグラウンドで実行する

分類Dev

symfonyでバックグラウンドプロセスを実行する方法

分類Dev

PythonスクリプトをWindowsバックグラウンドプロセスとして実行する

分類Dev

バックグラウンドプロセスでsshスクリプトを実行する

分類Dev

常に実行されるバックグラウンドアプリに使用する.NETプロジェクト/サービスは何ですか?

分類Dev

バックグラウンドタスクからメインアプリで関数を実行する方法

分類Dev

PHPのバックグラウンド操作を実行する方法/別のリクエストでメソッドを処理する方法は?

分類Dev

アプリがバックグラウンドにあるときにAdmobはリクエストを実行しますか?

分類Dev

遅延バックグラウンド作業を実行する方法に関するインスタントアプリのアドバイス

分類Dev

npmスクリプトからバックグラウンドでhttpサーバーを実行する

分類Dev

SpringMVCフレームワークでバックグラウンドプロセスを実行する方法

分類Dev

バックグラウンドでタスクを実行するiOSアプリケーション

分類Dev

ASPネットコア-バックグラウンドサービスのローカリゼーションを実装する方法は?

分類Dev

バックグラウンドでプロセスを実行し、同じコマンドラインでディレクトリを変更する方法

分類Dev

バックグラウンドプロセスを順次開始するデタッチループを実行するBashスクリプト

分類Dev

バックグラウンドでスクリプトを実行する方法(linux openwrt)?

分類Dev

perlスクリプトをバックグラウンドで実行する方法

分類Dev

バックグラウンドでBashスクリプトを実行する方法

Related 関連記事

  1. 1

    バックグラウンドWebAPIでストアドプロシージャを実行する

  2. 2

    バックグラウンドスレッドでSQLクエリを正しく実行する方法は?

  3. 3

    iOS-アプリを閉じた状態でバックグラウンドでネットワークリクエストを実行する

  4. 4

    Linuxでバックグラウンドで無限にスクリプトを実行する方法は?

  5. 5

    バックグラウンドでシェルスクリプトを実行する方法は?

  6. 6

    バックグラウンドでbashスクリプトを自動的に実行する方法は?

  7. 7

    バックグラウンドスクリプトをリロードする方法は?

  8. 8

    J2MEアプリケーションをバックグラウンドで実行する方法は?

  9. 9

    閉じたアプリケーションをバックグラウンドで実行する方法は?

  10. 10

    PHP:バックグラウンドでバッチスクリプトを実行する方法[Windows]

  11. 11

    PHPスクリプトをバックグラウンドで実行する

  12. 12

    Pythonスクリプトをバックグラウンドで実行する

  13. 13

    symfonyでバックグラウンドプロセスを実行する方法

  14. 14

    PythonスクリプトをWindowsバックグラウンドプロセスとして実行する

  15. 15

    バックグラウンドプロセスでsshスクリプトを実行する

  16. 16

    常に実行されるバックグラウンドアプリに使用する.NETプロジェクト/サービスは何ですか?

  17. 17

    バックグラウンドタスクからメインアプリで関数を実行する方法

  18. 18

    PHPのバックグラウンド操作を実行する方法/別のリクエストでメソッドを処理する方法は?

  19. 19

    アプリがバックグラウンドにあるときにAdmobはリクエストを実行しますか?

  20. 20

    遅延バックグラウンド作業を実行する方法に関するインスタントアプリのアドバイス

  21. 21

    npmスクリプトからバックグラウンドでhttpサーバーを実行する

  22. 22

    SpringMVCフレームワークでバックグラウンドプロセスを実行する方法

  23. 23

    バックグラウンドでタスクを実行するiOSアプリケーション

  24. 24

    ASPネットコア-バックグラウンドサービスのローカリゼーションを実装する方法は?

  25. 25

    バックグラウンドでプロセスを実行し、同じコマンドラインでディレクトリを変更する方法

  26. 26

    バックグラウンドプロセスを順次開始するデタッチループを実行するBashスクリプト

  27. 27

    バックグラウンドでスクリプトを実行する方法(linux openwrt)?

  28. 28

    perlスクリプトをバックグラウンドで実行する方法

  29. 29

    バックグラウンドでBashスクリプトを実行する方法

ホットタグ

アーカイブ