【问题标题】:Why WKWebView doesn't display videos? - Swift 3为什么 WKWebView 不显示视频? - 斯威夫特 3
【发布时间】:2017-02-27 14:04:13
【问题描述】:

我以编程方式成功地将WKWebView 添加到viewController 中(在viewDidLoad() 中)。加载包含视频的 url 时它看起来很好,但是当我尝试点击它(播放它)时,我看不到它,但音频可以正常工作。

奇怪的是,我创建了一个新项目只是为了确保它可以正常工作,而且确实如此,我复制了与 webView 显示视频相同的代码。

在转换为 Swift 3 之前运行良好。

这是点击视频时的样子:

点击前:

点击后:

我还尝试了另一个网页:

点击前:

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

很简单,代码如下:

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)
 }

我尝试检查许多没有任何输出的情况。我错过了什么?

提前致谢。

【问题讨论】:

标签: ios swift nslayoutconstraint wkwebview


【解决方案1】:

考虑到您将 URL 用作绝对字符串,而不是本地文件。

这是您的答案的解决方案

iOS9 版本中修订了应用程序传输安全性。现在,您的应用程序不会受到不安全连接的影响。 iOS 强制建立安全连接。这可能与您的情况发生冲突。 - author SO Thread Reference

来自Apple documentation

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

查看文档here

<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 thread

【讨论】:

  • 感谢您的努力,但它没有用,它在另一个项目上运行良好,无需添加 NSExceptionDomains。
  • 您可以尝试使用任何带有 https 协议的链接播放视频吗?它有效吗?
  • 同样的问题,我能听到声音但没有出现视频
【解决方案2】:

我认为视频正在您的 WKWebview 后面播放,您能否调试视图层次结构并发布它? Xcode-&gt;Menu-&gt;Debug-&gt;View Debugging-&gt;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
}

【讨论】:

  • 非常感谢!我遇到的问题不完全一样,但它与窗口级别有关,听起来好像有第三方库更改了窗口级别。我认为你会得到赏金:)
  • @AbdallaAlHajHasan 很高兴它有帮助,如果您仍然不知道哪个库正在更改窗口级别,请尝试调试视图层次结构,您可能会得到一些线索。
  • @AbdallaAlHajHasan 如果它回答了您的问题,请您也将其标记为答案 :)
  • 在我的情况下,Crashlytics 库显示有关可用应用程序新版本的警报。它没有将其显示为常规模式,而是创建了新的 UIWindow,然后一直将其标记为“键”。
【解决方案3】:

初始化webview时,需要传入两个配置属性。示例:

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>

【讨论】:

  • 我遇到了一个问题,即前贴片广告可以正常播放,但之后实际视频无法播放。这解决了我的问题,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2020-08-24
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多