武之新
UIWebViewでUser-Agentを変更する

UIWebViewでサイトをみると、User-AgentがSafariと違うため、一部のサイトでは iPhoneであると認識できずにPCサイトに連れていかれてしまいます。(Yahooとか)

ちょっと前までは

- (BOOL)webView:(UIWebView *)webView 
shouldStartLoadWithRequest:(NSURLRequest *)request 
 navigationType:(UIWebViewNavigationType)navigationType
{
	NSMutableURLRequest *req = (NSMutableURLRequest*)request;
	[req setValue:USER_AGENT_STRING forHTTPHeaderField:@"User_Agent"];
	return YES;
}	

でよかったようですが、iOS4.2でやってみると期待通りには動いてくれませんでした。 色々やってみたところ、

-(NSURLRequest*) uiWebView:(id)webView 
				  resource:(id)identifier 
		   willSendRequest:(NSURLRequest *)request 
		  redirectResponse:(NSURLResponse *)redirectResponse 
			fromDataSource:(id)dataSource
{
	NSMutableURLRequest *req = (NSMutableURLRequest*)request;
	[req setValue:USER_AGENT_STRING forHTTPHeaderField:@"User-Agent"];

	return req;
}

とやると期待通りになってくれるようです。

これはUIWebViewWebViewDelegateというprotocolで、WebViewDelegateと同じ内容を 備えている非公開protocolのようです。非公開なのでこれを使って審査が通るかどうかは 未知数ですが、UIWebViewWebViewDelegateを使うと色々便利なことが出来るので、 いま作ってるアプリではバリバリ使ってみてます。 審査が通るといいなぁ。

UIWebViewWebViewDelegateは非公開なので

#import <UIKit/UIKit.h>

とやっても宣言に含まれてきません。 なので@interfaceは普通に

@interface HogeViewController : UIViewController<UIWebViewDelegate>

とだけやっておいて、.m で知らん顔して実装してしまえばUIWebViewが呼び出してくれます。=D もちろんUIWebViewのdelegateにHogeViewControllerを設定するのは必要です。