mac应用签名问题
- ad-hoc生成签名
- 为什么dev运行应用没有效果,要通过open?,open这个是什么命令
- 需要先打包构建,才能通过open来启动? 通过open的话,还支持热更新吗
ad-hoc
- ad-hoc 签名可以理解为 不使用 Apple Developer 证书,也不绑定开发者身份,只给
.app加一个本地代码签名
| 类型 | 需要 Apple Developer | 有开发者身份 | 可通知 | 可无警告分发 | 适合场景 |
|---|---|---|---|---|---|
| 未签名 | 否 | 否 | 不稳定/可能失败 | 否 | 不推荐 |
| ad-hoc | 否 | 否 | 通常可以 | 否 | 个人开发、本地测试、开源项目 |
| Developer ID | 是 | 是 | 可以 | 配合公证后体验最好 | 正式分发 |
ad-hoc 是如何生成签名的
- 本质是调用 macOS 自带的
codesign
codesign --force --deep --sign - "dist/mac/YourApp.app"
用 electron-builder 生成 ad-hoc 签名
- electron-builder 文档说明:如果没有有效证书,默认会跳过签名;如果要显式启用 ad-hoc signing,需要设置
mac.identity为"-"
为什么要通过 open 打开应用
open是 macOS 自带命令,用于打开系统应用- 使用open打开应用,相当于是打开一个真正的mac的 app应用
启动对比
| 启动方式 | macOS 眼里是什么 |
|---|---|
electron . | 一个临时 Electron/Node 进程 |
npm run dev | 开发进程 |
open YourApp.app | 一个真正的 macOS App bundle |
open配合热更新
- 先打包签名一次,之后复用这个 .app
外壳;renderer 通过loadURL(localhost)热更新- 热更新要用“签名 App + loadURL localhost”的混合开发模式来实现
mac应用更新的代码签名问题
- mac应用更新时,出现代码签名问题,导致无法完成更新
- Ad-hoc 签名 (
codesign --sign -) 是机器相关的,打包进 zip 再分发到另一台机器(或同一台机器的不同路径)解压后,签名就会失效。macOS 的 Gatekeeper / SIP 会在应用替换前验证代码签名,发现无效后直接拒绝
解决
- 正式签名 + 公证
- 需要 Apple Developer Program 账号($99/年)
- 创建 Developer ID Application 证书
- 在 electron-builder.yml 中配置签名
- 设置notarize: true
- 绕过签名codesign:
- 如果暂时不打算购买 Apple Developer 账号,可以在
electron-updater中跳过 macOS 的签名校验。但注意这样用户在安装/更新时可能遇到 Gatekeeper 警告,需要手动在「系统设置 → 隐私与安全性」中允许 - 绕过 ShipIt 签名验证,用独立脚本直接替换 .app
- ShipIt 是 macOS 应用自动更新机制里的一个 后台安装助手
- 生成独立 shell 脚本做
rm + cp + open,完全绕过 ShipIt- rm删除旧版本
- cp把新应用拷贝到 Applications
- open打开新版本应用
- 如果暂时不打算购买 Apple Developer 账号,可以在
旧(ShipIt 路径,已废弃):
下载 → ShipIt 验证签名 → ❌ ad-hoc 签名失效
新(直接替换路径):
下载 → 用户点击安装 → spawnReplaceScript()
├─ 写 shell 脚本到临时目录
├─ detached 执行脚本
│ ├─ sleep 2(等旧应用 exit)
│ ├─ rm -rf 旧 .app
│ ├─ cp -R 新 .app → /Applications
│ └─ open 新应用
└─ app.quit()