甘いものが好きです

iOS App開発時に感じた疑問や課題、その他の雑感などを書いていきます。

UIWebViewのコンテンツ読み込みメソッドで最近はまったこと

UIWebViewには、表示するコンテンツを読み込むためのメソッドとして、次の3つが用意されている。

  • loadRequest:
  • loadHTMLString:baseURL:
  • loadData:MIMEType:textEncodingName:baseURL:

これらのメソッドはコンテンツ読み込みを行うという点では同じだけれど、メソッドに渡す引数の形式が異なるし、挙動が異なる部分もある。Class Reference等に記載がなく、違いに気がつくまでに時間がかかり少々苦労したこともあったので、ここに情報をまとめておく。

back-forward listに影響するのはloadRequest:だけ

UIWebViewのインスタンスメソッドgoBack, goForwardによって、UIWebViewで表示したコンテンツの履歴(back-forward list)を前後にたどることができるのだが、この履歴に影響するのはloadRequest:だけである。loadHTMLString:baseURL:やloadData:MIMEType:textEncodingName:baseURL:による読み込みはback-forward listに影響を及ぼさない。

loadRequest:による読み込みはNSUserDefaultsに設定したUser-Agentの影響を受けるが……

NSURLRequestを読み込む際のUser-Agentを変更するには、以下のようにデフォルトのUser-Agentを設定する方法がある。

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"MODIFIED_USER_AGENT", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"UserAgent"];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

loadRequest:による読み込み処理では、このようなUser-Agent変更の影響を受けるが、NSURLConnectionの通信には影響しない。そのため、次の2つのコンテンツの読み込み方では、サーバが検知するUser-Agentが異なり問題となる場合がある。

  • 直接loadRequest:でWebViewに読み込む方法。
  • いったんNSURLConnectionのsendSynchronousRequest:returningResponse:error:やsendAsynchronousRequest:queue:completionHandler:等でデータをダウンロードしてから、loadHTMLString:baseURL:やloadData:MIMEType:textEncodingName:baseURL:でWebViewに読み込む方法。

後者の方法では、NSURLConnectionを利用した通信を行う際に、NSURLRequestオブジェクトに対して次のように毎回User-Agentを設定しなければならない。

[request setValue:@"MODIFIED_USER_AGENT" forHTTPHeaderField:@"User-Agent"];