github LNPANDY/NX2Apple v1.4.0
v1.4.0: The launcher overhaul with a console mode / 启动器大改版与主机模式

2 hours ago

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 9120 explains 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) and ccd834e0 (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_put waits 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 statfs when macOS reports zero bytes on ExFAT (#1185, #1155), and builds clean up duplicate romfs.img and 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:a and nsd:u are 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 DmShellGame Objective-C classes and preserved unaligned __bss snapshots (#986, #1163)
  • iOS game data bookmarks and split parts: fixed security-scoped bookmark lifecycles, .nxpart offset 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 in psoArchiveProgress (#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 PATH entries skipped during ld64.lld lookup 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: testActionsAndNavigation has 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

中文

重点

启动器大改版(#1097、#1129)

  • 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 上退出游戏:完整释放资源并回到游戏库,隔离多游戏间的 DmShellGame Objective-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

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

Full Changelog: v1.3.0...v1.4.0

Don't miss a new NX2Apple release

NewReleases is sending notifications on new releases.