接続しているサービスは、自己署名証明書を使用しています。開発の目的で、そのチェーンを検証したくありません。
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がマスクされています。
このステートメントをresponseJsonブロックの最後に追加してください。
manager.session.invalidateAndCancel()
ブロックの実行が完了するまでマネージャのオブジェクトが保持されない場合に発生するため、これによりその保持が保証されます。
乾杯!
SessionManager
インスタンスを保持するには、responseJSON
に渡されたクロージャでインスタンスをキャプチャする必要があります。
sessionManager.request("https://sub.url.com/path", headers: headers).responseJSON { response in
let _ = sessionManager // retain
// ...
}
それ以外の場合、sessionManager
はすぐに割り当てが解除され、スコープ外になり、実行中のリクエストはすべてキャンセルされます。
チェックインしてくださいsessiondidReceiveChallenge:
NSURLSession
の実装を委任します。 NSURLSessionAuthChallengeCancelAuthenticationChallenge
がどこかで実行されている可能性があります。
_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()
です。
SessionManager
インスタンスの存続期間を適切に管理する必要があります。最も一般的には、これはシングルトンインスタンスを作成することによって行われます。それ以外の場合、マネージャーがスコープ外に出てdeinit
edされると、未処理のリクエストはすべてキャンセルされます。