アプリ通信のために NSURLConnection から NSURLSession に切り替えていますが、その間に、委任された認証から NSURLCredentialStorage の利用に移行しようとしています。コードを移動しましたが、アプリの起動時に sharedCredentialStorage に defaultCredentials を設定したにもかかわらず、デリゲートで -URLSession:task:didReceiveChallenge が呼び出されています。
以下のログに記録されたメッセージによると、保護スペースは同一です (資格情報のセットアップ時に作成したものと NSURLAuthenticationChallenge によって渡されたもの)。
Register credentials for: <NSURLProtectionSpace: 0x162227c0>: Host:192.168.1.99, Server:https, Auth-Scheme:NSURLAuthenticationMethodDefault, Realm:192.168.1.99, Port:23650, Proxy:NO, Proxy-Type:(null)
Unexpected authentication challenge: <NSURLProtectionSpace: 0x1680ee40>: Host:192.168.1.99, Server:https, Auth-Scheme:NSURLAuthenticationMethodDefault, Realm:192.168.1.99, Port:23650, Proxy:NO, Proxy-Type:(null)
および didReceiveChallenge:(NSURLAuthenticationChallenge*)challenge デリゲート メソッド中:
po [[NSURLCredentialStorage sharedCredentialStorage] defaultCredentialForProtectionSpace:[challenge protectionSpace]]
結果は
<NSURLCredential: 0x1680ff00>: thecorrectusername
https://stackoverflow.com/a/501869/563905は、サーバーが 401 チャレンジで応答すると、NSURLConnection (これは NSURLSession の問題ですか?) が最初に承認のヘッダーをチェックし (セットはありません)、次に、保護スペースの資格情報について NSURLCredentialStorage を調べます。
didReceiveChallenge デリゲートが呼び出される理由がわかりません。デリゲートメソッドを設定していない場合、NSURLSession は資格情報なしでリクエストを再送信するだけです...困惑しています...
編集:手動の資格情報の処理を didReceiveChallenge: メソッドに追加しました。単一の NSURLSession しか使用されていないにもかかわらず、リクエストごとにトリガーされています。