为什么WKWebView不显示video? – 斯威夫特3

我成功地以编程方式在viewController (在viewDidLoad() )中添加了一个viewController 。 当加载包含video的url时,显示效果不错,但是当我尝试点击它(播放它)时,我看不到它,但audio正常工作。

奇怪的是我创build了一个新的项目,以确保它应该正常工作,它做了,我复制相同的确切代码的webView显示video,因为它应该。

在转换到Swift 3之前它工作正常。

这是在video上点击时的样子:

点击之前:

在这里输入图像说明

攻丝后:

在这里输入图像说明

我也试过另一个网页:

点击之前:

在这里输入图像说明

点击后(请注意状态栏现在隐藏):

在这里输入图像说明

简单来说,这是代码:

 override func viewDidLoad() { super.viewDidLoad() let web = WKWebView(frame: view.frame) let urlRequest = URLRequest(url: URL(string: "http://www.w3schools.com/html/html5_video.asp")!) web.frame = view.frame web.load(urlRequest) view.addSubview(web) } 

我试图检查很多情况下没有任何输出。 我错过了什么?

提前致谢。

我认为这个video是在你的WKWebview后面播放的,你可以debugging视图层次结构并发布它吗? Xcode->Menu->Debug->View Debugging->Capture View Hierarchy在video播放时Xcode->Menu->Debug->View Debugging->Capture View Hierarchy

我已经尝试了一个新的swift3项目和你的代码,没有问题,这里是视图层次结构:

在这里输入图像说明

你可以从左边看到,AVPlayerView是在另一个UIWindow中,与WKWebView不同, 所以我猜你项目中包含WKWebView的UIWindow具有更高的windowLevel,所以它显示在包含AVPlayer的UIWindow上面。

通过将默认的UIWindow设置为更高的WindowLevel(UIWindowLevelAlert),我复制了您在项目中看到的内容。

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. window?.windowLevel = UIWindowLevelAlert return true } 

考虑到你使用的URL为绝对string,而不是本地文件。

这是你的答案的解决scheme

在iOS9发行版中修改了应用传输安全性。 现在,您的应用程序可以安全的从不安全的连接。 和iOS部队进行安全连接。 这可能是冲突在你的情况。 – 作者 SO线程参考

从苹果文档

如果您的应用需要向不安全域发出请求,则必须在应用的Info.plist文件中指定此域

请参阅这里的文档

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>testdomain.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSExceptionRequiresForwardSecrecy</key> <true/> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> <false/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <true/> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSRequiresCertificateTransparency</key> <false/> </dict> </dict> </dict> 

如果您的应用有充分的理由这样做,您也可以忽略所有的应用传输安全限制:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

您可以查看有关连接到http站点时所关联的安全问题的更多信息。

希望它可以帮助你一点

完整的归属于作者和SO线程和这个答案中提到的链接

从SO 线程

初始化webview时,您需要传入两个configuration属性。 例:

 let webConfiguration = WKWebViewConfiguration() webConfiguration.allowsInlineMediaPlayback = true webConfiguration.mediaTypesRequiringUserActionForPlayback = [] webView = WKWebView(frame: .zero, configuration: webConfiguration) 

您还需要在info.plist中允许任意加载:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoadsForMedia</key> <true/> </dict>