1

Grand Central Dispatchを多用しています。私は今、認証が必要なサーバーのURL要求を行う必要があります。 iOSのアプローチNSURLConnectionは非同期なので、GCDを非同期タスクに使用するのが難しくなります。私が理解しているように、NSURLConnectionは同期モードをサポートしていますが、これは要求URLにユーザ/パスを埋め込む必要があります。私はそれを知らないので理にかなっていません。私の選択肢は何ですか?iOS。 Grand Central DispatchのコンテキストでURL認証の挑戦を処理するにはどうすればいいですか

おかげで、
ダグ

+0

これは、ユーザーが開始したアクションですか?その場合、sync/asyncに関係なく、レスポンスを解析するだけでなく、それが認証の挑戦であれば、ユーザにユーザ名/パスワードのフォームを提示しますか?私はもっ​​と文脈を提供する必要があると思います。 –

答えて

0

は残念ながら、あなたの唯一のオプションは、非同期要求を使用することです。 sendSynchronousRequest:returningResponse:error:メソッドで認証の問題を処理する方法はありません。

0

実際、同期要求は、失敗する前に既存の認証情報をキーチェーンでチェックします。 デフォルトの資格情報が存在する場合はそれを使用します。 ので、例えば、どこかのコードでは、ネットワーク接続をオフに解雇する前に:

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はを聞いて価値のあるものである。)

関連する問題