【免费下载链接】YouMod
A YouTube tweak that try to make similar features from YTLite as much as possible.
YouMod 是一款面向 iOS YouTube 客户端的开源 Tweak(增强插件),它能一键实现后台播放、自动修复播放问题、SponsorBlock 跳过片段、手势控制、下载等 YTLite 同款的实用功能。本文将结合源码,带新手读者看懂它是如何用 Theos 构建、并基于 MobileSubstrate Hook 技术"改写"官方 App 行为的——无需深厚 Objective-C 功底,跟着读一遍就能明白 Tweak 的工作原理。
一、YouMod 是什么:一个"注入式"的 YouTube 增强工具
YouMod 本身不是 App,而是一个Tweak——一段编译为动态库的代码,由系统级的 MobileSubstrate 框架在 YouTube 启动时注入到其进程中。它的"身份证"就只有一个过滤条件:
{ Filter = { Bundles = ( "com.google.ios.youtube" ); }; }见 YouMod.plist:只要目标 App 的 Bundle ID 是 YouTube,Tweak 就会被加载进去。
从 control 文件可以看到它的包信息:包名dev.water888.youmod,依赖mobilesubstrate (>= 0.9.5000)且要求firmware (>= 14.0)(即 iOS 14.0+)。
项目结构非常清晰:
| 路径 | 作用 |
|---|---|
| Files/ | 全部 Hook 源码(.x文件),按功能拆分成 Player、Others、Settings 等模块 |
| Makefile | Theos 构建脚本 |
| YouMod.plist | 声明注入目标(YouTube) |
| control | deb 包元信息(包名、版本、依赖) |
| layout/ | 安装后落盘的资源,含多语言包 zh-CN.lproj/Localizable.strings |
二、MobileSubstrate Hook 原理:为什么能"改写"官方 App
传统开发只能改自己的代码,而 Tweak 的超能力来自MobileSubstrate Hook:它允许你在运行中的第三方进程里,把某个 Objective-C 方法的实现"偷梁换柱"成自己的版本。
Theos 用宏让这件事变得像写普通代码一样简单,YouMod 源码里用到了四类核心宏:
%hook 类名:声明要 Hook 哪个类,例如 Files/Others.x 中的%hook MLVideo;%orig:在 Hook 内部调用"原版实现",你可以先改参数、再放行,也可以直接拦截不执行;%new:给类凭空添加一个原本不存在的方法;%ctor:Tweak 被加载进目标 App 时自动执行的初始化代码,相当于"构造函数"。
一个最小例子(后台播放的核心,下节详讲):
%hook MLVideo - (BOOL)playableInBackground { return IS_ENABLED(BackgroundPlayback) ? YES : %orig; } %end这段代码的意思是:YouTube 内部类MLVideo原本有一个询问"是否允许后台播放"的方法,现在被替换了——开关打开时直接返回YES,否则走原逻辑%orig。YouTube 的所有调用方(播放器、生命周期管理等)浑然不觉,但行为已经被改变了。
所有类声明集中在 Files/Headers.h,例如YTPlayerViewController、YTWatchController等 YouTube 私有类的头文件导入都在这里,方便各模块直接引用。
三、后台播放如何实现:四个 Hook 点逐个拆解 🎧
YouTube 判断"这段视频能否在锁屏/切出后继续播",散落在多个内部配置类里。YouMod 在 Files/Others.x 中对四个类做了拦截,全部指向同一个开关BackgroundPlayback:
// Background playback %hook MLVideo - (BOOL)playableInBackground { return IS_ENABLED(BackgroundPlayback) ? YES : %orig; } %end %hook YTIPlayabilityStatus - (BOOL)isPlayableInBackground { return IS_ENABLED(BackgroundPlayback) ? YES : %orig; } %end %hook YTPlaybackData - (BOOL)isPlayableInBackground { return IS_ENABLED(BackgroundPlayback) ? YES : %orig; } %end %hook YTIPlayerResponse - (BOOL)isPlayableInBackground { return IS_ENABLED(BackgroundPlayback) ? YES : %orig; } %end几个值得新手注意的细节:
- 为什么 Hook 四个地方?因为 YouTube 内部不同版本、不同代码路径会读不同的配置对象(响应数据、播放数据、媒体对象各查一处)。"多点覆盖 + 同一开关"是 Tweak 应对私有接口频繁变动的典型防御式写法。
IS_ENABLED是什么?它是 Files/Headers.h 里定义的一个宏,底层读取NSUserDefaults中YouModEnablesBackgroundPlayback这个键,见 Headers.h#L240。也就是说,用户界面里的每一次开关,最终都落到了这里。- 默认开启。在 Files/Settings.x 的
%ctor中通过registerDefaults把BackgroundPlayback的默认值设为@YES,用户装完即可用,无需手动打开;对应的设置项文案定义在 Files/Settings.x#L470,中文翻译"后台播放"来自多语言文件 zh-CN.lproj/Localizable.strings。
四、播放修复:捕获错误码,自动重载播放器 🩹
不少用户会遇到"黑屏、转圈、播放失败"的问题。YouMod 的方案见 Files/FixPlaybackIssues.x:Hook 播放覆盖层的错误处理入口,精准识别播放错误码并触发一次自动重载:
%hook YTMainAppVideoPlayerOverlayViewController - (void)handleError:(NSError *)error { if (error && [error.domain isEqualToString:@"com.google.ios.youtube.ErrorDomain.playback"] && error.code == 14) { YTPlayerViewController *playerViewController = self.parentViewController; if (![playerViewController.UIDelegate isKindOfClass:%c(YTWatchController)]) return; YTWatchController *watchController = (YTWatchController *)playerViewController.UIDelegate; dispatch_async(dispatch_get_main_queue(), ^{ [watchController reload]; }); return; } %orig; } %end这段代码的巧妙之处:
- 只修"播放域"的特定错误:判断错误
domain是com.google.ios.youtube.ErrorDomain.playback且code == 14,其他错误照常走%orig,不会误伤; - 切回主线程重载:
reload是界面相关操作,必须 dispatch 到主队列执行; %c()安全取类:用 Theos 的%c宏而非直接写类名,即便 YouTube 升级后该类被移除,取到nil也只是安全跳过,不会崩溃。
注意文件末尾(FixPlaybackIssues.x#L42-L45)还有一个细节:整个文件的 Hook 注册被包在%ctor里,只有用户在设置页打开"修复播放问题(临时)"开关(键名YouModFixPlaybackIssues,定义于 Headers.h#L92)时才真正生效——把"是否启用"的判断前移到加载阶段,是控制 Tweak 开销的常见手法。设置入口在 Files/Settings.x#L159-L168。
五、从源码到安装包:Theos 构建速览 🛠️
YouMod 的构建由 Makefile 驱动,关键内容只有几行:
TWEAK_NAME = YouMod $(TWEAK_NAME)_FRAMEWORKS = UIKit Foundation AudioToolbox MediaPlayer $(TWEAK_NAME)_FILES = $(wildcard Files/*.x)含义是:把Files/下所有.x源文件一起编译,链接 UIKit、Foundation、AudioToolbox、MediaPlayer 四个框架(后台播放的媒体能力、下载功能的音轨处理都依赖它们),再套用 Theos 的tweak.mk模板打包出.deb安装包。配合 control 里的版本与依赖信息,用户即可在 Cydia Sileo 等源中安装dev.water888.youmod。
六、给新手的上手与避坑建议 💡
- 想看某个功能怎么实现的?直接按功能名去 Files/ 目录找同名文件:
Player.x(播放器/手势)、Others.x(后台播放、弹框拦截)、Download.x/ SABRDownload.x(下载引擎)、SponsorBlock.x(跳过片段)。 - YouTube 升级后功能失效?这是 Tweak 的普遍困境——私有类名随时可能变化。YouMod 的应对策略(多点 Hook、
%c()安全取类、respondsToSelector:判断)都值得学习。 - 想自己改参数试试?所有可配置项的键名都集中在 Files/Headers.h,改完用 Theos
make重新编译即可,仓库的 Makefile 已配置好arm64与 iOS 14.0 最低目标。
一句话总结:YouMod 展示了 iOS Tweak 开发的完整链路——plist 声明注入目标 → Theos 编译 → MobileSubstrate 加载 →%hook改写私有方法 → NSUserDefaults 驱动开关,抓住这条主线,你就能读懂绝大多数同类增强项目的源码。
【免费下载链接】YouMod
A YouTube tweak that try to make similar features from YTLite as much as possible.
相关推荐
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考