跳到主要内容

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
bash
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打开新版本应用
bash
旧(ShipIt 路径,已废弃):
下载 → ShipIt 验证签名 → ❌ ad-hoc 签名失效

新(直接替换路径):
下载 → 用户点击安装 → spawnReplaceScript()
├─ 写 shell 脚本到临时目录
├─ detached 执行脚本
│ ├─ sleep 2(等旧应用 exit)
│ ├─ rm -rf 旧 .app
│ ├─ cp -R 新 .app → /Applications
│ └─ open 新应用
└─ app.quit()