24/7 twenty-four seven

iOS/OS X application programing topics.

UIWebViewでBASIC認証のあるページにアクセスする方法

ブラウザアプリのAppStoreレビューでちょくちょく言及されているので調べてみました。
Undocumented APIを使用するので、審査に通るかは微妙です。
そもそもBASIC認証くらいなら、

http://user:password@www.example.com/

というURLでアクセスすれば認証できるので、使う人がこの形で登録しておけばいいだけのことだと思います。


さて、UIWebViewで認証が必要なページにアクセスした場合、次のデリゲート・メソッドが呼ばれます。

- (void)webView:(id)fp8 resource:(id)fp12 didReceiveAuthenticationChallenge:(id)fp16 fromDataSource:(id)fp20;

引数の型とかをきちんと書くとたぶん下記のようになります。

- (void)webView:(UIWebView *)webView resource:(NSObject *)resource didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)dataSource;

このメソッドの第3引数の認証チャレンジオブジェクト(NSURLAuthenticationChallenge)のsenderに、認証に必要な情報をセットして再試行します。
認証に失敗した場合は、再度このメソッドが呼ばれます。失敗の回数(previousFailureCount)はNSURLAuthenticationChallengeから取得できます。

- (void)webView:(id)webView resource:(id)resource didReceiveAuthenticationChallenge:(id)challenge fromDataSource:(id)dataSource {
    NSURLCredential *credential = [NSURLCredential credentialWithUser:@"user" password:@"password" persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}

実際のアプリケーションでは、ここで認証情報を入力するダイアログを表示するなどして、認証情報を求めることになると思います。


ちなみにMobile Safariでは以下のような専用の認証画面が表示されます。