項目中有需求要修改網頁的代理UserAgent:H5頁面需要判斷當前頁面是在微信還是在原生的APP中。剛開始一籌莫展,不知道UserAgent是什么東西,還好有萬能的百度。很快就找到了解決方法。整個項目的UIWebView比較多,所以新建一個UIWebView的基類,然后在基類的初始化方法- (instancetype)initWithFrame:(CGRect)frame里添加以下代碼:
NSString * oldAgent = [self stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString * newAgent = oldAgent;
if (![oldAgent hasSuffix:@"panda"])
{
newAgent = [oldAgent stringByAppendingString:@"/panda"];
}
NSLog(@"new agent :%@", newAgent);
NSDictionary * dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:newAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];
調試的發現,當手機或者模擬器連接Mac調試的時候,H5頁面都能獲得修改后的UIWebView的UserAgent,但是一旦斷開調試模式,真機運行和模擬器運行的時候H5獲得的UserAgent是UIWebView默認的UserAgent。剛開始還以為是NSUserDefaults使用錯誤,在使用NSUserDefaults后加入這句代碼好像也沒有什么用:
[[NSUserDefaults standardUserDefaults] synchronize];
后來查詢了很久都沒有解決辦法。
獲得的默認UserAgent是這個樣子的
Mozilla/5.0 (iPhone; CPU iPhone OS 9_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13E230
然后根據項目需求在原來的代理后面拼接項目名稱
Mozilla/5.0 (iPhone; CPU iPhone OS 9_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13E230/panda
H5頁面獲得的UserAgent都是默認的UserAgent,而不是修改后的UserAgent,后來才查詢出來webView會替換成默認的UserAgent。
后來換了一種解決方式,直接在AppDelegate里面- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions修改默認的UserAgent,這種方式一勞永逸。
UIWebView * tempWebView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString * oldAgent = [tempWebView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString * newAgent = oldAgent;
if (![oldAgent hasSuffix:@"panda"])
{
newAgent = [oldAgent stringByAppendingString:@"/panda"];
}
NSLog(@"new agent :%@", newAgent);
NSDictionary * dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:newAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];
[[NSUserDefaults standardUserDefaults] synchronize];
解決了以上問題,但是至于為什么在每個UIWebView初始化的時候修改UserAgent,H5獲取不到修改后的UserAgent,真的不太清楚,還請了解的大神指點一下。