You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift:如何通过代码获取Safari的User Agent或Build Version?

关于iOS中WKWebView匹配Safari User Agent的解决方案

问题1:是否可通过代码在APP中获取Safari的User Agent或Build Version?

可以通过SFSafariViewController间接获取Safari的完整User Agent,具体实现思路如下:

  • 初始化临时的SFSafariViewController加载空白页面
  • 页面加载完成后,通过JavaScript执行navigator.userAgent获取UA
  • 完成后立即销毁该视图控制器,避免干扰用户体验

示例Swift代码:

import SafariServices

func fetchSafariUserAgent(completion: @escaping (String?) -> Void) {
    let safariVC = SFSafariViewController(url: URL(string: "about:blank")!)
    safariVC.delegate = self
    
    // 临时添加到当前视图层级
    UIApplication.shared.keyWindow?.rootViewController?.present(safariVC, animated: false)
    
    // 延迟执行确保页面加载完成
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        safariVC.evaluateJavaScript("navigator.userAgent") { result, error in
            safariVC.dismiss(animated: false)
            completion(result as? String)
        }
    }
}

// 实现SFSafariViewControllerDelegate处理完成事件
extension YourViewController: SFSafariViewControllerDelegate {
    func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
        controller.dismiss(animated: false)
    }
}

注:苹果未提供公开API直接读取Safari的UA,这种间接方式是当前可行方案,无需额外用户权限。

问题2:是否有其他API/工具可根据iOS版本返回正确的Safari Build Version?

没有官方API提供iOS版本与Safari Build Version的映射关系,但可以通过维护版本映射表解决:

  • 同一iOS主版本下,Safari的Build Version固定,可通过收集各版本的Safari UA构建映射
  • 通过UIDevice.current.systemVersion获取当前iOS版本,提取主版本号后匹配对应Build Version

示例Swift代码:

func getCorrespondingSafariBuildVersion() -> String {
    let versionMap: [String: String] = [
        "15": "605.1.15",
        "16": "606.1",
        "17": "607.1.40"
        // 后续iOS版本发布后,补充对应Build Version
    ]
    
    let iOSVersion = UIDevice.current.systemVersion
    let mainVersion = iOSVersion.components(separatedBy: ".").first ?? ""
    return versionMap[mainVersion] ?? "604.1" // 默认 fallback 值
}

// 替换WKWebView的User Agent
func configureWKWebViewUA(webView: WKWebView) {
    webView.evaluateJavaScript("navigator.userAgent") { result, error in
        guard let defaultUA = result as? String else { return }
        let safariBuild = self.getCorrespondingSafariBuildVersion()
        // 正则替换UA末尾的Safari版本部分
        let updatedUA = defaultUA.replacingOccurrences(of: #/Safari\/[\d.]*/#, with: "Safari/\(safariBuild)", options: .regularExpression)
        webView.customUserAgent = updatedUA
    }
}

需注意:每次iOS大版本更新后,需验证并更新映射表中的对应关系。

内容的提问来源于stack exchange,提问作者JimmyJammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:05:59