You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用户点击WKWebView嵌入的Iframe视频时如何获取视频相关信息

WKWebView捕获iframe嵌入视频信息的实现方案

请查看附件中的WKWebView界面截图

1. 初始化WKWebView时配置JS交互能力

初始化阶段开启JavaScript支持,同时注册原生消息接收通道,代码如下:

import WebKit

class ViewController: UIViewController {
    var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let config = WKWebViewConfiguration()
        // 开启JavaScript支持
        config.preferences.javaScriptEnabled = true
        // 注册JS向原生传值的通道
        config.userContentController.add(self, name: "videoInfoReceiver")
        webView = WKWebView(frame: view.bounds, configuration: config)
        webView.navigationDelegate = self
        view.addSubview(webView)
        // 加载目标博客页面
        if let url = URL(string: "你的博客页面地址") {
            webView.load(URLRequest(url: url))
        }
    }
}

2. 页面加载完成后注入事件监听脚本

在WKWebView页面加载完成的代理回调中,注入JS脚本,用于捕获iframe内的视频点击事件并提取相关信息:

extension ViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        let injectJS = """
        // 遍历页面内所有iframe节点
        document.querySelectorAll('iframe').forEach(iframe => {
            // 等待iframe自身内容加载完成
            iframe.onload = () => {
                // 绑定iframe内容区域的点击事件
                iframe.contentDocument.addEventListener('click', () => {
                    const videoNode = iframe.contentDocument.querySelector('video');
                    if (videoNode) {
                        // 组装视频信息
                        const videoInfo = {
                            title: iframe.contentDocument.title || document.title,
                            duration: videoNode.duration,
                            videoSrc: videoNode.currentSrc,
                            width: videoNode.videoWidth,
                            height: videoNode.videoHeight,
                            currentPlayTime: videoNode.currentTime
                        };
                        // 将信息回传给原生层
                        window.webkit.messageHandlers.videoInfoReceiver.postMessage(videoInfo);
                    }
                });
            };
        });
        """
        // 执行JS注入
        webView.evaluateJavaScript(injectJS)
    }
}

3. 原生层接收视频信息

实现WKScriptMessageHandler协议,处理JS回传的视频数据:

extension ViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        guard message.name == "videoInfoReceiver",
              let info = message.body as? [String: Any] else { return }
        // 直接使用获取到的视频信息
        let title = info["title"] as? String ?? "无标题"
        let duration = info["duration"] as? Double ?? 0
        print("视频标题:\(title),总时长:\(duration)秒")
    }
}

注意:如果iframe嵌入的是第三方平台的视频,需要第三方域名没有设置跨域限制,否则JS无法访问iframe内部DOM节点,也就无法提取视频信息。

内容的提问来源于stack exchange,提问作者Jaydip Gadhiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:45:03