iOS之解决iOS12.0、12.1设置userAgent失败问题

背景

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是空的。

你可能感兴趣的:(iOS之解决iOS12.0、12.1设置userAgent失败问题)