【问题标题】:How can I set the "User-Agent" header of a UIWebView in Swift如何在 Swift 中设置 UIWebView 的“User-Agent”标头
【发布时间】:2014-10-06 15:50:40
【问题描述】:

我正在将 Xcode 6 用于带有 Swift 的 iOS 应用程序。我有一个带有嵌入式 UIWebView 的简单 ViewController。您可以在下面找到代码。现在我想更改User-Agent HTTP 标头。我尝试使用NSURLRequestsetValue 方法,但它不起作用(请参阅未注释的行)。有人知道怎么做吗?

import UIKit

class WebViewController: UIViewController {

    @IBOutlet weak var webView: UIWebView!

    override func viewDidAppear(animated: Bool) {
        var url = NSURL(string: "https://www.samplepage.com")

        var request = NSMutableURLRequest(URL: url)

        // request.setValue("Custom-Agent", forHTTPHeaderField: "User-Agent")

        webView.loadRequest(request)
    }
}

【问题讨论】:

    标签: ios swift uiwebview user-agent nsurlrequest


    【解决方案1】:

    这将更改通过“正常”堆栈进行的任何调用的代理。

    斯威夫特 2:

    NSUserDefaults.standardUserDefaults().registerDefaults(["UserAgent": "Custom-Agent"])
    

    斯威夫特 3:

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

    【讨论】:

    • 这里有一个重要的警告:这将修改您的应用程序生成的所有 http 请求的用户代理(至少那些使用 URL 加载系统的用户代理 - NSURLConnection 和朋友)。这包括您应用中的所有 UIWebView,而不仅仅是一个特定的。
    • @FarhadMammadli registerDefaults 通常在 didFinishLaunchingWithOptions 中调用 AppDelegate
    • 在 Swift 3 中,它是 UserDefaults.standard.register(defaults: ["UserAgent": "whatever"])
    • 为什么我们设置UserAgent 时HTTP 标头中有一个连字符,如User-Agent?答案中是否有错字,或者 UserDefaults 是否以某种方式将其转换为正确的标题名称?编辑:试了一下,看起来UserAgent 实际上是正确的。
    • 有没有办法排除特定主机的自定义用户代理或明确使用特定主机?我的问题是,当通过 registerDefaults 使用它时,facebook like-button 不再起作用,因为它似乎在检查 User-Agent。一旦我注释掉 registerDefaults 行,facebook 就可以工作了。我的第一次尝试是检查webView(UIWebView, shouldStartLoadWith: URLRequest, navigationType: UIWebViewNavigationType) 中的请求,但似乎用户代理将始终设置回默认值。
    【解决方案2】:

    如果您想附加到现有的用户代理字符串(有助于帮助动态网页适应用户代理),那么您可以使用以下内容。

    let userAgent = UIWebView().stringByEvaluatingJavaScriptFromString("navigator.userAgent")! + " Custom-Agent"
    NSUserDefaults.standardUserDefaults().registerDefaults(["UserAgent" : userAgent])
    

    【讨论】:

    • 你不应该强制解开用户代理,使用if let会更好。此外,创建 UI 元素来检索属性也不是最好的方法,并且会导致问题(例如在单元测试时)
    【解决方案3】:

    要在假用户代理和原始用户代理之间切换,可以使用我的功能:

    Swift 4

    var originalUserAgent:String? = nil
    let fakeUserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"
    
    func setUserAgent(fake: Bool) {
        if originalUserAgent == nil {
            originalUserAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")
        }
    
        guard let originalUserAgent = originalUserAgent else {
            return
        }
    
        if (fake) {
            UserDefaults.standard.register(defaults: ["UserAgent": fakeUserAgent])
        } else {
            UserDefaults.standard.register(defaults: ["UserAgent": originalUserAgent])
        }
    }
    
    // then use
    setUserAgent(fake: false)
    

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多