打包 .app 与 dmg
口径说明
融云公开文档不覆盖 macOS 原生 SDK 与桌面交付链(dmg / 代码签名 / 公证 / 分发 / Gatekeeper);本页为本项目按 Apple 与 Electron 官方实践补齐的接入文档。
打包由 electron-builder 完成:`.app` 是应用本体(目录结构),`.dmg` 是面向用户的分发镜像。两者都需要正确配置 `appId`、图标、文件清单与 macOS 签名选项。
electron-builder 配置
Text
appId: com.example.mydesktop
productName: My Desktop
directories:
output: dist
buildResources: build
files:
- main.mjs
- preload.mjs
- renderer/**/*
- package.json
mac:
target:
- dmg
category: public.app-category.social-networking
icon: build/icon.icns
hardenedRuntime: true
gatekeeperAssess: false
entitlements: build/entitlements.mac.plist
entitlementsInherit: build/entitlements.mac.plist
dmg:
title: My Desktop
contents:
- x: 130
y: 220
- x: 410
y: 220
type: link
path: /Applicationsentitlements.mac.plist
Text
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>Electron 应用需要 JIT 与未签名可执行内存相关 entitlement;`network.client` 允许出站长连接。不要为了“省事”添加 `com.apple.security.cs.allow-dyld-environment-variables` 等过宽权限。
打包命令
Shell
# 产出 .app + .dmg(分架构)
npx electron-builder --mac --x64 --arm64
# 只产出未压缩目录,便于本地快速验证
npx electron-builder --mac --dir
# 查看 dmg 校验
hdiutil verify dist/My\ Desktop-0.1.0.dmg.app 目录结构
Text
My Desktop.app/
└── Contents/
├── Info.plist # bundle id / 版本 / 最低系统版本
├── MacOS/My Desktop # 主可执行文件
├── Frameworks/ # Electron Framework 与 Helper
├── Resources/
│ ├── app.asar # 打包后的应用代码
│ └── icon.icns
└── _CodeSignature/ # 签名信息(签名后生成)安装包验证清单
| 检查项 | 命令 / 方法 | 期望 |
|---|---|---|
| 可双击启动 | Finder 双击 `.app` | 正常出现窗口,无“已损坏”提示 |
| 架构正确 | `lipo -info "My Desktop.app/Contents/MacOS/My Desktop"` | x86_64(本机)/ arm64(CI 产物)/ 两者 |
| 签名存在 | `codesign -dv --verbose=4 "My Desktop.app"` | 显示 Authority 与 TeamIdentifier |
| 公证票据 | `spctl -a -vvv "My Desktop.app"` | accepted,source=Notarized Developer ID |
| dmg 可挂载 | `hdiutil attach dist/*.dmg` | 挂载成功,Applications 快捷方式存在 |
| 版本号一致 | `plutil -p "My Desktop.app/Contents/Info.plist" | grep CFBundleShortVersionString` | 与 package.json 版本一致 |
签名后再改包会失效
给 `.app` 内的任何文件(含 asar)改动后都必须重新签名并重新公证;不要手动修补已签名的包。