実際、同期要求は、失敗する前に既存の認証情報をキーチェーンでチェックします。 デフォルトの資格情報が存在する場合はそれを使用します。 ので、例えば、どこかのコードでは、ネットワーク接続をオフに解雇する前に:
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:
を使用することもできます。デリゲートコールバックが提供されたキューで実行されるため、多くの問題が解決されます。それは事をもっと簡単にします!
これも読んで価値があるかもしれない:Five Reasons Synchronous Networking is Bad eskimo1はを聞いて価値のあるものである。)
これは、ユーザーが開始したアクションですか?その場合、sync/asyncに関係なく、レスポンスを解析するだけでなく、それが認証の挑戦であれば、ユーザにユーザ名/パスワードのフォームを提示しますか?私はもっと文脈を提供する必要があると思います。 –