記錄一下有關自訂user agent的問題
一般request的自訂user agent可經由NSMutableURLRequest的函式達到:[request setValue:userAgentString forHTTPHeaderField:@"User-Agent"];
自訂一般UIWebView的request基本上也可以先定義好request後再由webview loadRequest:載入即可但如果要保有UIWebView裡原本request的user agent,再加入自訂的值,事情就比較麻煩一點
UIWebView預設的user agent大概長這樣:
一些值可能會隨版本而變動,可參考Safari Web Content Guide
所有的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)
簡單來說可以這樣寫:
再用前面提到的:setValue:userAgentString forHTTPHeaderField:@"User-Agent"來設定並掛上自己要的user agent內容
而在return No前馬上載入新的webView是為了不讓使用者感覺等太久。
如此一來,就可以不用在程式中寫死user agent,藉由每次得到預設的webView 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,又可以掛上自己需要的內容了
沒有留言:
張貼留言