UIWebView Navigator userAgent 属性 更改为 iOS9 不起作用

UIWebView Navigator userAgent property changing with iOS9 doesn't work

我有 UIWebView,我需要在其中更改 Navigator userAgent 属性。

对于 iOS 版本 10+,下面的代码完美运行:

func webViewDidFinishLoad(_ webView: UIWebView) {
    let script = "window.navigator.__defineGetter__('userAgent', function() " +
    "{ return '+keys +thatIs +neededTo +add'; });"
    webView.stringByEvaluatingJavaScript(from: script)
}

但是对于 iOS9 这不起作用。 有人有什么主意吗? 在 Info.plist 中,我已将 NSAllowsArbitraryLoads 设置为 true。

需要在 UserDefaults 中设置用户代理。 您可以使用以下代码进行设置。

func setUserAgent(as userAgentString: String) {
    UserDefaults.standard.register(defaults: ["UserAgent": userAgentString])
}

用法:

let userAgentString = "USER AGENT STRING HERE"
setUserAgent(as: userAgentString)

编辑:

我看到您想将一些字符串附加到当前的 UserAgent。 为此,您需要读取当前用户代理的值,存储它,添加您的自定义字符串,然后存储新的用户代理。用法保持不变。

func setUserAgent(as value: String) {

    let webView = UIWebView(frame: CGRect(width: 0, height: 0))
    let defaultUserAgentString = webView.stringByEvaluatingJavaScript(from: "navigator.userAgent")

    UserDefaults.standard.register(defaults: ["UserAgent": defaultUserAgentString + " " + value])
    // remove the " " space if you don't need it
}

编辑 2:

是的,更改它会更改您应用中的所有 Web 视图。为避免这种情况,您可以...

func setUserAgent(as value: String) {

    let webView = UIWebView()
    Constants.defaultUserAgentString = webView.stringByEvaluatingJavaScript(from: "navigator.userAgent") ?? ""

    UserDefaults.standard.register(defaults: ["UserAgent": defaultUserAgentString + " " + value])
}

func resetUserAgent() {

    if let defaultString = Constants.defaultUserAgentString {
        UserDefaults.standard.register(defaults: ["UserAgent": defaultString])
    }
}

Constants这里有一个struct/class用来存放全局常量,有的话可以换成自己的struct/class。只需添加静态变量 defaultUserAgentString 来跟踪默认用户代理。 完成后使用 resetUserAgent() 切换回默认用户代理。也许将它添加到 ViewController 上的 viewWillDisappear() 处理需要修改的用户代理的 WebView