使用 WKWebView 在 iOS 13 中进行桌面浏览?

Posted

技术标签:

【中文标题】使用 WKWebView 在 iOS 13 中进行桌面浏览?【英文标题】:desktop browsing in iOS 13 with WKWebView? 【发布时间】:2019-09-26 16:10:26 【问题描述】:

根据 WWDC 2019 视频 203,我应该能够在 iPad 上的全屏 WKWebView 中看到桌面浏览。但我没有看到它。例如,当我在 WKWebView 中访问 google 时,我清楚地看到了该网站的移动版本。

我已经尝试了视频建议的所有内容。我已经设置了applicationNameForUserAgent,并且网络检查器显示它正在按照他们在视频中的建议进行设置:

"5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (Khtml, like Gecko) Version/1.0 MyBrowser/1.0"

我还实现了导航委托以请求.desktop 模式:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) 
    preferences.preferredContentMode = .desktop
    print("asking for desktop version")
    decisionHandler(.allow, preferences)

正在调用该方法。但我仍然看到该网站的移动版本。

当我在同一台 iPad 上使用 Safari 访问同一站点时,或者如果我使用 SFSafariViewController,我确实看到了该站点的桌面版本,如广告所示。如何在我的 WKWebView 中获取该版本的网站?

【问题讨论】:

【参考方案1】:

通过使用"Version/13.0.1 Safari/605.1.15" 作为我的applicationNameForUserAgent 字符串,我能够让它工作。

(我从哪里得到那个字符串?基本上我只是从 SFSafariViewController 偷来的。)

这似乎是一个错误。 Apple 的视频暗示我不应该为了进行桌面浏览而必须谎报用户代理是谁。

【讨论】:

这救了我。关于当前状态的任何消息?意思是,这个问题解决了吗? @马特【参考方案2】:

我对 iPadOS (iPad ios13) 上 WKWebView 的这个错误感到失望。

这是以编程方式获取每个版本的代码,以@matt 指示的格式生成字符串,并将其添加到用户代理。

let systemVersion = UIDevice.current.systemVersion
let webkitVersion = (Bundle(for: SFSafariViewController.self).object(forInfoDictionaryKey: "CFBundleVersion") as? String) ?? "605.1.5"
webConfig.applicationNameForUserAgent = "Version/\(systemVersion) Safari/\(webkitVersion)"

【讨论】:

以上是关于使用 WKWebView 在 iOS 13 中进行桌面浏览?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 wkwebview 使用 iOS 13 暗模式

iOS 13 SceneDelegate 上的 WKWebView 警报崩溃

如何在 WKWebView swift 5 中更改字体大小?

iOS13调试Safari和WKWebView中的页面

使用WKWebView替换UIWebView

SwiftUI - WKWebView 的 iOS 13 UIViewRepresentable 获取线程 1:EXC_BREAKPOINT 崩溃