前言
在开发Electron应用并打包为Mac客户端时,许多开发者都会遇到一个令人头疼的问题:当用户尝试安装未签名的应用时,系统会提示"文件已损坏"或"无法验证开发者"的警告。传统解决方案需要支付每年99美元的苹果开发者账号费用进行签名认证。本文将介绍一种不需要苹果开发者账号的替代方案,帮助开发者绕过这些限制。(本人电脑芯片M1,本文针对打包arm架构,亲测Intel无需此操作)
问题根源
当Electron应用打包为Mac应用后,如果没有经过苹果的官方签名认证,用户在安装时会看到类似"无法打开'xxx.app',因为它来自身份不明的开发者"的警告。这是macOS Gatekeeper安全机制的一部分,旨在保护用户免受恶意软件侵害。
传统解决方案需要:
- 注册苹果开发者账号(99美元/年)
- 申请开发者证书
- 配置复杂的签名流程
- 进行公证(notarization)流程
替代方案实现
方案一:使用DMG安装包与自动化脚本
通过打包好的dmg安装包和自动化安装脚本来解决这个问题。在forge.config.js文件makes中添加or修改内容
以下是具体实现步骤(其余部分省略):
{
name: '@electron-forge/maker-dmg',
platforms: ['darwin'],
config: {
overwrite: true,
contents: [
{
x: 130,
y: 220,
type: 'file',
path: './out/xxx-darwin-arm64/xxx.app',
},
{
x: 410,
y: 220,
type: 'link',
path: '/Applications',
},
{
x: 130,
y: 100,
type: 'file',
path: './assets/双击此文件即可安装.command',
},
],
},
}
这个配置会在DMG中创建:
- 应用文件(xxx.app)
- 指向/Applications的快捷方式
- 一个安装脚本(.command格式的文件)
- 创建安装脚本
在项目assets目录下创建双击此文件即可安装.command
文件(文件名自己起,不想自己写粘过去直接用),内容如下:
#!/bin/bash
APP_NAME="xxx.app"
SRC_DIR=$(cd "$(dirname "$0")"; pwd)
DEST="/Applications/$APP_NAME"
# 拷贝到 /Applications(覆盖旧版本)
echo "正在复制 $APP_NAME 到 /Applications..."
cp -R "$SRC_DIR/$APP_NAME" /Applications/
# 解除隔离(注意:对目标路径操作)
echo "正在解除隔离属性..."
sudo xattr -rd com.apple.quarantine "$DEST"
# 打开应用
echo "正在启动应用..."
open "$DEST"
echo "安装完成,$APP_NAME 已移动到 /Applications 并解除隔离。"
这个脚本会:
- 将应用复制到/Applications目录
- 使用xattr命令解除苹果的隔离属性
- 自动启动应用
示例:
运行以下命令进行打包:这将生成一个包含应用和安装脚本的dmg文件
npm run make
方案二:终端命令解决方案
简单的终端命令来绕过安全限制
使用终端命令:
sudo xattr -rd com.apple.quarantine /Path/To/xxx.app
方案对比
方案 | 优点 | 缺点 | 适用场景 |
传统签名 | 完全符合苹果要求,用户体验好 | 需要付费开发者账号,流程复杂 | 商业应用分发 |
dmg+脚本 | 无需付费,实现简单 | 需要用户信任并运行脚本 | 内部测试或技术用户 |
终端命令 | 无需额外开发 | 对普通用户不友好 | 开发者自用 |
注意事项
- 安全性考虑:虽然这种方法可以绕过苹果的限制,但请确保你的应用是安全的,不要滥用这种技术分发恶意软件。
- 用户体验:这种方法仍然会显示安全警告,可能会影响部分用户的信任度。对于商业应用,建议还是使用官方签名方案。
- 系统版本:不同版本的macOS可能有不同的安全策略,需要测试你的目标系统版本。
- 自动更新:如果使用自动更新功能,需要注意appId必须保持一致,否则会被认为是不同的应用而无法更新。
结语
虽然苹果的签名机制增加了安全层,但对于个人开发者或内部工具开发来说,每年99美元的费用可能是一笔不小的开销。本文介绍的替代方案提供了一种折中的解决方案,特别适合以下场景:
- 个人项目
- 内部工具
- 开发测试阶段
- 预算有限的初创项目
对于需要正式发布的商业应用,建议花式走官方签名和公证流程,以提供最佳的用户体验和安全保障。
希望这篇文章能帮助到正在为Electron Mac应用打包发愁的开发者们!如果你有任何问题或更好的解决方案,欢迎在评论区分享。