WKWebView设置UserAgent踩坑

通过下面的方法给wkwebview设置自定义useragent,解决了常见的问题,如第一次设置不生效,第一次获取不到原来的useragent等问题

思路如下

单个webview设置:iOS9.0以后,可以设置customUserAgent来单个设置webview的自定义useragent

全局设置:先通过evaluateJavaScript("navigator.userAgent")获取原来的useragent,然后追加自定义useragent,通过UserDefaults.standard.register(defaults: ["UserAgent": newAgent])全局设置

代码如下

import UIKit
import WebKitclass WebViewManager: NSObject {static let shared = WebViewManager()var webView: WKWebView?private var isAddCustomUserAgent: Bool = falsefunc loadHtmlString(_ htmlString: String) {// 单个设置webview的userAgent
//        addCustomUserAgent()
//        webView?.loadHTMLString(htmlString)
//        webView?.evaluateJavaScript("navigator.userAgent") { (oldAgent, error) in
//            guard let oldAgent = oldAgent as? String else {//                print("没取到oldAgent")
//                return
//            }
//            print("设置后的新的user agent:\(oldAgent)")
//        }// 全局设置userAgentaddCustomUserAgent { [weak self] in// 一定要在useragent设置完成后在加载html页面self?.webView?.loadHTMLString(htmlString)self?.webView?.evaluateJavaScript("navigator.userAgent") { (oldAgent, error) inguard let oldAgent = oldAgent as? String else {print("没取到oldAgent")return}print("设置后的新的user agent:\(oldAgent)")}}}
}extension WebViewManager {// 单个webview设置useragentprivate func addCustomUserAgent() {let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""let token = Authentication.shared.user?.accessToken ?? ""let refreshToken = Authentication.shared.user?.refreshToken ?? ""let customUserAgent = ";POSApp;platform=iOS;version=\(version);token=\(token);refreshToken=\(refreshToken)"webView?.customUserAgent = customUserAgent}// 全局设置useragentprivate func addCustomUserAgent(completed: @escaping ()->()) {guard !isAddCustomUserAgent else {print("不再重新设置agent")completed()return}// 这个地方使用evaluateJavaScript的webview一定要添加到界面的,不然取不到oldAgentwebView?.evaluateJavaScript("navigator.userAgent") { [weak self] (oldAgent, error) inlet version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""let token = Authentication.shared.user?.accessToken ?? ""let refreshToken = Authentication.shared.user?.refreshToken ?? ""let customUserAgent = ";POSApp;platform=iOS;version=\(version);token=\(token);refreshToken=\(refreshToken)"guard let oldAgent = oldAgent as? String else {print("evaluateJavaScript取不到旧的agent")let oldAgent = "Mozilla/5.0 (\(UIDevice.current.model); CPU iPhone OS \(UIDevice.current.systemVersion.replacingOccurrences(of: ".", with: "_")) like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"let newAgent = "\(oldAgent)\(customUserAgent)"// 设置global User-AgentUserDefaults.standard.register(defaults: ["UserAgent": newAgent])// 一定要设置customUserAgent,因为全局useragent只会在设置后添加的webview生效self?.webView?.customUserAgent = newAgentself?.isAddCustomUserAgent = trueprint("evaluateJavaScript设置新的agent:\(newAgent)")completed()return}guard !oldAgent.hasSuffix(customUserAgent) else {print("evaluateJavaScript已经设置新的agent")completed()return}let newAgent = "\(oldAgent)\(customUserAgent)"UserDefaults.standard.register(defaults: ["UserAgent": newAgent])// 一定要设置customUserAgent,因为全局useragent只会在设置后添加的webview生效self?.webView?.customUserAgent = newAgentself?.isAddCustomUserAgent = trueprint("evaluateJavaScript设置新的agent:\(newAgent)")completed()}}
}

补充

真是too long too simple (_)v

这样设置有两个个坑
1、切换useragent某些场景下也会失效。
2、第一次安装app,进入webview,设置useragent会失效;

没搞清楚具体原因是什么,但是找到了解决办法:
1、加载时强制不适用任何缓存

let request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData)
webView?.load(request)
webView?.reloadFromOrigin()

2、调用load后再设置一次customUserAgent

webView?.customUserAgent = customUserAgent
loadHTMLString(("\(self.webHostUrlString)\(self.htmlPath ?? "")"))
webView?.customUserAgent = customUserAgent

后来发现完全是多此一举了,其实是web端的bug

3、先获取原来的,再追加

private func addCustomUserAgent(completed: @escaping ()->()) {self.fakeWebView = WKWebView()self.fakeWebView?.evaluateJavaScript("navigator.userAgent") { [weak self] (oldAgent, error) inself?.fakeWebView = nilguard let oldAgent = oldAgent as? String else {let oldAgent = "Mozilla/5.0 (\(UIDevice.current.model); CPU iPhone OS \(UIDevice.current.systemVersion.replacingOccurrences(of: ".", with: "_")) like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"let newAgent = "\(oldAgent)\(self?.customUserAgent ?? "")"self?.webView?.customUserAgent = newAgentcompleted()return}let newAgent = "\(oldAgent)\(self?.customUserAgent ?? "")"self?.webView?.customUserAgent = newAgentcompleted()}}

