随着摒弃了对iOS老系统的支持,项目也开始逐步开始转向WKWebView,本想着新系统应该能填一些WKWebView的坑,结果发现还是还是坑不断,这次在iOS12又遇到一个神坑。
下面是我们项目中的代码:
self.webBridge?.webView.evaluateJavaScript("navigator.userAgent") { [weak self] (result, error) in
if self == nil || error != nil {
return
}
if let userAgent = result as? String, let versionString = CloudDeviceManager.shared().weiyunVersionString {
self?.webBridge?.webView.customUserAgent = userAgent + " Weiyun/\(versionString) (IPhone)"
}
}
代码看着很明白,就是获取当前的userAgent,并且追加一些信息到这个userAgent中,很常用的一个操作。在iOS 10/11上面,这段代码执行都好好的,并且也没什么问题。结果现在在iOS 12beta版本里面突然不生效了,自己追加的userAgent没有添加成功。为了验证下,我在WKWebView的delegate方法webView: didFinishNavigation:里打印customUserAgent和通过js方法获取的userAgent,结果发现两者真的是不一样的,这个在追加的demo工程里有展示:
1. user-agent is Optional("Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) customAgent")
2. user-agent through js is Optional(Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko))
所以,这种设置userAgent的方法在iOS 12是不生效的,猜测原因应该是一旦实例化一个WKWebView并且调用了evaluateJavaScript: 更新其userAgent不生效。但是一旦我们刷新下当前web页面,即调用webview的reload方法,这个customUserAgent就生效了。所以这应该是苹果iOS12系统的一个bug。这里需要换一种方式来设置userAgent了。
//全局更改
let userAgentDic = ["UserAgent" : "custom Agent"]
UserDefaults.standard.register(defaults: userAgentDic)
if let agent = UIWebView.init().stringByEvaluatingJavaScript(from: "navigator.userAgent") {
self.webview.customUserAgent = agent + " customAgent"
}
self.tempWKWebView.evaluateJavaScript("navigator.userAgent") {[weak self] (result, error) in
if let agent = result as? String {
self?.webview.customUserAgent = agent + " customAgent"
}
}
总结:WKWebView虽然性能比UIWebView更好,但是在一些细节处理上,还是需要注意的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。