打包 .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: /Applications

entitlements.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)改动后都必须重新签名并重新公证;不要手动修补已签名的包。