好了,问题总算比较完美的解决了^ - ^

WKWebView设置UserAgent踩坑相关推荐

  1. POI导出Excel设置背景色踩坑,解决背景色全黑(无效)的问题及指定列添加背景色,自定义颜色

    POI导出Excel设置背景色踩坑,解决背景色全黑的问题及指定列添加背景色,自定义颜色 一.自定义颜色 二.背景色全黑(无效)的问题解决![在这里插入图片描述](https://img-blog.cs ...

  2. Zuul2 超时设置 重试 踩坑

    背景: 承接上一篇博客,针对的ZUUL2的超时 重试机制,踩坑了一下 配置如下 logging:level:root: infodemo-service:ribbon: # ReadTimeout: ...

  3. WKWebView 设置 UserAgent

    一.全局设置UserAgent(必须等completionHandler回调完成才生效) [self.wkWebView evaluateJavaScript:@"navigator.use ...

  4. 相机数据格式设置不对踩坑

    在相机SDK中有一个实例这么写的:设置相机初始化参数时,不知道数据格式的时候设置为16位的 // 不知道当前相机支持哪个非8位的图像数据格式,可以调用函数SetPixelSize16将图像数据格式设置 ...

  5. Mysql视图权限设置的踩坑经历

    1.事件背景 今天临近中午饭点时,开发同事发来需求,在mariadb库创建两个视图,要求指定帐号有只读权限. 很简单的需求,连上服务器,两条grant命令一刷,fulsh privileges 回车, ...

  6. Android踩坑日记:Okhttp设置User-Agent你可能没遇到的坑

    Okhttp设置User-Agent你可能没遇到的坑 Http Header之User-Agent    User-Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User ...

  7. ios html5图片适配,ios UIWebView加载HTMLStr图文,关于图片宽高设置,webView内容实际高度的踩坑问题...

    一.关于UIWebView 与 WKWebView 选取问题 从发布时间看:javascript 2008年7月11日,在新一代iPhone3G正式发售当天,iPhone OS 2.0(iOS 2.0 ...

  8. Antd Vue range-picker 日期初始值设置 与 重置日期踩坑总结

    一.业务场景: 1.用form表单包裹,用的是 Antd Vue range-picker链接 2.创建时间初始值设置为当天的 00:00:00-23:59:59:如下截图: 2.日期选择器如下截图: ...

  9. MUI 宫格组件(grid)怎么取消mui-active背景色?(优先级设置问题)- 踩坑篇

    MUI 宫格组件(grid)怎么取消mui-active背景色?(优先级设置问题) 对比 · 截图如下: 踩坑总结 · 点击取消效果 · 举例: 优先级: background > backgr ...

最新文章

  1. java shell排序算法_【算法】8种排序算法(Java)
  2. android 电话号码标记,强化电话标记功能 360手机卫士3.0安卓版体验
  3. 当滚动条滚动到页面底部自动加载增加内容 ajax,Selenium-完整的ajax加载自动滚动到页面底部...
  4. oracle修改表的owner,Oracle中改变表的Owner和tablespace
  5. 组原5_指令流水线影响因素和流水线分类
  6. git branch -a查看不了所有远程分支
  7. 都要2023年了,Android开发是否还值得入场?
  8. 亚信安全为80%入围中国银行提供安全防护
  9. MySQL数据库图文安装详解及相关问题
  10. mysql 递归查询所有子节点(子部门)返回id集合
  11. elment ui table 点击上下移动表格
  12. 信用评分卡模型总结9:评分卡生成及sas实施
  13. 【电力电子技术课程设计】单相交流调压电路Simulink仿真
  14. 炎炎夏日,漂流去哪漂?评论情感分析告诉你
  15. 亚马逊的逆向工作方法论
  16. 零基础的人可以去大数据培训机构学习大数据开发吗?
  17. 无参考图像的清晰度评价方法
  18. 听说你家产品经理失踪了丨极客官舍
  19. 轮播图制作,详细步骤及 HTML+CSS+JS 完整代码
  20. <textarea >文本域如何换行

热门文章

  1. SpringBoot系列之(三):启动过程
  2. win10专业版 hyper-v 找不到
  3. Latex自定义文档纸张大小
  4. 在记事本上用java写一段代码,程序到底是如何跑起来的?
  5. html5在线学习系统,Canvas LMS 在线学习管理系统
  6. python使用you-get下载视频
  7. CSS RGB颜色设置
  8. 【深度学习】 Designing Network Design Spaces
  9. android+扁平+png,[3.28更新]更好看的扁平化主题 —Flat+ 超全图标
  10. Python动态图见得多了?Excel:亦可赛艇!我可是身经百战了