macOS · 分发 · Pier · Diskly

不走 App Store:macOS 应用的签名、公证与自更新

Pier 和 Diskly 的独立分发实践:Developer ID、notarytool、Sparkle、Homebrew tap。

我的两个 macOS 工具 PierDiskly 都没上架 Mac App Store,走的是独立分发。这篇把整条链路记下来。

为什么不上架

不是不想,是不能:Pier 的核心功能是查端口、看进程、结束进程,靠 lsofps 读取其他进程的信息——App Sandbox 明确禁止这类行为,而沙盒是 MAS 的硬性要求。Diskly 要扫整块磁盘,同样和沙盒模型冲突。

独立分发的代价是自己搞定信任链、更新和收款,好处是功能不受沙盒阉割、定价和退款政策自己说了算、没有 30% 抽成。

信任链:签名 + 公证 + 装订

macOS 对非商店应用的最低要求是三步,缺一步用户打开时就会被 Gatekeeper 拦下:

  1. Developer ID 签名codesign 用 Developer ID Application 证书签整个 .app;
  2. 公证xcrun notarytool submit 把 DMG 传给 Apple 扫描,几分钟出结果;
  3. 装订xcrun stapler staple 把公证票据钉进 DMG,用户离线也能通过校验。

这套流程全部脚本化,发版就是跑一条 make 命令。

自更新:Sparkle + appcast

没有商店就没有自动更新,得自己带。Sparkle 是事实标准:应用内置一个 appcast.json 的地址,启动后检查新版本,用户点一下完成更新。安装包挂在一个公开的 GitHub Releases 仓库上,appcast 指过去即可,不需要自己的下载服务器。

安装渠道:官网 + Homebrew

除了官网下载 DMG,开发者用户更习惯 brew install --cask。维护一个 homebrew-tap 仓库,每次发版更新 Cask 里的版本号和 sha256,就多了一个零成本的分发渠道。

授权

两个应用都是一次性买断、多台设备、14 天试用。许可证校验后存钥匙串。经验是:试用期认准第一次启动的时间并做防回拨,其余不必做得太复杂——盗版治不绝,别为了防 1% 的人惩罚 99% 的付费用户。

小结

整条链路搭一次之后,发一个新版本大约是十分钟的事:构建、签名、公证、传 Releases、更新 appcast 和 Cask。对独立开发者来说,这是一笔一次性投入、长期摊薄的成本。