【问题标题】:How do I change the WKWebview's user agent in OS X Yosemite?如何更改 OS X Yosemite 中的 WKWebview 用户代理?
【发布时间】:2014-12-13 13:59:40
【问题描述】:

如何更改WKWebview使用的用户代理?

对于旧的WebView,我可以编写以下代码来更改用户代理:

[myWebView setCustomUserAgent:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4)
 AppleWebKit/537.77.4 (KHTML,like Gecko) Version/7.0.5 Safari/537.77.4"];

【问题讨论】:

    标签: xcode webview osx-yosemite wkwebview


    【解决方案1】:

    在 Swift 中非常简单。只需将以下内容放入您的 App DelegatedidFinishLaunchingWithOptions

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

    如果要附加到现有代理字符串,则:

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

    注意:您需要卸载并重新安装应用程序以避免附加到现有代理字符串。

    【讨论】:

    • Obj C 怎么样?和Mac?我还会在 mac 上使用 uiwebview 吗?
    • 以上两种方法都适用于 iOS 上的 UIWebView 和 WKWebView。 Micho 在下面的回答提供了可以在 OS X 上与 UIWebView 一起使用的 Objective-C,尽管尚未测试最新的 Xcode 版本以确认它是否仍然无法与他建议的 WKWebView 一起使用
    • 他们没有要求 Swift,也没有要求 iOS。 API 不是 1:1
    • 确实如此,但我在研究如何在 Swift for iOS 中执行此操作时首先遇到了这个问题。随着越来越多的开发人员迁移到 Swift,这个答案提供了一些价值。
    • 救了我的培根,在花了一个下午学习如何实现自定义 NSURLProtocols 之后,这是一个更简单直接的选择。
    【解决方案2】:

    对此我没有答案。但是,到目前为止,我的研究提供了一些建议:

    在 iOS 中,可以像这样为 UIWebView 设置自定义用户代理:

    NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:agent, @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
    

    在 OSX 中,有一个用于 WebView 元素的 setCustomUserAgent 方法可以解决问题。

    但是,这不适用于 WKWebView(至少在 OSX 中)。我也找不到任何来自 Apple 的文档。

    希望有人能帮忙!

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,但设法在WKWebView 上使用loadHTMLStringNSMutableURLRequest 的组合来解决这个问题。

      我对如何调用WKWebView 本身的某些方法的搜索将我引向http://trac.webkit.org/changeset/165594,这意味着有一个私有方法_setCustomUserAgent 可以执行此操作。我对 cocoa/swift 不够精通,无法弄清楚这一点。

      我最终使用了下面的代码,因为我真的只需要获取单个 URL 的内容并显示它,但它在某些方面可能会有所帮助。 它所做的只是将 URL 的内容作为字符串加载到 WKWebView 中,我怀疑您可能会丢失后退/前进导航等,并且它仅适用于初始页面显示,因为 WKWebView 将接管点击和资产加载。

      (请注意,这个例子是用 Swift 编写的,而不是 Objective-C)

      self.webView = WKWebView(frame: webViewRect, configuration: webViewConfig)
      
      //  create the request
      let url = NSURL(string: "https://example.com/")
      let request = NSMutableURLRequest(URL: url!)
      request.setValue("YourUserAgent/1.0", forHTTPHeaderField: "User-Agent")
      
      NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
          let content = NSString(data: data, encoding: NSUTF8StringEncoding)
          self.webView!.loadHTMLString(content!, baseURL: url)
      }
      

      【讨论】:

        【解决方案4】:

        这并不理想,但您可能会实现一个自定义 NSURLProtocol 处理程序来拦截 HTTP 请求并使用您的自定义用户代理标头修改它们。我认为这在 iOS 上不起作用,因为 WKWebView 使请求超出进程并绕过任何已注册的 NSURLProtocols。但它可能适用于 OS X?

        【讨论】:

          【解决方案5】:

          用户在文本字段中输入 URL,您可以使用 NSMutableURLRequest 对象完全控制 NSURLRequest,并为其设置标头字段。

          但是,对于用户在 Web 视图中实际单击的内容,您无法从明显且清晰记录的 Objective-C 领域中控制。 除了 WKWebView 似乎将事情推向 JavaScript 之外,我没有看到任何记录在案的方式。因此,这意味着您可以执行此处发布的操作: Mocking a useragent in javascript? 使用脚本注入 API。

          这就是我不喜欢 WKWebView 的原因。我想喜欢它,但我不想学习用 JavaScript 做所有事情的一半。

          因此,您可以创建一个 WKUserScript 对象来执行此操作,并将其注入时间设置为 WKUserScriptInjectionTimeAtDocumentStart。这将使您能够处理从文档中的页面元素请求的内容,只要页面本身没有加载其他冲突的脚本。

          【讨论】:

            【解决方案6】:

            首先退出 Safari。然后打开终端并粘贴此命令,然后按回车:

            默认写入 com.apple.Safari CustomUserAgent "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/538.46 (KHTML, like Gecko) Version/7.1 Safari/537.85.7\""

            打开 Safari 就完成了。

            要撤消此更改,请关闭 Safari 并将此命令粘贴到终端:

            默认删除 com.apple.Safari CustomUserAgent

            有时可能需要重新启动才能使这些更改生效,不知道为什么,可能是缓存问题。

            【讨论】:

            • 这甚至不是问题。
            猜你喜欢
            • 1970-01-01
            • 2015-05-16
            • 1970-01-01
            • 2015-03-14
            • 2014-12-31
            • 1970-01-01
            • 2015-12-23
            • 1970-01-01
            相关资源
            最近更新 更多