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
相关产品推荐
相关产品推荐

