【问题标题】:UIWebView User-Agent is not properly set for custom valueUIWebView 用户代理未正确设置自定义值
【发布时间】:2017-05-06 17:21:20
【问题描述】:

如果我们想改变用户代理的值

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 的 User-Agent。

我的代码看起来像

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
    }

}

在上述情况下,用户代理未设置并保持默认值

如果我在 viewDidLoad 中更改并设置硬编码值,而不是像 iPad 的 User-Agent 一样操作字符串的逻辑

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”])

那么就设置好了

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

【问题讨论】:

    标签: ios iphone uiwebview swift3 user-agent


    【解决方案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])
    

    【讨论】:

    • 是的,这是正确的,它有效。了解在初始化 web 视图之前,我们需要在用户默认值中设置用户代理。谢谢。还有一个问题,由于每台设备的用户代理字符串略有不同,我只需要将 iPhone 字符串更改为 iPad 字符串,其余部分与用户代理值中设置的任何默认值相同。
    • 您不能通过编码将字符串更改为其他设备值。因为浏览器总是在更新它们的用户代理值。所以你必须手动设置 iphone 或 ipad 值。检测设备:stackoverflow.com/a/24059373/3116663
    【解决方案2】:

    有一个有趣的练习,它帮助我完成了一个类似的项目:

    • 确实,一旦你获得了一个 http 头的值,你以后就不能修改它(这是一个错误吗?)

    • 因为你无法获取当前值并修改它

    • 对于 webview 对象的一个​​实例是这样。这就是为什么你可以添加一个带有“隐藏”属性的时间对象,它的值是真值,所以它不会出现在你的 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])
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多