WKWebView Mac 浏览器启用全屏 html5?



我用 Swift 最新版本和 xcode 8.3.3 做了一个简单的浏览器。 我希望能够在有html5视频时全屏输入(如在YouTube上(。 我现在在 youtube 上收到"全屏不可用"。 旧网络视图的相同问题...在 iOS 上它可以工作。

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

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


原文: 我用 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的界面生成器中启用插件,我真的不知道如何允许html5视频(如youtube(的全屏。

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

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

macOS 12.3 更新

iOS 15.4macOS 12.3开始,WKPreferences具有新的属性isElementFullscreenEnabled。现在很简单:

myWebView.configuration.preferences.isElementFullscreenEnabled = true

原始答案(macOS 12.3 之前(

您可以通过在配置中使用 KVO 更改属性来执行此操作,而不是使用私有 API。

使用 Swift 5

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

在 macOS 10.15 和 11 上测试

要允许WKWebView使用全屏 HTML,您需要在WKPreferences中访问私有 API(见 https://github.com/WebKit/webkit/blob/master/Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm#L232-L240(。由于您在桥接标头中使用 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上将被拒绝。

@SoneeJohn发布的解决方案很明确,但它涉及使用桥接标头。我以前从未手动使用 Objective-C 或修改过私有 Swift 框架。我不知道该使用什么关键字。而且,我发现的资源似乎更复杂,专注于创建一个原始框架 - 而不是改变现有的框架。我不知道这是否是正确的实现,但它具有全屏模式以在 Web 视图中工作。

步骤

在下一节中,有一些照片引用了以下每个步骤。

  1. 在XCode中单击您的"项目">
  2. 点击"添加目标">
  3. 点击"可可框架">
  4. 点击"下一步">
  5. 在"产品名称"中输入标题
  6. 点击"完成">
  7. 单击"链接框架和库"中的"添加项">
  8. 在"搜索"中输入"WebKit">
  9. 点击"WebKit.framework">
  10. 点击"添加">
  11. 点击您的"项目.h"文件
  12. 从解决方案中添加"导入"代码
#import <WebKit/WebKit.h>
  1. 从解决方案中添加"全屏"代码
@interface WKPreferences ()
-(void)_setFullScreenEnabled:(BOOL)fullScreenEnabled;
@end
  1. 将"项目框架"导入到 swift 文件中
  2. 在 Web 视图中实现"全屏"代码
webView.configuration.preferences._setFullScreenEnabled(true)
  1. 我必须将我的用户代理更改为 Safari 11 才能使全屏模式正常工作。
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
"""

答案是没有答案。目前在Mac上没有API可以获取全屏html5。我尝试在Windows上制作相同的应用程序,并且UWP的当前WebView能够全屏显示(WPF的旧WebBrowser无法全屏(。

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

最新更新