iOS 修改webKit 默認(rèn)的UserAgent??
轉(zhuǎn)載?2017年08月02日 15:41:05
資料:
有個(gè)項(xiàng)目需求订晌,要區(qū)分打開(kāi)H5是在本地APP還是在手機(jī)瀏覽器竖般,前端伙伴說(shuō)需要配合修改默認(rèn)的?UserAgent,以便區(qū)分版扩。
UIWebView方式:
UIWebView*webView = [[UIWebViewalloc] initWithFrame:CGRectZero];NSString*userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];DLog(@"userAgent :%@", userAgent);
WKWebView方式:
// 注意這個(gè)方法是異步的WKWebView*wkWebView = [[WKWebViewalloc] initWithFrame:CGRectZero];[wkWebView evaluateJavaScript:@"navigator.userAgent"completionHandler:^(idresult,NSError*error) {? ? DLog(@"userAgent :%@", result); }];
默認(rèn)UserAgent輸出:
Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H143
微信 iOS版的 :UserAgent
mozilla/5.0 (iphone; cpu iphone os 5_1_1 like mac os x) applewebkit/534.46 (khtml, like gecko) mobile/9b206 micromessenger/5.0
其中micromessenger就是自定義的
方案一,修改全局UserAgent值(這里是在原有基礎(chǔ)上拼接自定義的字符串)
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
UIWebView*webView = [[UIWebViewalloc] initWithFrame:CGRectZero];NSString*userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];NSString*newUserAgent = [userAgent stringByAppendingString:@" native_iOS"];//自定義需要拼接的字符串NSDictionary*dictionary = [NSDictionarydictionaryWithObjectsAndKeys:newUserAgent,@"UserAgent",nil];? ? [[NSUserDefaultsstandardUserDefaults] registerDefaults:dictionary];
}
方案二钢颂,自定義UserAgent值
WKWebView*wkWebView = [[WKWebViewalloc] initWithFrame:self.view.bounds];[self.view addSubview: wkWebView];NSString*customUserAgent =@"native_iOS";[[NSUserDefaultsstandardUserDefaults] registerDefaults:@{@"UserAgent":customUserAgent}];NSURL*url = [NSURLURLWithString:self.strUrl];NSURLRequest*request = [NSURLRequestrequestWithURL:url? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:10.f];[self.wkWebView loadRequest:request];
方案三
self.wkWebView = [[WKWebViewalloc] initWithFrame:self.view.bounds]; __weaktypeof(self) weakSelf =self; [self.wkWebView evaluateJavaScript:@"navigator.userAgent"completionHandler:^(idresult,NSError*error) {? ? ? ? __strongtypeof(weakSelf) strongSelf = weakSelf;NSString*userAgent = result;NSString*newUserAgent = [userAgent stringByAppendingString:@" native_iOS"];NSDictionary*dictionary = [NSDictionarydictionaryWithObjectsAndKeys:newUserAgent,@"UserAgent",nil];? ? ? ? [[NSUserDefaultsstandardUserDefaults] registerDefaults:dictionary];// needs retain because `evaluateJavaScript:` is asynchronousstrongSelf.wkWebView = [[WKWebViewalloc] initWithFrame:strongSelf.view.bounds];? }];? [self.wkWebView loadRequest:request];
在測(cè)試的時(shí)候,發(fā)現(xiàn)方案二殊鞭、三第一次運(yùn)行的時(shí)候遭垛,還是顯示默認(rèn)的值,第二次才會(huì)顯示自定義的值操灿,其中原因還不明锯仪,如有朋友解決麻煩告訴一下,謝謝牲尺。
問(wèn)題:實(shí)驗(yàn)的時(shí)候 工程中 只有方法一 是有效果的卵酪,方法二 三,沒(méi)有產(chǎn)生作用谤碳。希望知道的小伙伴 給出答案
四:補(bǔ)充:實(shí)際應(yīng)用
后期測(cè)試的時(shí)候 由于需求是根據(jù)請(qǐng)求后臺(tái)的接口溃卡,來(lái)判斷tabBarItem的個(gè)數(shù)和標(biāo)題,還有加載的界面數(shù)據(jù)(我的工程是混合開(kāi)發(fā)的蜒简,大部分是網(wǎng)頁(yè))瘸羡,后臺(tái)需要在我請(qǐng)求的時(shí)候,傳遞UA頭來(lái)判斷版本 和返回的數(shù)據(jù)搓茬。而我使用上述第一種方式犹赖,可以修改成功,但是第一次請(qǐng)求這個(gè)接口的時(shí)候會(huì)被AFN 內(nèi)部的UA 修改成默認(rèn)格式的卷仑,
我定義的格式:Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D100 appName_ios_v2.0 appName_ios_v2.0
AFN請(qǐng)求之后峻村,后臺(tái)得到的格式:appName/2.0 (iPhone; iOS 11.2.6; Scale/2.00)
這樣 后臺(tái)得到的格式就和協(xié)商的格式不同了,然后經(jīng)過(guò)實(shí)驗(yàn)?zāi)匚褂昧薃FN 中的AFHTTPSessionManager 類進(jìn)行設(shè)置:
//重定義UA ? ? ? ?創(chuàng)建 一個(gè)?AFHTTPSessionManager 類對(duì)象_session
? ? ? ? NSString *currentVision = [NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"];
? ? ? ? UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
? ? ? ? NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
? ? ? ? NSString *newUserAgent = [userAgent stringByAppendingString:@" yuntuiapp_ios_v"];
? ? ? ? newUserAgent = [newUserAgent stringByAppendingString:currentVision];
? ? ? ? NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
? ? ? ? [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
? ? ? ? [[NSUserDefaults standardUserDefaults] synchronize];
?? ? ? ?[_session.requestSerializer setValue:newUserAgent forHTTPHeaderField:@"User-Agent"];
這樣設(shè)置的話粘昨,在每次請(qǐng)求的時(shí)候 都會(huì)設(shè)定UA ,當(dāng)然了,可能會(huì)有問(wèn)題张肾,但是具體的問(wèn)題后期遇到再補(bǔ)充芭析,暫時(shí)能滿足需求。