跳转至

Swift 应用交接

决策

不存在从 Swift 到 Rust 的数据迁移,但旧应用会直接更新到新应用(Kit,2026-11-02:“必须让所有人都迁移过来”)。2.3.1 和 Swift Hex 都使用相同的 EdDSA 密钥运行 Sparkle 2.9.4,因此它们的订阅源提供已发布的 Hex.app,安装更新会用该应用替换旧应用。参见 旧版更新。

  • 不要导入 Swift 的设置、历史记录、音频、模型或其他数据。
  • 未经用户点击“安装更新”,不会安装任何内容,也不会删除任何内容。一旦设置就绪且监听器启动,anomaly.hex 会要求正在运行的旧版 Hex(见下面的已停用 bundle ID)退出,这样两者就不会响应同一个快捷键。
  • 不要采用 Swift 的 bundle identifier。
  • 不要移动或复制现有的 Rust 设置、模型或历史记录。
  • 窄化 TCC 例外:当 anomaly.hex 显示不受信任的“辅助功能”、“屏幕录制”或“系统音频录制”权限行时(或用户点击 "Still grey? Fix it"),它可以对已停用的 Hex bundle identifier(com.kitlangton.hex2、com.kitlangton.Hex、com.kitlangton.Hex.debug)运行 tccutil reset,以免“系统设置”中列出重复的 Hex 行,从而遮蔽新的授权。
  • 新的 Rust 用户完成常规设置,并下载所选的本机模型。

独立身份

Rust 应用名为 Hex,打包为 Hex.app,bundle identifier 为 com.kitlangton.hex2,可执行文件为 hex。其 Application Support 根目录为 hex。支持的平台仍为 Apple 芯片,要求 macOS 15 或更高版本。新的 bundle 身份需要重新授予 macOS 权限;仅更改显示名称并不会改变签名所有权。

Kit 的个人 Developer ID Application 证书(团队 QC99C9JE59)已获准用于此应用。发布前请明确提供 HEX_TEAM_ID 和匹配的 HEX_NOTARY_PROFILE;不需要 Anomaly 签名账号。

Swift 保留自己的 bundle 身份、沙盒数据以及 S3 更新订阅源。Intel 和 macOS 14 用户仍可继续使用 Swift,不会出现不兼容安装的提示。

在不区分大小写的卷上,两个应用文件名可能冲突。Finder 在手动安装时可能会询问是否替换现有应用;这仍然由用户决定,而不是自动迁移。开发安装程序拒绝替换目标,除非其 bundle identifier 是 Rust 标识符。用户应在新应用中听写之前退出旧应用,以免运行两个全局热键监听器。

旧版更新

Sparkle 2.9.4 会将新应用安装覆盖 2.3.1(HEX.app 或 Hex.app)以及 Swift Hex,原因如下:

  • 它能找到应用。 ZIP 中的 Hex.app 与旧应用的文件名或其 CFBundleName 加 .app 匹配(SUInstaller.m)。
  • 密钥验证通过。 旧应用包含 SUPublicEDKey,因此 Sparkle 在没有该密钥时拒绝更新;app/Info.plist 保留相同密钥,ZIP 使用其私钥部分签名。当团队不同时,EdDSA 校验通过即足够(SUUpdateValidator.m)。
  • 它不是降级。 新的 CFBundleVersion(30300 及以上)高于 2.3.1 的 20301 和 Swift 的 92。
  • 替换并非原子操作。 团队不同,因此 Sparkle 会将旧应用移开,再放入新应用,然后打开它。

每个订阅源获得一个条目,其 enclosure 为发布版的 Hex-<version>-macos-arm64.zip,包含来自旧密钥的 sparkle:edSignature、以新的 CFBundleVersion 作为 sparkle:version、15.0 作为 sparkle:minimumSystemVersion,以及 arm64 作为 sparkle:hardwareRequirements。无法运行新版 Hex 的 Mac 会保留其最后一个兼容版本。新版 Hex 以全新状态启动:新的权限、模型和快捷键。

