在一顿猛如虎的Electron签名操作后,打出来的包发送给他人进行测试时,发现别人安装不上🙄(自己的电脑是没问题的,之前安装过未签名打包出来的应用的电脑也是没问题的,必须是一个之前未安装这个应用的电脑才会复现)。。。
提示如下:
而在签名前虽然也是有问题的,它会提示“打不开“XXX”,因为它来自身份不明的开发者”,但是至少通过设置是可以安装成功的。
可以去设置->安全与隐私->通用栏目下面点击仍要打开,或者设置安装选项为允许任何来源(如果没有该选项可以在终端中执行sudo spctl --master-disable
)
但是现在的这个提示问题,以上设置都没有用,是因为从MacOS 10.14.5开始,App都要进行公证(Notarization),否则将触发苹果的Gatekeeper,阻止用户安装你的App。这意味着,除了对 App 进行签名,还需要对其进行公证。
前面已经签名完成了,那么下面开始介绍如何对应用进行公证(notarize app)。
通过一番google后,发现大部分的公证方法都是使用electron-notarize,配置一个notarize.js,然后在electron-builder的时候通过afterSign钩子去执行这个文件。
具体可以参考:
macOS 下 Electron 程序的签名及公证
感觉这个方法有些麻烦,并且我们的应用并不需要上传到AppStore,而是挂到官网的下载页面,让用户点击下载dmg文件进行安装使用。
因此我这里是使用的另外一种方法:通过一句命令行语句直接对dmg文件进行公证😄
参考(不知道哪个是原著了):
一:Mac Electron 应用的签名(signature)和公证(notarization)
二:Mac Electron 应用的签名(signature)和公证(notarization)
公证(每次只需执行这一个命令即可)
xcrun altool --notarize-app --primary-bundle-id "com.xxx.xxx" --username "your developer appleid" --password "app-password" --asc-provider "ProviderShortname" -t osx --file xxx.dmg
- primary-bundle-id
自己app的bundle id - username
苹果开发者ID(账号) - password
应用专用密码。(登录appleid.apple.com,然后找到创建app password的地方,创建一个应用专用密码,这样可以避免暴露真实的密码。) - asc-provider
证书提供者。查询命令如下:
查询证书提供者
xcrun altool --list-providers -u "your developer appleid" -p "app-password"
- u
苹果开发者ID(账号) - p
应用专用密码。(同上)
查询出来的ProviderShortname和WWDRTeamID是一样的值,就是它。
公证成功后显示结果
No errors uploading 'xxx.xxx.dmg'.
RequestUUID = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
显示所有上传到苹果的包
xcrun altool --notarization-history -u "your developer appleid" -p "app-password"
- u
苹果开发者ID(账号) - p
应用专用密码。(同上)
查单个记录(里面有日志,公证失败可查看)
xcrun altool --notarization-info bfd6682e-49bc-4e82-ba8f-cdf0e8668502 -u "appid" -p "app-password"
- notarization-info
查询出来的上传记录的id - u
苹果开发者ID(账号) - p
应用专用密码。(同上)
遇到的问题
如何创建应用专用密码
请自行google,或参考:
怎样为Apple ID创建应用专用密码
需要注意,如果是苹果开发者账号是公司(company)类型,那么需要拥有最高权限的管理员账号才可以进行操作,其他普通管理员或者开发成员没有权限。
公证命令执行等待很长时间没有反应
我一般都是开着翻墙的代理的,毕竟是给苹果上传东西。一般时间在一两分钟、两三分钟的样子。
偶尔遇到过很久没有反应的情况,可能是网络不好,可以再开启终端代理试试。
export http_proxy=http://127.0.0.1:1081;
export https_proxy=http://127.0.0.1:1081;
如果再不行就多等等吧。。。总之最后都是成功了的~
执行公证命令报错:code -18000 (Cannot proceed with delivery: an existing transporter instance is currently uploading this package)
参考:
链接一
链接二
看很多答案说到了两种不同的目录,我也分不清是哪个起作用了,所以两个都执行吧,肯定没问题~😂
rm ~/Library/Caches/com.apple.amp.itmstransporter/UploadTokens/*.token
rm ~/.itmstransporter/UploadTokens/*.token
签名错误 Error: Could not get code signature for running application
参考:github issues
在项目的根目录下执行:
codesign --deep --force --verbose --sign - node_modules/electron/dist/Electron.app