Electron-builder 果子签名与公证疑难杂症全攻略

本文将介绍从 0 到 1 如何把使用 Electron 的軟體进行签名(Code Sign)与公证(Notarize) ,打包工具使用的是 Electron-builder。 对了軟體不会在 Mac App Store 上架,本文不适合需要上架的读者。

开始前,你得拥有 Apple Developer Program 的相关权限与资格,如果没有还不赶紧去申请一个?

Apple 开发者账号申请

博主呢在申请开发者账号的时候也遇到了点小问题,应该算是 Apple Developer 部门的锅吧。在 App 提交个人信息后居然出现了错误,需要联系开发者支持部门进行后续操作。
那咱就拨过去呗,对方各种话术说的倒是很好听,不过也听了这么多年了。感觉还是解决问题才是最重要的。 他们换了三四个客服代表都不能解决这个问题,最后才肯帮我转到高级客服。到最后连高级客服都没办法解决了,说是给转到运营部门进行处理。但是处理没处理咱也不知道,咱就是过了几天收到了 Apple Developer 软件的更新。更完就正常了。

哦对了,再提一嘴。申请企业资格的账号需要邓白氏(Duns)编号,跟着果子的提示做就好了。果子甚至还给你买了个 800 块的加急服务。有钱就是好啊 不过我看淘宝网上也有卖这个加急服务的,难道是同一个渠道?赚了个信息差。。?

到这里你已经有了果子的开发者资格,然后去申请一个侧载的证书。按照网上说的是只需要给软件签名就好了,不需要给安装包也签名。所以我们只要一个 Developer ID Application 就好了

下载生成的证书到电脑,导入到钥匙串。且先导出证书为 p12 格式,后续需要用到。

有好奇的宝宝就要问了,为啥我的证书是显示不受信任啊。 这一步一定要解决,否则后面会报错证书链错误

我们来到这个地址 点我跳转 下载并按照刚才的方法导入证书。

导入完成后,证书应该是显示 此证书有效了。

Electron-Builder 的配置

这里没有太多技巧,直接修改配置文件就可以了

electron-builder.yml 关于 mac 的配置

1
2
3
4
5
6
7
8
afterSign: addon/notarize.js
---
mac:
entitlementsInherit: addon/entitlements.mac.plist
entitlements: addon/entitlements.mac.plist
icon: resources/icon/macos/icon.icns
gatekeeperAssess: false
category: public.app-category.utilities

/addon/entitlements.mac.plist 的配置

1
2
3
4
5
6
7
8
9
10
<?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-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
</dict>
</plist>

/addon/notarize.js 配置,需要安装 @electron/notarize

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
exports.default = async function notarizing(context) {
const { notarize } = await import("@electron/notarize");
const { electronPlatformName, appOutDir } = context;
if (electronPlatformName !== "darwin") {
return;
}
const appName = context.packager.appInfo.productFilename;
const applePwd = process.env.APPLE_PACKEDPASSWD;

if (!applePwd) {
console.log("环境变量 APPLE_PACKEDPASSWD 未设置或为空");
return;
}

console.log("开始对应用程序进行苹果公证,当前平台为:", electronPlatformName);

return await notarize({
appBundleId: "com.xxx.xxx",
appPath: `${appOutDir}/${appName}.app`, //打包后的放置app文件的命名和路径【固定写法】
appleId: "xxxxxxx",
appleIdPassword: `${applePwd}`, // Apple的专用密码,我这里写进env了
ascProvider: "xxxxx",
teamId: "xxxxx",
tool: "notarytool",
});
};

上面操作完直接 yarn build:mac 就可以了。请注意,mac 的公证是相当的长,网上其他博主说是 5 分钟,稍微比这个时间长了点。并不是有什么东西没有配置好,等着公证就好了。

哥们你没看错,就离谱到能签 6 小时。所以还是等着吧。能摸 6 小时鱼不爽吗?不过也不要怕,最近可能 iPhone16 发布,整个果子内部系统都是混乱的。第二天试了下大概 10-20 分钟搞定。

并且网络要求非常高,如果有某个片段因为网络问题没有上传,则会直接报错。

这里呢推荐使用 日本,美国 两地的线路进行上传,香港 ip 的好像会被解析到印度 aws 服务器,绕一大圈呢。