旧版公告(已被取代)

Swift 0.8.5/build 92 已经附带了一个可关闭的链接,指向 Rust 应用。本次 Rust 发布不会发布另一个 Swift 构建,也不会更改其 S3 订阅源。下面的可选纯订阅源公告仍然是一个独立的未来行动。

优先采用 纯网站 Sparkle 更新,而不是另一个自定义 Swift 弹窗或桥接构建。随附的 v0.8.5 源码固定使用 Sparkle 2.9.4,它同时支持信息性条目和平台门槛。

在新签名应用和下载页面上线后,向现有 Swift S3 appcast 添加一个条目,同时保留所有现有发布版和构建产物:

  • link:https://github.com/anomalyco/hex,即公开下载页面。
  • sparkle:version:如果 93 仍未被使用,则预留;它必须高于已安装的 build 92。
  • sparkle:shortVersionString:公告发布时所宣传的公开 Rust 发布版;不要从本计划中复制过时的版本号。
  • sparkle:minimumSystemVersion:15.0.0。
  • sparkle:hardwareRequirements:arm64。
  • sparkle:minimumUpdateVersion:92。
  • 内嵌的发布说明解释独立安装、新的权限和模型设置、不迁移设置/历史记录,以及同名应用文件冲突。
  • 完全省略 enclosure,包括 delta enclosures。如果没有下载 URL,Sparkle 会将条目视为信息性内容。此订阅源中不包含任何 Rust 安装程序。

标准按钮是 了解更多...,它将打开页面并关闭窗口。跳过此版本会持久保留关闭状态。稍后提醒我、关闭窗口或打开网站都不会永久关闭该公告。手动检查更新可以再次显示已跳过的公告。这不是一个保证只出现一次的自定义模态框,appcast 文本也无法重命名标准按钮。

OS 和架构门槛在 Sparkle 2.9.4 中无需 enclosure 即可生效。较旧的 Sparkle 版本可能会忽略架构/最低更新版本门槛;不受支持的用户仍可能到达信息性页面,但绝不会自动安装。请在该页面上明确写出要求,并保留 Swift build 92 以用于兼容的旧版更新。不要将公告标记为关键更新,也不要重定向旧订阅源。

在发布之前,请验证实际分发的 Swift 捆绑包、自动和手动检查、跳过/提醒行为,以及受支持和不受支持的 Mac 配置。在新的已签名构建产物可用且这些行为得到验证之前,本公告仅是一份提案。

发布

通过 scripts/release-app.sh 准备并发布 Rust 版本,并通过 scripts/validate-app.sh 进行身份检查。先发布不可变的构建产物,再发布 R2 feed。手动安装的 DMG 中包含 Hex.app;Sparkle ZIP 则保留旧 Rust HEX.app 的归档名称。Sparkle 2.9.4 使用区分大小写的文件名或匹配的 bundle ID 来发现更新,因此同时更改两者会导致 2.0.x 安装无法发现更新负载。两个构建产物都包含相同的已签名、已附加公证的应用。在发布之前,验证经批准的签名身份和安装行为。不要假定权限或登录项注册在身份更改后仍然有效。

在新的构建产物可用后,单独发布旧版信息性 feed 条目。除非默认 Sparkle UI 被证明不足以满足需求,否则无需重建 Swift。不需要过渡归档、跨 feed 负载、偏好设置导入器或迁移回滚。

GitHub 交接

保留旧 Swift 仓库的历史、issue 和 release。在 README 中加入醒目的提示,并通过仓库网站链接引导用户访问 anomalyco/hex;只有在交接完成并明确批准后,才可归档旧仓库。不要用 Rust 源码覆盖其历史。由于 anomalyco/hex 已存在,实际进行仓库转移是另一个独立的决定;GitHub 不会自动合并两个仓库的 star、issue 和历史。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 hex19/hex