[iPhone] UIWebview user agent 변경하기

이번에 아이폰 앱을 개발하면서 user agent를 변경해야 할 일이 생겼다.

안드로이드는 메소드가 있어서 쉽게 변경이 되지만(webView.getSettings().setUserAgentString(userAgent))
 iOs는 방법을 찾기가 어려웠다

구글링해서 나온 여러가지 방법을 시도해 봤지만 모두 변경에 실패했다.

간혹 앱 안에서는 변경이 되는 경우도 있었지만, 실제로 서버에 전달된 agent는

역시 변경전의 값이었다

성공 여부와 상관없이 확인한 방법은 크게 4가지였다

1. webview 의 request에 직접 user-agent를 지정하는 방법
http://stackoverflow.com/questions/478387/change-user-agent-in-uiwebview-iphone-sdk
http://chaosinmotion.com/blog/?p=224

2. PerformSelector를 이용하는 경우
http://bongdal.tistory.com/66

3. method swizzling을 이용
http://www.icab.de/blog/2010/04/07/changing-the-headers-for-uiwebkit-http-requests/
http://blog.sallarp.com/uiwebview-user-agent-weirdness-and-how-to-change-user-agent-value-programmatically/

4. NSUserDefaults 에 값을 세팅 하는 방법(이 방법은 도대체 어떻게 알아냈을까?)
http://www.mphweb.com/en/blog/easily-set-user-agent-uiwebview


구글링 해보면 1번 방법이 가장 많이 나오는것 같다.

이 방법은 NSLog로 찍어보면 변경되는 것 같지만,

실제로 서버에는 변경된 agent가 전달되지 않는다


2번은 private API로 리젝사유가 된다고 해서 시도해 보지 않았다.


3번이 가장 확실한 것처럼 얘기들을 하는데, 역시 실패했다.

두번째 URL에 있는 샘플 소스를 다운받아서 테스트 해봤지만

역시 서버에는 변경전의 agent가 전달됐다.


4번은 초기에 시도해 보고 변경되는 걸 확인은 했는데 원하던 방법이 아니었다.

원래 기기가 가지고 있는 agent에 문자열을 추가하는 방법으로 변경하길 원했는데,

이 방법은 원래 agent를 확인할 수가 없었다.

기본 agent를 확인하는 방법은

http://blog.sallarp.com/iphone-ipad-get-user-agent-for-uiwebview/

이 방법을 사용했는데,

이렇게 하면 NSUserDefaults에 값을 세팅하는게 의미가 없어진다.
(shouldStartLoadWithRequest에서 agent가 고정으로 세팅돼 버린다)


이 방법은 안되는 걸로 생각해서 다른 방법만 찾았는데,

도저히 찾을수가 없었다.

그러던중 우연히 기본 agent 가져오는 다른 소스를 발견하고 적용했는데

너무 쉽게 처리가 됐다.

http://stackoverflow.com/questions/3297733/how-to-get-uiwebview-user-agent

webview의 stringByEvaluatingJavaScriptFromString으로

자바스크립트에서 agent를 가져오는 방법이다.

알고나면 간단한데.. 이걸 몰라서 헤맨걸 생각하니 억울하다.


UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString* secretAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];

NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:secretAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];
[dictionnary release];
[webView release];

이 코드를 main controller 이나 app delegate에 삽입하면 된다.

성곡적으로 원하는 대로 잘 된다. 이제 리뷰만 통과하면 된다.

설마 리젝되진 않겠지...

Posted by incree

2012/04/07 18:03 2012/04/07 18:03
, ,
Response
0 Trackbacks , 2 Comments
RSS :
http://www.incree.com/tc/incree/rss/response/109

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다