WKWebView Mac 浏览器启用全屏 html5?

WKWebView Mac Browser Enable fullscreen html5?

我用 Swift 最新版本和 xcode 8.3.3 制作了一个简单的浏览器。 我希望能够在有 html5 视频时全屏输入(例如在 youtube 上)。 我现在在 YouTube 上看到 "full screen is unavailable"。 与旧 WebView 相同的问题...在 iOS 上有效。

编辑。也许这是不可能的。我试图查看 JavaFX WebView 和 WPF WebBrowser,它们具有相同的限制。实际上,一个人能够在 WPF WebBrowser 上允许全屏播放 YouTube 视频,但只能创建一个完整的 html 页面: Playing youtube in full screen in WebBrowser control

当然我不能为一个页面中的每个视频创建一个网页(至少我不知道怎么做,如果你知道请告诉我)。


原文: 我用 Swift 最新版本和 xcode 8.3.3 制作了一个简单的浏览器。 一切正常,但我无法像使用旧 WebView 那样激活插件。 因为我在 mac 上,所以我应该能够激活插件(我知道在 iOS 上是不可能的)我错了吗?

此外(我在旧的 WebView 中遇到了同样的问题)无法为 html5 视频激活全屏(至少我不知道如何)。

@IBOutlet weak var webView: WKWebView!
let urlString = "http://myurl.com/"
self.webView.load(NSURLRequest(url: NSURL(string: urlString)! as URL) as URLRequest!)
self.webView.configuration.preferences.plugInsEnabled = true

这是让基本浏览器正常工作的真正基本代码。但是在 WKWebView 的 Interface Builder 中没有启用插件的选项,我真的不知道如何允许 html5 视频(比如 youtube)的全屏显示。

编辑。好的,我终于找到了插件部分的答案: self.webView.configuration.preferences.plugInsEnabled = 真

真的很简单,但很难理解在哪里可以找到它我不得不去这里: https://developer.apple.com/documentation/webkit/webpreferences 猜猜...

答案是没有答案。现在 mac 上没有 API 以获得全屏 html5。我尝试在 windows 上制作相同的应用程序,并且当前 UWP 的 WebView 能够全屏(WPF 的旧 WebBrowser 无法全屏)。

我认为获得它的唯一方法是向苹果提交反馈。

要允许 WKWebView 使用全屏 HTML,您需要访问 WKPreferences 中的私有 API(参见 https://github.com/WebKit/webkit/blob/master/Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm#L232-L240)。由于您在桥接 header 中使用 Swift 添加:

#import <WebKit/WebKit.h>

@interface WKPreferences ()
-(void)_setFullScreenEnabled:(BOOL)fullScreenEnabled;
@end

简单地称之为:

let webView = WKWebView(frame: view.frame)
webView.configuration.preferences._setFullScreenEnabled(true)

如果您在退出全屏模式后发现 Web 视图的大小发生奇怪的调整,我发现这可以解决我的问题:

webView.autoresizingMask = [.width, .height]
view.addSubview(webView)

webView.translatesAutoresizingMaskIntoConstraints = false
webView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true

注意:由于您访问的是私人 API 这将在 Mac App Store 上被拒绝。

您可以通过在配置中将 属性 更改为 KVO 来代替使用私有 API。

使用 Swift 5:

let configuration = WKWebViewConfiguration()
configuration.preferences.setValue(true, forKey: "fullScreenEnabled")
let webView = WKWebView(frame: .zero, configuration: configuration)

已在 macOS 10.15 和 11 上测试

@SoneeJohn 发布的解决方案很明确,但它涉及使用桥接 header。我以前从未手动使用过 Objective-C 或修改过私有 Swift 框架。我不知道要使用什么关键字。而且,我发现的资源似乎更多地涉及并专注于创建原始框架——而不是改变现有框架。我不知道这是否是正确的实现,但它有 full-screen 模式可以在网络视图中工作。

步骤

在下一节中有参考以下每个步骤的照片。

  1. 单击 XCode
  2. 中的“项目”
  3. 点击“添加目标”
  4. 单击“Cocoa 框架”
  5. 点击“下一步”
  6. 在“产品名称”中输入标题
  7. 点击“完成”
  8. 单击“链接的框架和库”中的“添加项目”
  9. 在“搜索”中输入“WebKit”
  10. 点击“WebKit.framework”
  11. 点击“添加”
  12. 单击您的“Project.h”文件
  13. 从解决方案中添加“导入”代码
#import <WebKit/WebKit.h>
  1. 从解决方案中添加“全屏”代码
@interface WKPreferences ()
-(void)_setFullScreenEnabled:(BOOL)fullScreenEnabled;
@end
  1. 将您的“项目框架”导入您的 swift 文件
  2. 在您的网络视图中实施“全屏”代码
webView.configuration.preferences._setFullScreenEnabled(true)
  1. 我必须将我的用户代理更改为 Safari 11 才能使 full-screen 模式正常工作。
webView.customUserAgent = """
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13) AppleWebKit/604.1.31 (KHTML, like Gecko) Version/11.0 Safari/604.1.31
"""