10 月 31 日下午四点半,一台 Lumia 950 XL 的屏幕上出现了 iOS 16 的桌面,触摸能用,8 个核心都在跑。 开发者 VNchocoTaco 做的这台机器,11 月 2 日,IT之家说项目已经传到 GitHub。GitHubIT之家
这就是整件事最容易被标题盖过去的地方。iOS 不是作为一个现成刷机包塞进 Lumia 的,而是被“接”在它旁边的。手机走的是 Lumia 那套老启动链:EFIESP 上的 Windows 启动管理器 → Boot Shim → UEFI → UniXNU 菜单 → DarwinBoot,然后拉起一个按 MSM8994 编译的 XNU 内核,再挂上 iPhone X 的 iOS 16.7.16 用户态。开发者选 iPhone X,是因为在能塞进这套 ARMv8.0、无 PAC 环境里的现成 iOS 用户态中,它是唯一合适的那一个。
所以准备清单的第一项不是数据线,是一台已经刷好 LineageOS 20 的 950 XL。 它得保留 EFIESP 上的 Windows 启动管理器,adb 能 root,TWRP 能改分区,还要从 userdata 里让出至少 18 GiB 给 iOS。只支持 950 XL(RM-1085,代号 cityman),950 不行。GitHubIT之家
第二项是一台 Mac:至少留出 35 GB 空闲,装 Python 3.11+,用一根 USB 线——17.5 GB 的 root 镜像不走 Wi-Fi。 脚本会从苹果服务器拉 iPhone X 的 iOS 16.7.16 固件(20H392,约 6.2 GB),在本机合成 HFS+ 根卷,整个过程约一个半小时。 想走手动路线,还得加上 Xcode、60 GB 空闲和一台改 BCD 的 Windows 机器。不用另找一台 iPhone X 真机。GitHubIT之家
第三项是备份。安装器会先把 EFIESP、BCD、GPT 和 Android 的 /data 复制到 Mac,再让你输入 SPLIT 和 WRITE 两次确认。 这不是仪式感:它接下来要缩小 userdata、新建分区、改启动配置。前两项决定你能不能开始,第三项决定你失败后还能不能回到 Android。GitHub
做完这些,你得到的是一台能亮屏的机器:A57 从 384 MHz 提到 633.6 MHz,触摸、侧键和屏幕都能用,相机键被映射成 Home 键,8 个核心也全开。 电池图标和充电也能用,开机约 3 分钟。IT之家
然后是没有的部分:GPU 不工作,界面靠 CPU 渲染,毛玻璃是灰的;需要 CoreImage 的地方会崩,新建应用图标、设置里的“粗体文本”都能让 SpringBoard 重启。GitHub
Wi-Fi、蜂窝、蓝牙、音频、摄像头、传感器和 RTC 全部缺席,系统时间从 1970 年开始。 它接不了电话,连紧急呼叫也不行。IT之家
这也是为什么风险不只是“变砖”。项目文档写得很直白:重新分区和改 BCD 这两步,出错可能要让手机重刷。 iOS 虽然住在独立分区、每次启动只加一个一次性启动项,但缩小 userdata 时如果中断,Android 的数据也可能丢。 旧 eMMC 写 17.5 GB 要四十多分钟,发热和寿命都得算进去。GitHubIT之家
硬件也在边界上。开发者试过把 A57 拉到 960 MHz,跑了约 6 分钟,SoC 自己复位;现在停在 633.6 MHz,仍高于固件原来的 384 MHz。 没有 GPU 时,backboardd 动画能吃掉 2.4 个核,热和耗电不会好看。GitHub
还有一层是安全:没有 SEP,root 未封签,启动缓存也不做安全校验。最好别在这台机器上登录 Apple ID,也别把它当备用机——它打不了电话。
如果看到这里还想试,稳妥的顺序是先在 Mac 上跑 `python3 installer/install.py install --dry-run`,看清它要动的分区和文件;再确认 Android 能正常回退;最后把它当成一个周末实验,而不是一台新手机。它能证明 XNU 可以在非苹果硬件上跑起来,这已经足够有意思;但它离“能用的 iPhone”还差一整套驱动。