如何禁用WKWebView播放YouTube视频时的媒体控制中心通知?
解决WKWebView加载YouTube视频时隐藏媒体控制中心通知的方法
方法1:清空MPNowPlayingInfoCenter播放信息
WKWebView播放视频时会自动向MPNowPlayingInfoCenter写入播放元数据,触发媒体控制中心通知。直接清空该中心的信息即可阻止通知显示:
- 导入MediaPlayer框架:
import MediaPlayer
- 在WKWebView加载完成后执行清空操作,可结合导航代理实现:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { MPNowPlayingInfoCenter.default().nowPlayingInfo = nil }
如果视频是动态加载的,也可以在页面交互过程中按需调用上述清空代码。
方法2:拦截并空实现远程控制事件
即使调用endReceivingRemoteControlEvents(),WKWebView仍可能重新注册远程控制权限。在AppDelegate中实现remoteControlReceived(with:)并空实现,可阻止系统处理相关事件:
func application(_ application: UIApplication, remoteControlReceivedWith event: UIEvent?) { // 空实现,不响应任何远程控制事件 }
同时在WKWebView初始化前,确保调用:
UIApplication.shared.endReceivingRemoteControlEvents()
方法3:注入JS监听视频播放并触发清空操作
通过注入JavaScript监听YouTube视频的播放状态,在播放开始时通知原生代码清空播放信息:
- 配置WKWebView并注入脚本:
let playMonitorScript = WKUserScript(source: """ // 监听全局视频播放事件 document.addEventListener('play', function(e) { if (e.target.tagName === 'VIDEO') { window.webkit.messageHandlers.clearNowPlaying.postMessage(null); } }, true); """, injectionTime: .atDocumentEnd, forMainFrameOnly: true) let config = WKWebViewConfiguration() config.userContentController.addUserScript(playMonitorScript) config.userContentController.add(self, name: "clearNowPlaying") let webView = WKWebView(frame: .zero, configuration: config)
- 实现
WKScriptMessageHandler协议处理消息:
extension YourViewController: WKScriptMessageHandler { func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { if message.name == "clearNowPlaying" { MPNowPlayingInfoCenter.default().nowPlayingInfo = nil } } }
若YouTube采用动态加载视频的逻辑,可调整JS代码监听其专属的播放状态事件(如onStateChange),确保覆盖所有播放触发场景。
内容的提问来源于stack exchange,提问作者dody.ac
相关产品推荐
相关产品推荐

