2011年10月15日

UIWebView自定user agent

不知道忙什麼一個月就過去了
記錄一下有關自訂user agent的問題

一般request的自訂user agent可經由NSMutableURLRequest的函式達到:[request setValue:userAgentString forHTTPHeaderField:@"User-Agent"];
自訂一般UIWebView的request基本上也可以先定義好request後再由webview loadRequest:載入即可但如果要保有UIWebView裡原本request的user agent,再加入自訂的值,事情就比較麻煩一點
UIWebView預設的user agent大概長這樣:
Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/534.32 (KHTML, like Gecko) Mobile/8F190
一些值可能會隨版本而變動,可參考Safari Web Content Guide
UIWebView有個delegate很重要:
- (BOOL) webView: (UIWebView *)webView shouldStartLoadWithRequest: (NSURLRequest *)request navigationType: (UIWebViewNavigationType)navigationType
所有的request都會觸發這個delegate
所以可以用這個delgate來動態取得user agent
整個流程大概是:
1.第一次先另外建立一個小WebView,用途是取得UIWebView原本的user agent,不載入網頁
2.把user agent字串存入NSUserDefaults以便以後可以使用
3.隨即在delegate函式中alloc真正要用的WebView,load自訂過的user agent

一個關鍵在於:WebView一旦建立後,每次都會到神秘的地方取回預設的user agent
所以在delegate中再怎麼自訂user agent都是做白工
為了每次開啟都即時取得預設的user agent,第一點中的webView就得另外建(而且還要addsubview,request才會真的load)
簡單來說可以這樣寫:
- (BOOL) webView: (UIWebView *)webView shouldStartLoadWithRequest: (NSURLRequest *)request navigationType: (UIWebViewNavigationType)navigationTypeif (![[NSUserDefaults standardUserDefaults]objectForKey:@"UserAgent"]) {//如果沒有存預設user agent
        request=[self getUserAgentByRequest:request];
        NSDictionary *UADic=[NSDictionary dictionaryWithObject:[request valueForHTTPHeaderField:@"User-Agent"] forKey:@"UserAgent"];
        [[NSUserDefaults standardUserDefaults]registerDefaults:UADic];
        [webView removeFromSuperview];
        //真正載入網頁
        [self buildWebViewByRequest:request];
   }
    else{
        [self buildWebViewByRequest:requestObj];
    }
}
下略

然後在buildWebViewByRequest中,把得到的user agent存成NSString(此為userAgentString)

再用前面提到的:setValue:userAgentString forHTTPHeaderField:@"User-Agent"來設定並掛上自己要的user agent內容

而在return No前馬上載入新的webView是為了不讓使用者感覺等太久。
如此一來,就可以不用在程式中寫死user agent,藉由每次得到預設的webView user agent,又可以掛上自己需要的內容了

沒有留言: