UIWebView User-Agent未正确设置为自定义值

时间:2016-12-21 10:08:55

标签: ios iphone uiwebview swift3 user-agent

如果我们想要从

更改用户代理的值
Mozilla/5.0 (iPhone; CPU iPhone OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72

Mozilla/5.0 (iPad; CPU OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72

即。在iPhone应用程序上,我的应用程序需要设置iPad的用户代理。

我的代码看起来像

class ViewController: UIViewController, UIWebViewDelegate {
    @IBOutlet weak var webView: UIWebView!
    var userAgent:String = ""
    override func viewDidLoad() {
        super.viewDidLoad()
        userAgent = self.webView.stringByEvaluatingJavaScript(from: "navigator.userAgent")!

        let range = userAgent.range(of: "iPhone")

        if range != nil {
            userAgent = userAgent.replacingCharacters(in: range!, with: "iPad")
            userAgent = userAgent.replacingOccurrences(of: "iPhone", with: "")
        }
        userAgent = userAgent.replacingOccurrences(of: "  ", with: " ")

        UserDefaults.standard.register(defaults: ["UserAgent": userAgent])

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.webView.loadRequest(URLRequest(url: URL(string: "http://www.google.com")!))
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        let userAgent = request.allHTTPHeaderFields!["User-Agent"]
        print("\(userAgent)")
        return true
    }

}

在上述情况下,未设置User-Agent并保持默认值

而不是逻辑来操纵字符串看起来像iPad的用户代理,如果我在viewDidLoad中更改并设置硬编码值

UserDefaults.standard.register(defaults: ["UserAgent": “Mozilla/5.0 (iPad; CPU OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72”])

然后它也没有更新。

但如果我硬编码像

UserDefaults.standard.register(defaults: ["UserAgent": “MyValue”])

然后正确设置

任何想法,这里出了什么问题?

2 个答案:

答案 0 :(得分:1)

如果您使用js代码调用iOS浏览器用户代理值,iOS将在此时创建并发送值。因此,您无法在创建后更新用户代理。尝试手动编写所有用户代理,而无需通过javascript调用:

    let manuelUserAgent = "Mozilla/5.0 (iPad; CPU OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72"

    let newUserAgent = "\(manuelUserAgent) YourOpt.Text"

    UserDefaults.standard.register(defaults: ["UserAgent": newUserAgent])

答案 1 :(得分:0)

有一个有趣的锻炼,它帮助我在一个类似的项目:

  • 确实,一旦你获得了http标头的值,你就不能在以后修改它(这是一个错误吗?)
  • 因为你无法获得当前值并对其进行修改
  • 对于webview对象的一个​​实例也是如此。这就是为什么你可以添加一个带有true值的“hidden”属性的临时对象,所以它不会出现在你的GUI中,然后从这个对象中获取值,这样你就可以在原始对象上修改它:

    @IBOutlet var tmpWebView:UIWebView!

    @IBOutlet var webview:UIWebView!

    var newAgent = tmpWebView.stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Added new string"
    UserDefaults.standard.register(defaults: ["UserAgent": newAgent])