为什么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>