最近有webView的相关需求,需要更改UA来适应我们的前端,但是又得保留原本的UA,所以不能直接覆盖,得追加字段,这个过程中WKWebView坑就比较多,列数一下。
UIWebView更改UA
UIWebView *webview = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *ua = [webview stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
if (ua) {
NSArray *uaComps = [ua componentsSeparatedByString:@" "];
if ([uaComps containsObject:@"Marble"] == NO) {
ua = [ua stringByAppendingString:@" Marble"];
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent": ua}];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
UIWebView很简单就处理完毕,坑多的是WK。
WKWebView
先上完整版:
_webview = [[WKWebView alloc] init];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"www.allhistory.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
[_webview loadRequest:request];
[_webview evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
NSString *userAgent = result;
NSArray *stringArray = [userAgent componentsSeparatedByString:@" "];
if ([stringArray containsObject:@" marble"]) {
return;
}
NSString *newUserAgent = [userAgent stringByAppendingString:@" marble"];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
[[NSUserDefaults standardUserDefaults] synchronize];
}];
坑:
1、wkwebview
必须要先loadrequest
,才能获取和设置成功;
2、由于获取是异步的,所以得持有这个webview
,不然过了这个方法的生命周期,webview
就被释放了,取到的result
为nil
。所以把webview
作为属性持有起来;
3、最后设置完毕别忘了synchronize
同步一下。
网友评论