web-dev-qa-db-ja.com

Alamofire:[結果]:失敗:エラードメイン= NSURLErrorDomainコード= -999「キャンセル」

接続しているサービスは、自己署名証明書を使用しています。開発の目的で、そのチェーンを検証したくありません。

Alamofire4でSwift 3を使用します。それに応じてATSを修正しました。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>url.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

接続して評価を無効にするコード。

    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "example.domain.com": .pinCertificates(
            certificates: ServerTrustPolicy.certificates(),
            validateCertificateChain: false,
            validateHost: true
        ),
        "sub.url.com": .disableEvaluation
    ]

    let sessionManager = Alamofire.SessionManager(
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )

    let headers = ["Authorization": "Basic /*...*/"]

    sessionManager.request("https://sub.url.com/path", headers: headers).responseJSON { response in
        print(response.request)  // original URL request
        print(response.response) // HTTP URL response
        print(response.data)     // server data
        print(response.result)   // result of response serialization

        debugPrint(response)

        if let JSON = response.result.value {
            print("JSON: \(JSON)")
        }
    }

DumpPrintからのエラーログ

[結果]:失敗:エラードメイン= NSURLErrorDomainコード= -999「キャンセル済み」UserInfo = {NSErrorFailingURLKey = https://sub.url.com/path 、NSLocalizedDescription = cancelled、NSErrorFailingURLStringKey = https://sub.url.com/path }

URLがマスクされています。

9
Sami M'Barek

このステートメントをresponseJsonブロックの最後に追加してください。

manager.session.invalidateAndCancel()

ブロックの実行が完了するまでマネージャのオブジェクトが保持されない場合に発生するため、これによりその保持が保証されます。

乾杯!

8
Jatin Nandwani

SessionManagerインスタンスを保持するには、responseJSONに渡されたクロージャでインスタンスをキャプチャする必要があります。

sessionManager.request("https://sub.url.com/path", headers: headers).responseJSON { response in
    let _ = sessionManager // retain
    // ...
}

それ以外の場合、sessionManagerはすぐに割り当てが解除され、スコープ外になり、実行中のリクエストはすべてキャンセルされます。

6
mixel

チェックインしてくださいsessiondidReceiveChallenge:NSURLSessionの実装を委任します。 NSURLSessionAuthChallengeCancelAuthenticationChallengeがどこかで実行されている可能性があります。

2
john7ric
_self.getSessionManager().request(urlstring, method: methods, parameters: parameters, encoding: JSONEncoding.prettyPrinted, headers: Header).responseJSON(queue: nil, options: JSONSerialization.ReadingOptions.allowFragments) { (responseObject) in ... .... }.session.finishTasksAndInvalidate()
_

タスクの終了後に無効化のメソッドを配置するだけです。つまり、session.finishTasksAndInvalidate()です。

1
Rajukumar Patel

SessionManagerインスタンスの存続期間を適切に管理する必要があります。最も一般的には、これはシングルトンインスタンスを作成することによって行われます。それ以外の場合、マネージャーがスコープ外に出てdeinitedされると、未処理のリクエストはすべてキャンセルされます。

1
Jon Shier