【问题标题】:Cocoa webview UserAgent "webkit-legacy" issueCocoa webview UserAgent“webkit-legacy”问题
【发布时间】:2015-11-23 19:37:16
【问题描述】:

我解决了这个问题。看看下面选择的答案!

我一直在努力寻找导致 OSX Cocoa 应用程序的 WebView 与 Safari 的行为不同的原因。事实证明,用户代理是不同的(很明显?),而我正在访问的网站不知道如何处理。

令人惊讶的是,它是https://messenger.com(Facebook 聊天)。

问题是它没有在屏幕上显示图片。它确实加载,但实际上并没有显示。看看这个。。

如果您查看我编号为“2”的区域,您只会看到空白区域。我没有对此进行审查。它只是空的。

这是我原来的问题链接:Simple Swift Cocoa app with WebKit: Upload picture doesn't work

我解决了第一个问题(感谢答案:D),但第二个问题仍然存在。

  1. 共享图片不显示 - 我在图片中标记为 2。
    • 再次,从其他浏览器或发布的应用程序中,它显示了我与参与者共享的图片,如下所示。 (当然我审查了图片)

为了调试这个,我打开了 Inspect Element,我发现了这个。

<body class=" webkit-legacy webkit mac x1 body_textalign Locale_en_US _z4_" dir="ltr">

当我从 Safari 加载完全相同的页面时,我会看到:

<body class="safari webkit mac x1 body_textalign Locale_en_US _z4_" dir="ltr">

所以我决定从我的应用程序的 WebView 中替换该行,中提琴!有用!所以...

TLDR:如何在每次加载视图时进行这项工作?

我试图找到一些方法来将我的用户代理设置为 Safari,但我无法让它工作。请问有什么建议吗?

【问题讨论】:

  • hmm.. 我的问题甚至可能不是那个.. 当我从 Safari 更改该行(从 safari webkit... 到 webkit-legacy webkit...)时,它工作得非常好..啊啊啊……css的世界……-_-
  • 你使用的是 UIWebView 还是 WKWebView?
  • 我正在使用 UIWebView
  • 这可能只是他们的浏览器检测和 CSS 的问题。您可能想使用 UIWebView 委托的webViewDidFinishLoad: 方法,然后stringByEvaluatingJavaScriptFromString: 执行一些Javascript 来修复body 上的class
  • 或者,您可能想尝试 WKWebView(不确定它在 OS X 上是否可用),它使用不同的 WebKit 版本,可能会以不同的方式检测到。

标签: css swift macos cocoa webkit


【解决方案1】:

我创建了简单的示例应用程序并修复了这个问题。我提供了与 Safari 相同的用户代理。之后,共享照片按预期工作。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.webView.customUserAgent = @"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7";
    self.webView.mainFrameURL = @"https://messenger.com";
}

之后,我比较用户代理:

原始 WebView 用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko)

Safari 用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7

所以,看来我只需要更改用户代理的最后一部分。像这样:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.webView.applicationNameForUserAgent = @"Safari/601.2.7";
    self.webView.mainFrameURL = @"https://messenger.com";
}

使用此代码,共享照片也可以使用。不幸的是,它不适用于我尝试过的其他 applicationNameForUserAgent 值。

【讨论】:

  • 嗯,我试过这个,它并没有真正做任何事情。我终于通过将document.body.className 编辑为我发现正在工作的内容来解决它。感谢您的洞察力!
【解决方案2】:

正如所承诺的,这就是答案。

我在ViewController 类中添加了这个函数。

func webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!) {
    webView.stringByEvaluatingJavaScriptFromString("document.body.className = 'safari webkit mac x1 Locale_en_US _z4_';")
}

非常简单,但运行良好。

我的应用程序本身仍然存在一些问题(例如,下载图片按钮不会触发文件浏览器对话框),但基本功能如

  • 发送/接收消息
  • 查看共享图片

工作正常。

我打算为此工作

  • 下载图片
  • 通知

如果您有兴趣帮助我,请发表评论!

感谢大家的帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多