不走 App Store:macOS 应用的签名、公证与自更新
Pier 和 Diskly 的独立分发实践:Developer ID、notarytool、Sparkle、Homebrew tap。
我的两个 macOS 工具 Pier 和 Diskly 都没上架 Mac App Store,走的是独立分发。这篇把整条链路记下来。
为什么不上架
不是不想,是不能:Pier 的核心功能是查端口、看进程、结束进程,靠 lsof 和 ps 读取其他进程的信息——App Sandbox 明确禁止这类行为,而沙盒是 MAS 的硬性要求。Diskly 要扫整块磁盘,同样和沙盒模型冲突。
独立分发的代价是自己搞定信任链、更新和收款,好处是功能不受沙盒阉割、定价和退款政策自己说了算、没有 30% 抽成。
信任链:签名 + 公证 + 装订
macOS 对非商店应用的最低要求是三步,缺一步用户打开时就会被 Gatekeeper 拦下:
- Developer ID 签名:
codesign用 Developer ID Application 证书签整个 .app; - 公证:
xcrun notarytool submit把 DMG 传给 Apple 扫描,几分钟出结果; - 装订:
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。对独立开发者来说,这是一笔一次性投入、长期摊薄的成本。