v1.4.0: The launcher overhaul with a console mode / 启动器大改版与主机模式
English
Highlights
Launcher overhaul (#1097, #1129)
- Light and System appearance on the Mac, settings in four sections and game options in four groups
- A staged build queue, direct install of built games, game data transfers, save import and export, players and a cloud save conflict choice
- Console mode for the couch: home rows, game pages, search, builds and a Home menu that pauses a game in the background
- Supported games list, stick deadzones and new languages: Spanish, Korean and Brazilian Portuguese
Code by @thehobbit85, @Haseenesss, @zatteogit, @Koshindai, @loki-inu, @rborkow, @LNPANDY, @ZhaowTao, @MartinMajewski, @mbanusic, @TeeJayBaker and @yazzang-homelab. The console concept is by @Koshindai (#816) and the controller interaction and Home menu by @Haseenesss (#901, #952). Ideas by @IUMonster (#658) and @zatteogit (#453).
New
- Staged batch builds and Install built games: "Build selected" stages the queue for manual start, iOS batches sign and install once at the end, and direct install adds "Install built games" without rebuilding (#1211)
- macOS Game Mode: per-game launch option on the Mac (#1189, #1069)
- Settings that differ from the tested value are marked: a dot shows next to them, and "Use tested values" puts them back (#453, @zatteogit)
- Supported games: reachable from the library header and from console mode, with each game's cover (#1129, #1140, #1195)
- Game names from the package: the launcher reads a game's name, package version and control data from its package itself, including renamed XCI files, and surfaces a dismissable skipped-files banner (#1125, #895, #1172, #1195, #1212)
- Preflight checks and signing limit guidance: key and disk checks run before a build starts, and Apple error
9120explains the 10-App-ID weekly free-account limit (#1170, #1188) - iPhone and iPad shell: saves, players, data folder diagnostics, a Hold or Toggle mode for each touch key (idea by @IUMonster, #658), the Switch 2 badge, a cloud save gate and a Steam Link fallback. The controller's Options button opens the shell settings, and the in-game menu speaks the player's language (#1129, #1164)
- Accessibility in the launcher: labels, native switches and Reduce Motion (#627, #628, #629, @zatteogit)
- Settings gear fades out: on iPhone and iPad it hides after 3 idle seconds with a controller (#1029)
- Builds that end in console mode are recorded (#950, @Haseenesss)
Changed
- Engine: the pin moves to
81906931(Switch 2 controllers, mesh object function, M1 iOS build, #1063),ab41d6a1(#1125, #1142) andccd834e0(56 more upstream commits including raw HID first-press joining, Ocarina NDVE direct movie scaling and fallback app icons, #1193, #1196). The engine no longer needs .NET (#1125), and the obsolete manual Joy-Con split toggle is removed now that Bluetooth Joy-Con pair natively (#1220) - Experimental engine is never older than Stable: when it is not ahead, the engine update row says so and offers Back to Stable (#1127, #1095)
- Experimental builder: stays behind its feature toggle, off for now (#993)
Fixed
- Super Mario Party post-ring crash:
post_putwaits for an unclaimed slot in a 1024-entry post ring instead of overwriting pending fences (#1220, seedds/nxnative#2469) - Joy-Con: driver, IMU axes, gyro, paired left and right Core Haptics channels and single-handle locality routing (#1072, #1074, #1075, #1083, #1158, #1220, seedds/nxnative#2472)
- Pro Controller counted twice: one Pro Controller is one pad again and keeps its gyro (#972, #971, @Haseenesss)
- External ExFAT drives and post-build cleanup: free-space checks fall back to
statfswhen macOS reports zero bytes on ExFAT (#1185, #1155), and builds clean up duplicateromfs.imgand staging files afterwards (#1146, #1148) - Shader split hung at 99%: zstd is decompressed in-process (#1037, #837, @Haseenesss)
- PATAPON and Hogwarts Legacy aborted at boot:
nsd:aandnsd:uare served (#1038, @Haseenesss) - Pokopia for iOS: it packs without a prewarm seed list (#926, @thehobbit85)
- Quitting a game on iPhone or iPad: returns to the library with a full teardown, isolated
DmShellGameObjective-C classes and preserved unaligned__bsssnapshots (#986, #1163) - iOS game data bookmarks and split parts: fixed security-scoped bookmark lifecycles,
.nxpartoffset overflow and picked drive subfolders (#1150) - Re-signing and shell install: a fresh 7-day profile and a live expiry, install progress and atomic rollback, background IPA save, the library state kept, and the Xcode project regenerated after a game was deleted (#1028, #1032, #978, #1160)
- Mac build progress and library races: fixed the weak-imported
Date.>=crash inpsoArchiveProgress(#1187, #1131), offline PSO progress during--shell-framework(#1154), streaming UTF-8 decoding and install stop (#1159), library generation guards and global keys fallback (#1166), artwork thumbnail bitmap wrapping (#1147) and redundant uncached shader counts while keeping the ETA visible (#1212) - Update sheet: says why its button is off while a build runs (#1061)
- Dock: opens a window after the last one was closed (#1065)
- Copy bar: the game data copy bar stays indeterminate until bytes are done (#1066)
- Focus ring: the Play and game settings buttons have a round one (#1067)
- Hero banner: a 1px bright seam at its bottom edge is gone (#1001)
- Damaged NUP or RomFS: a build stops with a named reason and the NUP table of contents is verified (#1130)
- Test windows: they no longer play a fade that can hold a thread for good (#1121, @Fbenhaddou)
- Windows, Qt front end: Unreal games with Zlib or LZ4 inline shaders, Oodle and LZ5 decoders, LÖVE and GameMaker shaders offline, run-time GLSLC shaders offline, large pool results sent through temp files and worker-process pool mapping by @yazzang-homelab, unreadable
PATHentries skipped duringld64.lldlookup by @yazzang-homelab, archive unpack quotas, build process-tree termination, background drive copies, a long link command line, slim IPA RomFS identity (@taowen), the LLVM download, the Python installer, one-click Defender exclusions, and%ld%%and artwork fallbacks in es, ko and pt-BR (#932, #935, #956, #970, #974, #979, #995, #1039, #1045, #1046, #1064, #1084, #1134, #1152, #1162, #1171, #1173, #1177, #1190)
Known issues
- Not tested with the real thing: a real Steam Link (#797, #987), LiveContainer (#1049), large game data transfers to a device (#899, #1036) and the Home menu pause with a running game (#952)
- Game names from packages: not checked on packages of games packed before the launcher read names itself (#1125)
- Console mode UI test:
testActionsAndNavigationhas not been checked - Version 1.3.1: it only reached release candidates, so its change (the experimental builder behind a toggle) ships here (#993)
Requires
- iOS or iPadOS 26 or later
- To build NVN games on a Mac: Xcode 27.2 and macOS 26.6 or later
中文
重点
- Mac 上有浅色和跟随系统两种外观,设置分为四个部分,游戏选项分为四组
- 手动开始的构建队列、直接安装已构建游戏、游戏数据传输、存档导入导出、玩家和云存档冲突的选择
- 适合沙发使用的主机模式:主页行、游戏页面、搜索、构建,以及能让游戏在后台暂停的 Home 菜单
- 支持的游戏列表、摇杆死区和新语言:西班牙语、韩语和巴西葡萄牙语
代码来自 @thehobbit85、@Haseenesss、@zatteogit、@Koshindai、@loki-inu、@rborkow、@LNPANDY、@ZhaowTao、@MartinMajewski、@mbanusic、@TeeJayBaker 和 @yazzang-homelab。主机模式的概念来自 @Koshindai(#816),手柄操作和 Home 菜单来自 @Haseenesss(#901、#952)。想法来自 @IUMonster(#658)和 @zatteogit(#453)。
新增
- 批量构建队列与安装已构建游戏:「构建所选游戏」先进入队列供手动开始,iOS 批量构建只在最后签名安装一次,直接安装新增无需重编的「安装已构建游戏」(#1211)
- macOS 游戏模式:Mac 端新增单游戏启动选项(#1189、#1069)
- 与已测试值不同的设置会被标出:旁边会显示一个圆点,“Use tested values” 可将其恢复(#453,@zatteogit)
- 支持的游戏:可从游戏库标题栏和主机模式进入,并显示每个游戏的封面(#1129、#1140、#1195)
- 从安装包读取游戏名称:启动器自己从安装包读取游戏名称、包内版本号和控制数据,识别改名的 XCI 文件,并提供可关闭的跳过文件提示条(#1125、#895、#1172、#1195、#1212)
- 构建前预检与签名上限提示:构建开始前检查密钥与磁盘空间,并对 Apple 错误
9120说明免费账号每周 10 个 App ID 的限制(#1170、#1188) - iPhone 和 iPad 外壳:存档、玩家、数据目录诊断、每个触控按键的按住或切换模式(想法来自 @IUMonster,#658)、Switch 2 标记、云存档检查和 Steam Link 回退。手柄的 Options 键可以打开外壳设置,游戏内菜单使用玩家的语言(#1129、#1164)
- 启动器的无障碍支持:标签、原生开关和「减少动态效果」(#627、#628、#629,@zatteogit)
- 设置齿轮会淡出:使用手柄时,iPhone 和 iPad 上的齿轮在空闲 3 秒后隐藏(#1029)
- 以主机模式结束的构建会被记录(#950,@Haseenesss)
变更
- 引擎:固定点依次升到
81906931(Switch 2 手柄、mesh object function、M1 iOS 构建,#1063)、ab41d6a1(#1125、#1142)和ccd834e0(再跟进上游 56 个提交,包含原生 HID 首按加入、时之笛 NDVE 视频直接缩放与回退应用图标,#1193、#1196)。引擎不再需要 .NET(#1125),并在蓝牙 Joy-Con 原生自动配对后移除过时的手动拆分开关(#1220) - 实验版引擎永远不会比稳定版旧:它没有领先时,引擎更新一行会这样说明,并提供「回到稳定版」(#1127、#1095)
- 实验性构建器:仍放在功能开关后面,暂时关闭(#993)
修复
- Super Mario Party 渲染队列崩溃:
post_put在扩容至 1024 槽位的队列满时等待未消费槽位,不再覆写未完成的 fence(#1220、seedds/nxnative#2469) - Joy-Con:驱动、IMU 轴、陀螺仪、配对蓝牙手柄左右独立 Core Haptics 震动通道及单只拆分手柄的震动路由修复(#1072、#1074、#1075、#1083、#1158、#1220、seedds/nxnative#2472)
- Pro Controller 被算作两个:一个 Pro Controller 重新算作一个手柄,并保留陀螺仪(#972、#971,@Haseenesss)
- 外置 ExFAT 磁盘与构建后清理:ExFAT 卷回报剩余空间为 0 时回退使用
statfs(#1185、#1155),并在构建完成后清理重复的romfs.img与暂存文件(#1146、#1148) - 着色器拆分卡在 99%:zstd 在进程内解压(#1037、#837,@Haseenesss)
- PATAPON 和 Hogwarts Legacy 在启动时中止:现在提供
nsd:a和nsd:u(#1038,@Haseenesss) - iOS 版 Pokopia:没有预热种子列表也能打包(#926,@thehobbit85)
- 在 iPhone 或 iPad 上退出游戏:完整释放资源并回到游戏库,隔离多游戏间的
DmShellGameObjective-C 类并保留未对齐的__bss快照(#986、#1163) - iOS 游戏数据书签与分卷文件:修复安全作用域书签生命周期、
.nxpart偏移溢出与所选磁盘子目录识别(#1150) - 重新签名与外壳安装:强制使用新的 7 天描述文件并实时刷新到期时间,补齐安装进度、原子回滚与后台保存 IPA,保留游戏库状态,并在删除游戏后重新生成 Xcode 工程(#1028、#1032、#978、#1160)
- Mac 构建进度与游戏库竞态:修复
psoArchiveProgress中弱链接Date.>=导致的崩溃(#1187、#1131)、--shell-framework离线 PSO 进度上报(#1154)、流式 UTF-8 解码与安装停止(#1159)、游戏库代数保护与全局密钥回退(#1166)、封面缩略图位图包装(#1147)以及着色器进度冗余计数并保持剩余时间可见(#1212) - 更新面板:说明构建运行时按钮为什么不可用(#1061)
- Dock:关闭最后一个窗口后可以再次打开窗口(#1065)
- 复制进度条:游戏数据复制进度条在字节数出来之前保持不确定状态(#1066)
- 焦点环:「开始」和游戏设置按钮的焦点环变圆(#1067)
- 主图横幅:底部 1 像素的亮线消失了(#1001)
- 损坏的 NUP 或 RomFS:构建会以明确的原因停止,并校验 NUP 目录(#1130)
- 测试窗口:不再播放可能让线程永远卡住的淡入淡出(#1121,@Fbenhaddou)
- Windows、Qt 前端:带 Zlib 或 LZ4 内联着色器的 Unreal 游戏、Oodle 和 LZ5 解码器、离线处理 LÖVE 和 GameMaker 着色器、离线处理运行时 GLSLC 着色器、由 @yazzang-homelab 提供的通过临时文件传递大进程池结果与工作进程池映射及
ld64.lld搜索跳过无权限PATH目录、归档解压配额加固、终止构建进程树、后台复制磁盘数据、过长的链接命令行、精简 IPA 的 RomFS 标识(@taowen)、LLVM 下载、Python 安装器、一键 Defender 排除,以及 es、ko、pt-BR 的%ld%%和封面回退(#932、#935、#956、#970、#974、#979、#995、#1039、#1045、#1046、#1064、#1084、#1134、#1152、#1162、#1171、#1173、#1177、#1190)
已知问题
- 没有用真实设备测试:真实的 Steam Link(#797、#987)、LiveContainer(#1049)、向设备传输大型游戏数据(#899、#1036)以及游戏运行时的 Home 菜单暂停(#952)
- 从安装包读取游戏名称:没有在启动器自己读取名称之前打包的游戏安装包上检查过(#1125)
- 主机模式界面测试:
testActionsAndNavigation尚未检查 - 1.3.1 版本:它只到过候选版本,所以它的改动(实验性构建器放在开关后面)随本版本发布(#993)
系统要求
- iOS 或 iPadOS 26 或更高版本
- 在 Mac 上构建 NVN 游戏:Xcode 27.2 和 macOS 26.6 或更高版本
Install: download NX2Apple-macOS-arm64.zip, unzip, drag it to Applications. 中文:下载后解压,拖进「应用程序」。
What's Changed
Fixes
- Update sheet: say why the button is off while a build runs by @v0lumehi in #1061
- Open a window from the Dock after the last one was closed by @v0lumehi in #1065
- Windows: pass a long link command line to clang in a response file by @v0lumehi in #1064
- Keep the game data copy bar indeterminate until bytes are done by @v0lumehi in #1066
- Round the focus ring of the Play and game settings buttons by @v0lumehi in #1067
- Patches of the UI overhaul are forwarded to seedds/nxnative by @v0lumehi in #1099
- Engine: bump the pin to ab41d6a1 by @v0lumehi in #1125
- Make every view of the UI overhaul reachable by @v0lumehi in #1129
- Tests restore the appearance setting they change by @v0lumehi in #1136
- Mac launcher: stage batch builds manually, install iOS batches once, and add Install built games by @LNPANDY in #1211
Features
- Hide the experimental builder behind a feature toggle, off for now by @v0lumehi in #993
- Honor accessibility Reduce Motion in launcher controls by @zatteogit in #629
- Include setting name in row reset accessibility label in LaunchOptionsView by @zatteogit in #628
- Provide native switch accessibility representation and labels in LaunchOptionsView by @zatteogit in #627
- Engine: bump the pin to 81906931 (Switch 2 controllers, mesh object function, M1 iOS build) by @v0lumehi in #1063
- Supported games show each game's cover by @v0lumehi in #1140
Patch queue and engine
- Serve nsd:a and nsd:u in the engine (PATAPON, Hogwarts Legacy abort at boot) by @Haseenesss in #1038
- Mac: one Pro Controller is one pad again, so it keeps its gyro (#971) by @Haseenesss in #972
- Shader split: decompress zstd in-process, so the split no longer hangs at 99% (patch of seedds/nxnative#1463) by @Haseenesss in #1037
- Allow Pokopia iOS packaging without a prewarm seed list by @thehobbit85 in #926
- iOS shell: return to library on quit with full host and GPU teardown by @LNPANDY in #986
- iOS: fade out the settings gear after 3 idle seconds with a controller by @LNPANDY in #1029
- Refresh patches 0053 and 0103 for upstream 8190693 by @LNPANDY in #1075
- patches: align 0074 Joy-Con 1 split/grip driver with upstream pad_hid and dm_joy APIs by @LNPANDY in #1074
- hid: report vibration device info for startup handles and route iOS haptics on slot attach by @LNPANDY in #1072
- patches: backport Splatoon Raiders resplit shader tables (#1071) by @LNPANDY in #1120
- patches: fix Joy-Con 1 IMU axes, gyro rest bias, L+R merge and non-zero six-axis guard by @LNPANDY in #1083
- patches: report offline PSO batch and build steps during --shell-framework by @LNPANDY in #1154
- Engine: fix input, haptics, teardown and BC edge alignment bugs by @LNPANDY in #1158
- iOS shell engine: isolate DmShellGame ObjC classes/exports and preserve unaligned __bss snapshots by @LNPANDY in #1163
- Engine: bump the pin to ccd834e0 by @LNPANDY in #1193
- Fix post ring overwrite, paired Joy-Con haptics, and obsolete split toggle by @LNPANDY in #1220
Documentation
- Version 1.4.0, changelog and release notes by @v0lumehi in #1141
- Docs: update v1.4.0 release notes and changelogs through #1220 by @LNPANDY in #1219
Other changes
- Library: eliminate 1px bright seam at the bottom edge of the hero banner by @LNPANDY in #1001
- Record a build that ends in console mode by @Haseenesss in #950
- frontend-qt: fix AttributeError on profile_guess.oodle_packs in split_shaders (#989) by @LNPANDY in #995
- frontend: force fresh 7-day profile on re-sign and live-refresh expiry by @LNPANDY in #1032
- frontend: show iPhone activity title and preserve library state during iOS re-sign by @LNPANDY in #1028
- frontend-qt: complete Windows Python onboarding when Python is already installed by @LNPANDY in #1084
- Stop test windows playing a fade that can hold a thread for good by @Fbenhaddou in #1121
- Launchers: format positional %ld%% in Qt and wire es, ko and pt-br artwork and title fallbacks by @LNPANDY in #1134
- Launcher: verify NUP TOC SHA-256 and classify damaged NUP/RomFS format build stops by @LNPANDY in #1130
- iOS shell: add data folder diagnostics, cloud save gate, Joy-Con/touch controls, and signing alert by @LNPANDY in #1164
- Qt launcher: kill build process tree, background drive copy and show all onboarding deps by @LNPANDY in #1152
- Qt launcher: harden archive unpack quotas, Windows engine contracts, and library UX by @LNPANDY in #1162
- iOS shell: fix bookmark scope lifecycle, part-offset overflow and picked drive subfolders by @LNPANDY in #1150
- Mac launcher: wrap decoded artwork thumbnails in NSBitmapImageRep by @LNPANDY in #1147
- Mac launcher: fix streaming UTF-8 decoding, process tracking, save env, preflight and install stop by @LNPANDY in #1159
- Mac launcher: wire shell install progress, background IPA save, and atomic rollback by @LNPANDY in #1160
- Mac launcher: add library/cover generations, global keys fallback, and bare 0400 TitleIDs by @LNPANDY in #1166
- Mac launcher: add key and disk preflight guards, streaming setup progress, and build UX refinements by @LNPANDY in #1170
- Mac launcher: identify renamed XCI packages and surface skipped file and unverified game diagnostics by @LNPANDY in #1172
- Qt launcher: clean up duplicate RomFS and build staging files after a build by @LNPANDY in #1146
- Mac launcher: clean up duplicate RomFS and build staging files after a build by @LNPANDY in #1148
- Windows: skip a PATH folder that refuses stat in the ld64.lld search by @yazzang-homelab in #1173
- Windows: run a pool's map on worker processes by @yazzang-homelab in #1177
- Mac launcher: fall back to statfs when volume free space reports 0 (#1155) by @LNPANDY in #1185
- Mac launcher: avoid weak-imported Date.>= crash in psoArchiveProgress (#1131) by @LNPANDY in #1187
- feat(launcher): explain Apple error 9120 10-App-ID weekly signing limit by @LNPANDY in #1188
- Mac launcher: add per-game macOS Game Mode launch option (#1069) by @LNPANDY in #1189
- fix(win): guarantee big_result spool cleanup and avoid double pickling by @LNPANDY in #1190
- Mac launcher: polish Light appearance, settings controls, unbuilt versions, and supported covers by @LNPANDY in #1195
- Launchers: follow up on the ccd834e06a39 engine bump by @LNPANDY in #1196
- Launcher: dismissable skipped-files banner and visible shader ETA by @LNPANDY in #1212
New Contributors
- @Fbenhaddou made their first contribution in #1121
- @yazzang-homelab made their first contribution in #1173
Full Changelog: v1.3.0...v1.4.0