Skip to content

v1.0.2: Export as IPA, the game data to a device or a drive, and Italian. / 导出 IPA、游戏数据到设备或硬盘,以及意大利语

Choose a tag to compare

@github-actions github-actions released this 03 Nov 09:50
· 361 commits to main since this release
e7b5a71

v1.0.2: Export as IPA, the game data to a device or a drive, and Italian.

English

Update note. Games you built before this update are rebuilt on the first Play, because the shader chain of the engine moved. This is the normal rebuild path and needs no action.

Highlights

Export as IPA and send the game data

  • The Install card of the Mac launcher has a switch: Install on device or Export as IPA
  • Export needs no device and no signing team. It writes an unsigned NX2Apple.ipa into the shell folder, for AltStore, SideStore or another tool you sign with
  • With the shared app, the game data is not in the IPA. Step 3 sends it to the app on a paired device, or copies it to a drive or a folder, with progress and Stop
  • What the IPA holds: Export as IPA has a choice. Shared app is the default. One game, all inside makes one IPA per game with the game data in it, for tools that cannot copy data into an app. It has its own bundle ID, org.nxnative.<title ID>, so its saves are separate (#542, #540)
  • Not tested end to end yet, see Known issues (#531, #416, #542)

New

  • Italian interface: the launcher and the iPhone shell speak Italian, by @Dino0005. The 38 texts of the export card, the texts of the new IPA choice and the two new texts shell.frameworkIncomplete and shell.gameLeftOut are a machine translation and wait for review (#528, #536, #539, #542)
  • A language is one JSON file: the Mac and the Windows launcher read the same language files, the language list comes from them, and a test per front end checks every file (#478, #479, #480, #481)
  • The iPhone shell speaks your language: its texts are lines of these files, and a game's settings rows show in your language (#482, #485, #429)
  • Recently played starts the game: a tap on a game under Recently played starts it, and the rows get more space (#457, #425)
  • Engine update: the engine pin moves to 65501fbb. By upstream's own notes the Mac gets TRIANGLE STRATEGY, Castlevania: Belmont's Curse, SUPER ROBOT WARS Y, Splatoon Raiders, Super Mario RPG and Fire Emblem Fortune's Weave. The Mac settings window leaves the screen on Play. The NSP script decodes AV1 movies with dav1d and reads gzip-wrapped shader archives. Digimon's saves appear. We did not play any of it (#536)
  • Engine patches: we dropped 0045 and 0052 because upstream took both changes. Upstream declined seedds/nxnative#492 (the runtime profile) and closed #755 and #839 for its own pointer hiding, so those patches stay in the queue as fork-only (#536)
  • Behind the scenes: the launcher's code moved into stores, with no visible change (#456, #458, #460, #462, #466, #467, #469, #471, #473, #476, #530). tools/bump_candidates.py lists the upstream commits of a pin bump that the front ends depend on (#465)

Fixed

  • A cut-off framework delete: quitting while the launcher removed a stale game framework, about a minute on an external drive, left half a framework in the shared app folder. The next build of another game then failed at Prepare the shared app with "no readable game.manifest.json". The delete is now a rename plus a background delete, mirror copies land only when complete, and an incomplete framework of another game is left out with a note that names the game and the missing file (#539)
  • Devices on Xcode 27.2: the device list is read again, after devicectl changed its layout (#496, #488)
  • exFAT volumes: the Finder ._ files no longer break the Mac app pack, patch 0057 by @lucaszhongsj (#521, #486)
  • Older game packages: legacy PFS0 packages without the final name terminator are read, patch 0058, and the rewriter recognizes pointer tail calls before zero padding, patch 0059. Both are by @BadAppleD (#520, #519)
  • Save to: the folder dialog of the Build tab can create folders, by @SifatTaj (#522)

Known issues

  • Export as IPA and Send game data are not tested end to end: nobody has run them on a real device or with a sideloaded app yet. The maintainers test them with this release candidate (#531)
  • One game, all inside is not verified with a sideloading tool: a very large IPA can fail to install, and we do not know the size limit (#542)
  • First Play after the update: built games are rebuilt, because the shader chain moved (#536)
  • Shader split at 99%: it can sit there for several minutes at its end while one worker finishes. It is not a hang (#489)
  • Open: Breath of the Wild fills the disk (#413). A Super Mario Odyssey shader step fails on an M1 with Xcode 27.2 (#361)

Requires

  • iOS or iPadOS 26 or later
  • To build NVN games on a Mac: Xcode 27.2 and macOS 26.6 or later

中文

更新提示。 更新前构建的游戏会在第一次点 Play 时重新构建,因为引擎的着色器链变了。这是正常的重建流程,无需任何操作。

重点

导出为 IPA,并发送游戏数据

  • Mac 启动器的安装卡片有一个开关:「安装到设备」或「导出为 IPA」
  • 导出不需要设备,也不需要签名团队。它在壳目录里写出未签名的 NX2Apple.ipa,供 AltStore、SideStore 或你自己签名用的其他工具使用
  • 使用共用 App 时,游戏数据不在 IPA 里。第 3 步把数据发送到已配对设备上的 App,或复制到磁盘或文件夹,带进度和停止按钮
  • IPA 里放什么:「导出为 IPA」多了一个选项。默认是「共用 App」。「一个游戏,全部在内」为每个游戏生成一个 IPA,游戏数据在里面,适用于无法向 App 复制数据的工具。它有自己的 Bundle ID org.nxnative.<title ID>,所以存档是独立的(#542、#540)
  • 尚未端到端测试,见已知问题(#531、#416、#542)

新增

  • 意大利语界面:启动器和 iPhone 壳 App 支持意大利语,作者 @Dino0005。导出卡片的 38 条文字、新 IPA 选项的文字以及两条新文字 shell.frameworkIncomplete 和 shell.gameLeftOut 是机器翻译,等待审校(#528、#536、#539、#542)
  • 一种语言就是一个 JSON 文件:Mac 和 Windows 启动器读取同一批语言文件,语言列表来自这些文件,每个前端各有一项测试检查每个文件(#478、#479、#480、#481)
  • iPhone 壳 App 使用你的语言:它的文字是这些文件里的行,游戏的设置行也以你的语言显示(#482、#485、#429)
  • 「最近玩过」直接启动游戏:点按「最近玩过」里的游戏会启动它,行距也更宽松(#457、#425)
  • 引擎更新:引擎固定点移到 65501fbb。出自上游的说明,Mac 上新增 TRIANGLE STRATEGY、Castlevania: Belmont's Curse、SUPER ROBOT WARS Y、Splatoon Raiders、Super Mario RPG 和 Fire Emblem Fortune's Weave。点按 Play 时 Mac 的设置窗口会离开屏幕。NSP 脚本用 dav1d 解码 AV1 视频,并能读取 gzip 包裹的着色器归档。Digimon 的存档会出现。我们没有玩过这些内容(#536)
  • 引擎补丁:补丁 0045 和 0052 已删除,因为上游采纳了这两项改动。上游拒绝了 seedds/nxnative#492(运行时配置),并以自己的指针隐藏关闭了 #755 和 #839,所以这些补丁作为仅限本 fork 的补丁留在补丁队列里(#536)
  • 幕后工作:启动器的代码改为按 store 划分,外观无变化(#456、#458、#460、#462、#466、#467、#469、#471、#473、#476、#530)。tools/bump_candidates.py 列出升级固定点时上游提交中前端所依赖的部分(#465)

修复

  • 中途中断的框架删除:启动器正在删除过期的游戏框架时退出(外置磁盘上约一分钟),会在共用 App 目录里留下半个框架。之后构建另一个游戏时,会在「准备共用 App」一步失败,提示「no readable game.manifest.json」。现在删除改为重命名加后台删除,镜像副本完整后才落位,另一个游戏的不完整框架会被排除在外,并给出说明,写明游戏名和缺少的文件(#539)
  • Xcode 27.2 上的设备:devicectl 改了布局之后,设备列表可以再次读取(#496、#488)
  • exFAT 卷:Finder 的 ._ 文件不再让 Mac 应用打包失败,补丁 0057,作者 @lucaszhongsj(#521、#486)
  • 旧版游戏包:缺少文件名表结尾终止符的旧版 PFS0 包可以读取,补丁 0058,重写器能识别零填充之前的指针尾调用,补丁 0059。两者作者均为 @BadAppleD(#520、#519)
  • 保存到:构建页的文件夹对话框可以新建文件夹,作者 @SifatTaj(#522)

已知问题

  • 「导出为 IPA」和「发送游戏数据」尚未端到端测试:还没有人在真机上或用侧载的 App 运行过。维护者会用这个候选版本测试(#531)
  • 「一个游戏,全部在内」没有用侧载工具验证过:过大的 IPA 可能安装失败,大小上限未知(#542)
  • 更新后第一次点 Play:已构建的游戏会重新构建,因为着色器链变了(#536)
  • 着色器拆分停在 99%:结尾时可能停留几分钟,因为有一个工作进程还在处理。这不是卡死(#489)
  • 仍未解决:《旷野之息》会占满磁盘(#413)。M1 上用 Xcode 27.2 时,《超级马力欧 奥德赛》的一个着色器步骤失败(#361)

系统要求

  • 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

  • Read devicectl devices from the new properties layout by @v0lumehi in #496
  • Fix the Chinese wording of the BC texture note by @v0lumehi in #524
  • Allow creating new folders in the Save to dialog of the Build tab by @v0lumehi in #522
  • Patch 0057: keep the Finder files of an exFAT volume out of the Mac app by @v0lumehi in #521
  • Patch 0058: read legacy PFS0 packages without rewriting game files by @v0lumehi in #520
  • Patch 0059: recognize unframed pointer tail calls before zero trap padding by @v0lumehi in #519
  • Shared app: a cut-off framework delete no longer breaks the next build by @v0lumehi in #539

Features

  • Tests: render in windows that are on no display by @v0lumehi in #513
  • Move the repository out of BuildModel into a RepoStore (#387) by @v0lumehi in #466
  • Move the engine selection, the engine sync and the engine failure into EngineSyncStore (#387) by @v0lumehi in #467
  • Move the dependency rows, the Python and dotnet paths and the installs into a DependencyStore by @v0lumehi in #469
  • Launcher: DeviceStore owns devices, teams, the install target and the shell copy flow (#387) by @v0lumehi in #471
  • Split BuilderView into cards, delete ContentView.swift (#387 step 8) by @v0lumehi in #476
  • The language list comes from the language files (#388, step 2) by @v0lumehi in #479
  • One rules test per front end for every language file (#388 step 3) by @v0lumehi in #480
  • Check that the code and en.json use the same keys, in both front ends (#388) by @v0lumehi in #481
  • iOS shell: a tap on a Recently played game starts it, and the rows get more space by @v0lumehi in #457
  • Move the Library page out of LauncherView.swift (under 800 lines) by @v0lumehi in #530
  • Mac launcher: export the shared app as an IPA and send the game data by @v0lumehi in #531
  • v1.0.2: version bump, changelog and release notes by @v0lumehi in #538
  • Export: one IPA per game with the game data inside by @v0lumehi in #542

Documentation

  • Release notes: v1.0.1 lists the stale frameworks prompt and the shell folder fix by @LNPANDY in #500
  • Agents: never sleep longer than 60 seconds by @LNPANDY in #504
  • Move the build log into a BuildLog store (#387) by @v0lumehi in #456
  • Move the pure logic into NXCore: TitleID, GameInputs, BuildProgress, Toolchain (#387 step 4) by @v0lumehi in #458
  • Add ProcessRunner and GitCheckout services to NXCore (#387, step 5) by @v0lumehi in #460
  • Take the no-long-sleeps rule out of AGENTS.md by @v0lumehi in #523

Other changes

  • Launcher: say an external output folder makes the first build slower (#505) by @LNPANDY in #507

Full Changelog: v1.0.1...v1.0.2