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

时间:2017-10-24 08:22:01

标签: ios swift uiwebview user-agent

我有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。

1 个答案:

答案 0 :(得分:1)

需要在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:

是的,更改它会更改整个应用中的所有网络视图。为了避免这种情况,你可以......

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替换它。只需添加静态变量defaultUserAgentString即可跟踪默认用户代理。 完成后,使用resetUserAgent()切换回默认用户代理。可能会在处理需要修改后的用户代理的viewWillDisappear(的{​​{1}}上将其添加到ViewController)。