1

グランドセントラルディスパッチを多用しています。認証が必要なサーバーの URL 要求を行う必要があります。iOS のアプローチNSURLConnectionは非同期であるため、非同期タスクでの GCD の使用が複雑になります。私が理解しているように、NSURLConnection同期モードをサポートしていますが、これには、要求元の URL にユーザー/パスを埋め込む必要がありますが、それがわからないため意味がありません。ここでのオプションは何ですか?

ありがとう、
ダグ

4

2 に答える 2

0

残念ながら、唯一のオプションは非同期リクエストを使用することです。このメソッドで認証チャレンジを処理する方法はありませんsendSynchronousRequest:returningResponse:error:

于 2012-05-03T20:52:25.880 に答える
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:。デリゲート コールバックは指定されたキューで実行されるため、これにより多くの問題が解決されます。それは物事をはるかに簡単にします!

これも読む価値があるかもしれません:同期ネットワーキングが悪い 5 つの理由 eskimo1 は聞く価値のあるものです ;)

于 2013-02-09T06:31:45.460 に答える