グランドセントラルディスパッチを多用しています。認証が必要なサーバーの URL 要求を行う必要があります。iOS のアプローチNSURLConnection
は非同期であるため、非同期タスクでの GCD の使用が複雑になります。私が理解しているように、NSURLConnection
同期モードをサポートしていますが、これには、要求元の URL にユーザー/パスを埋め込む必要がありますが、それがわからないため意味がありません。ここでのオプションは何ですか?
ありがとう、
ダグ
グランドセントラルディスパッチを多用しています。認証が必要なサーバーの URL 要求を行う必要があります。iOS のアプローチNSURLConnection
は非同期であるため、非同期タスクでの GCD の使用が複雑になります。私が理解しているように、NSURLConnection
同期モードをサポートしていますが、これには、要求元の URL にユーザー/パスを埋め込む必要がありますが、それがわからないため意味がありません。ここでのオプションは何ですか?
ありがとう、
ダグ
残念ながら、唯一のオプションは非同期リクエストを使用することです。このメソッドで認証チャレンジを処理する方法はありませんsendSynchronousRequest:returningResponse:error:
。
実際、同期リクエストは、失敗する前に既存の資格情報についてキーチェーンをチェックします。デフォルトの認証情報が存在する場合は、それを使用します。したがって、たとえば、ネットワーク接続を開始する前のコードのどこかに:
NSURLProtectionSpace *protectionSpace = nil;
NSURLCredential *credential = nil;
// Note that you can't wildcard realm, if your server will present a realm you need that here as well.
protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:@"foo.com" port:80 protocol:@"http" realm:nil authenticationMethod:NSURLAuthenticationMethodHTTPBasic];
// This creates the credential
credential = [NSURLCredential credentialWithUser:user password:pass persistence:NSURLCredentialPersistencePermanent];
// This stores it, in the application keychain.
[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace];
これで、その保護スペースの既定の資格情報として設定され、URL 読み込みシステムは、その保護スペースにアクセスするときにその資格情報を探して使用します。簡単!これが行わないことの 1 つは、SSL ベースの認証 (NSURLAuthenticationMethodClientCertificate および NSURLAuthenticationMethodServerTrust) です。さまざまな理由から、その場合、NSURLConnection では、サーバーとクライアントの信頼を評価するデリゲートを実装する必要があります。ただし、基本的な認証の問題については、上記のコードで設定されています。
しかし、GCD と NSURLConnection に関するより大きな質問に答えるには、選択肢があります。確かに、すべてのブログ投稿に書かれていることを実行し、非同期ブロック内で同期リクエストを使用することもできます。新しい方法を使用することもできますsendAsynchronousRequest:queue:completionHandler:
。デリゲート コールバックは指定されたキューで実行されるため、これにより多くの問題が解決されます。それは物事をはるかに簡単にします!
これも読む価値があるかもしれません:同期ネットワーキングが悪い 5 つの理由 eskimo1 は聞く価値のあるものです ;)