UIWebview切换WKWebview背景:
apple将会禁用UIWebview,且给到开发者切换WKWebview的deadline为2020年11月。
原本以为可以无缝切换,还可以带来一波性能提升,可以跟老板吹一下。没想到牛皮刚吹出去,就有海量的bug铺面而来。一部分是由于对WKWebview的特性理解不足,错误调用api导致,另一部分是WKWebview自身的bug(此部分才是最坑的)
WKWebview的特性网上较好的理解:
建议细读,了解完整后再切换
https://www.jianshu.com/p/79e329ff8953
下面介绍一个WKWebview自身的bug:
WKWebview设置userAgent的方式
[self.wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(NSString* _Nullable oldUA, NSError * _Nullable error) {
// modify ua
self.wkWebView.customUserAgent = @"you custom ua";
}];
在大部分iOS系统上都是可以的,但是在iOS12.0、iOS12.1上面,此方法是行不通的,修改ua不生效。
解决方案:
iOS12.0、iOS12.1在用navigator.userAgent获取ua后,然后在同一个webview上修改ua是不生效的。你需要一个假的webview获取ua,然后在真正的webview上在原ua的基础上加上customUserAgent
引自stackOverFlow:https://stackoverflow.com/questions/51356476/ios-12-wkwebview-set-customuseragent-not-work
Once you call navigator.userAgent
, you can never modify it. So you need a fakeWKWebView to get the default UA and set to you truly WKWebView
self.fakeWKWebView = [[WKWebView alloc] init];
[self.fakeWKWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(NSString* _Nullable oldUA, NSError * _Nullable error) {
self.fakeWKWebView = nil;
// modify ua
self.wkWebView.customUserAgent = @"you custom ua";
}];
注意点:这个fakeWKWebview必须用self引用或者在block里用到!否则如果它是一个局部变量,执行到block的时候,它的生命周期已经结束,获取到的oldUA是空的。