【免费下载链接】NouTubeYouTube and YouTube Music in a single app. No ads, plays in the background.项目地址https://gitcode.com/gh_mirrors/no/NouTube点击查看免费下载NouTube 是一款把 YouTube 和 YouTube Music 装进同一个 App 的跨平台应用核心卖点就一句话无广告、支持后台播放锁屏也能听。本文带你拆解它的后台播放功能到底是怎么实现的——不需要 Premium 会员熄屏、锁屏、切到其他 App声音照样不中断。一、难点在哪YouTube 为什么故意暂停先看背景。NouTube 并不是自己写了一个播放器而是用WebView 包裹 m.youtube.com 和 music.youtube.com再注入脚本完成增强见 README.md 的 How it worksWrap https://m.youtube.com and https://music.youtube.com in Android webview, inject code to block ads, hook playback controls and support playing in background.问题就出在包裹网页这件事上。YouTube 移动端网页有一条刻意的规则一旦页面不可见切后台、锁屏网页版就暂停播放因为免费用户没有音频后台播放权限长时间播放还会弹出Video paused. Continue watching?的空闲确认框点不点都容易打断播放。所以 NouTube 的后台播放本质上是在和 YouTube 的这条规则斗智斗勇。它的思路分三层我们一层层看。二、第一层让网页以为自己一直亮着在 Android 端WebView 的可见性由系统回调决定。NouTube 在 NouTubeView.kt 里重写了onWindowVisibilityChanged永远向上报告VISIBLE——这样 YouTube 网页永远检测不到自己被切走自然不会触发暂停。iOS 的 WKWebView 没有类似的可见性钩子网页会在 App 退后台的一瞬间被标记为 hidden。NouTube 用了一段注入脚本覆盖这个状态NouTubeView.swiftWKWebView flips the page to hidden the moment the app leaves the foreground, and YouTube pauses mobile web as soon as it sees that. The Android view keeps the page visible from the native side instead; this is the same trick for WebKit.但这里有个精巧的设计页面被骗了App 自己没骗。真实的可见性状态会被同步到一个全局变量window.NouTubeBackground里——Android 端在 NouTubeView.kt 的容器回调里写入iOS 端监听didEnterBackground/willEnterForeground通知后写入NouTubeView.swift。这个真话通道是第二层防护的基础。三、第二层后台自动续播守卫核心光骗过页面还不够。YouTube 还有另一条路它的Media Session 处理器和空闲检测依然可能在后台把视频暂停掉。用户这时根本摸不到页面播放就断了。为此 NouTube 写了一个注入脚本 content/background-guard.ts它的职责是后台期间凡是不是用户要求的暂停一律自动恢复。逻辑拆解如下暂停来源如何识别守卫的对策用户自己暂停通知栏、蓝牙耳机按键、睡眠定时器包装NouTube.pause()打标记appPaused绝不恢复尊重用户iOS 锁屏/控制中心操作提前 hookmediaSession.setActionHandlerguardMediaSessionHandlers视为用户行为不恢复来电、其他 App 抢占音频原生侧canAutoResume()返回 false彻底停住等用户手动恢复YouTube 自己的后台暂停以上都排除了 → 只剩这一种可能自动点掉弹窗并playVideo()续播实现上是一个每 5 秒一次的轮询background-guard.ts读取movie_player的播放状态如果之前在播 现在暂停了 不是用户所为 不是音频中断就先尝试点掉ytmusic-you-there-renderer的确认弹窗再调用playVideo()。连续 3 次恢复失败就停止尝试避免和系统策略对打。细节上还有几处值得学习的工程判断源码注释写得非常直白同步记录前台暂停pause事件监听用捕获阶段防止用户刚暂停就切后台的竞态被误判成 YouTube 的暂停弹窗只点单按钮的情况多按钮弹窗不瞎猜反正playVideo()也能续播iOS 的 Media Session 要抢先 hookYouTube 在DOMContentLoaded之前就注册了自己的处理器所以 content/main.ts 在 document 一开始就调用guardMediaSessionHandlers()。四、第三层原生外壳——通知栏与锁屏控制网页活下来之后用户体验要靠原生层来补齐。AndroidNouService.kt 是一个前台服务Foreground Service负责常驻媒体通知标题、作者、封面缩略图外加播放/暂停、上一首、下一首、快退/快进、倍速切换按钮通知上直接循环 1x→1.25x→1.5x→1.75x→2x所有按钮点击都通过evaluateJavascript(NouTube.xxx())转译成页面内播放器的操作监听拔耳机ACTION_AUDIO_BECOMING_NOISY和蓝牙耳机断连自动暂停最硬核的部分在ensureForeground()NouService.kt有真机实测发现系统会在 App 后台约 18 分钟后静默撤销服务的前台状态之后 WebView 渲染进程就成了后台清理对象。NouTube 的对策是只要还在播放每分钟重新断言一次前台状态把通知栏重新挂上去确保渲染进程不会被杀。iOS配置里只有一行关键声明app.config.ts 的UIBackgroundModes: [audio]注释写得很直白——The player keeps going with the screen off and on the lock screen.。锁屏和控制中心的卡片则由 NouNowPlaying.swift 驱动设置AVAudioSession为.playback类别并激活同步标题/作者/进度/封面到MPNowPlayingInfoCenter如果通话或其他 App 抢占了音频中断结束后还会自动重新激活会话避免从此静音。五、用户视角这些实现落地成了什么体验把三层拼起来普通用户得到的是锁屏听歌播放中直接按电源键通知栏/锁屏卡片上继续控制⏩通知栏倍速不打开 App 就能切播放速度拔耳机自动暂停防外放社死睡眠定时器原生层精确到毫秒计时到点自动NouTube.pause()NouService.kt而且这种暂停守卫脚本绝不好心恢复抗 YouTube 空袭后台几小时也不会被Continue watching?打断。六、关键文件清单延伸阅读content/background-guard.ts —— 后台自动续播守卫全项目斗智逻辑的核心content/main.ts —— 注入脚本入口按顺序装配各项能力modules/nou-tube-view/android/src/main/java/expo/modules/noutubeview/NouService.kt —— Android 前台服务与媒体通知modules/nou-tube-view/android/src/main/java/expo/modules/noutubeview/NouTubeView.kt —— WebView 可见性伪造与 JS 桥modules/nou-tube-view/ios/NouTubeView.swift —— iOS 侧可见性脚本注入modules/nou-tube-view/ios/NouNowPlaying.swift —— 锁屏/控制中心 Now Playing 卡片app.config.ts —— iOSUIBackgroundModes与 Android 权限声明。七、小结NouTube 的后台播放不是某一个 API 的功劳而是一套组合拳伪造网页可见性绕过 YouTube 的暂停规则后台守卫脚本精准区分谁按的暂停键并自动续播原生前台服务/音频会话兜住系统杀进程和锁屏体验。想给 Web 应用做播放增强这套页面层欺骗 行为归因 原生兜底的三层架构值得直接抄作业。赞分享【免费下载链接】NouTubeYouTube and YouTube Music in a single app. No ads, plays in the background.项目地址https://gitcode.com/gh_mirrors/no/NouTube点击查看免费下载相关推荐MusicFreeDesktop后台播放设置关闭窗口也能听歌MusicFreeDesktop后台播放设置关闭窗口也能听歌 你是否遇到过这样的困扰想听着歌工作却又不想让音乐播放器窗口占据屏幕空间关闭窗口音乐就停止播音视频桌面应用CTGAN实战教程用Adult数据集训练你的第一个合成数据模型CTGAN实战教程用Adult数据集训练你的第一个合成数据模型 CTGANConditional Tabular Generative AdversariaKazumi 后台播放功能完整指南如何实现视频音频后台播放Kazumi 是一款基于 Flutter 开发的番剧采集与在线播放应用程序支持自定义规则和流媒体播放。本文将详细介绍如何在 Kazumi 中实现后台音频播放功移动开发桌面应用音视频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考