背景
Apple公司将会禁用UIWebview,且给到开发者切换WKWebview的截止日期为2020年11月。由于彻底替换WKWebView,所以避免不了产生好多问题,下面说的就是WKWebView自身的bug。
问题
在iOS12.0、12.1系统下,WKWebview设置userAgent是行不通的,前端获取的userAgent还是系统的,并没有获取自定义的。导致原生和h5的交互不生效。其它版本暂未发现,12.2、12.4都是正常的,看来苹果及时修复了这个问题。
代码如下:
//在iOS12.0、12.1通过执行JS的navigator.userAgent更新userAgent不生效
[self.webView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError * _Nullable error) {
newUserAgent = [userAgent stringByAppendingString: customUserAgent];
if (@available(iOS 9.0, *)) {
[self.webView setCustomUserAgent:newUserAgent];
} else {
[self.webView setValue:newUserAgent forKey:@"applicationNameForUserAgent"];
}
}];
解决方案
就是使用的临时的webview来执行JS的navigator.userAgen,在block里面使用自己的webview去修改userAgent。
self.fakeWebview = [WKWebview new];
[self.fakeWebview evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError * _Nullable error) {
newUserAgent = [userAgent stringByAppendingString: customUserAgent];
if (@available(iOS 9.0, *)) {
[self.webView setCustomUserAgent:newUserAgent];
} else {
[self.webView setValue:newUserAgent forKey:@"applicationNameForUserAgent"];
}
}];
- self.fakeWebview来执行JS的navigator.userAgent,影响在12.1、12.0影响fakeWebview,并不影响self.webview.
- self.webview可以获取到self.fakeWebview执行系统的userAgent并且不影响self.webview设置自定义的userAgent。
- self.fakeWebview 使用的全局的主要因为如果它是一个局部变量,执行到block的时候,它的生命周期已经结束,获取到的result是空的。