前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记使用WKWebView修改user-agent在iOS 12踩的一个坑

记使用WKWebView修改user-agent在iOS 12踩的一个坑

原创
作者头像
iminder
修改2018-11-21 10:28:32
9.5K0
修改2018-11-21 10:28:32
举报
文章被收录于专栏:iOSiOS

随着摒弃了对iOS老系统的支持,项目也开始逐步开始转向WKWebView,本想着新系统应该能填一些WKWebView的坑,结果发现还是还是坑不断,这次在iOS12又遇到一个神坑。

下面是我们项目中的代码:

代码语言:txt
复制
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工程里有展示:

代码语言:txt
复制
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了。

  1. 全局更改的话可以在AppDelegate里面把customAgent写到UserDefault里面。
代码语言:txt
复制
//全局更改
let userAgentDic = ["UserAgent" : "custom Agent"]
UserDefaults.standard.register(defaults: userAgentDic)
  1. 局部更改的话,则可以使用UIWebView获取当前UserAgent然后追加,或者定义局部的WKWebview,都是一样的效果
代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档