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

随着摒弃了对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了。

  1. 全局更改的话可以在AppDelegate里面把customAgent写到UserDefault里面。
//全局更改
let userAgentDic = ["UserAgent" : "custom Agent"]
UserDefaults.standard.register(defaults: userAgentDic)
  1. 局部更改的话,则可以使用UIWebView获取当前UserAgent然后追加,或者定义局部的WKWebview,都是一样的效果
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更好,但是在一些细节处理上,还是需要注意的。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JadePeng的技术博客

使用websocket-sharp来创建c#版本的websocket服务

当前有一个需求,需要网页端调用扫描仪,javascript不具备调用能力,因此需要在机器上提供一个ws服务给前端网页调用扫描仪。而扫描仪有一个c#版本的API,...

80650
来自专栏Alan's Lab

[From Nand to Tetris] 第8章 虚拟机项目 python 实现

为防闲逛至此的看官不知所云: From Nand to Tetris 是一个在线课程,目标是指导学生从 Nand 逻辑门开始从头到尾完成一整套计算机系统。

8520
来自专栏写写代码吃吃瓜

Android使用SurfaceView作为相机预览识图时,视图被拉伸的问题

90480
来自专栏黑白安全

ctf工具包 ctf Toolkit 渗透测试工具包 隐秘数据破解

│ ├── caidao-20160620-www.maicaidao.com.7z

1.1K20
来自专栏有趣的django

21天打造分布式爬虫-Crawl爬取小程序社区(八)

16330
来自专栏杂烩

分布式服务框架之Dubbo整合Spring项目(二)

11420
来自专栏星流全栈

Bulma — 基于Flexbox的CSS框架

18960
来自专栏飞扬的花生

表单样式简单设计

  虽然作为后端程序员,简单的CSS样式还是要会滴,备份下 1.直接贴代码吧: @{ ViewBag.Title = "Index"; Layo...

25360
来自专栏函数式编程语言及工具

Akka(35): Http:Server side streaming

   在前面几篇讨论里我们都提到过:Akka-http是一项系统集成工具库。它是以数据交换的形式进行系统集成的。所以,Akka-http的核心功能应该是数据交换...

23650
来自专栏c#开发者

使用javascript+xml实现分页

今天才开通我的csdn blog,把俺以前的帖子拿出来和大家分享。 基于web的技术中,分页是一个老的不能再老的,但大家津津乐道的问题,随着xml技术的日渐应用...

36780

扫码关注云+社区

领取腾讯云代金券