https://oldj.net/blog/2019/12/29/electron-builder-sign-and-notarize-for-macos

自 macOS 10.14.5 开始,应用程序必须要经过签名以及公证(notarize),否则默认情况下便无法直接运行,会弹出类似下面的警告:

即:

“Appname.dmg” can’t be opened because Apple cannot check it for malicious software.
This software needs to be updated. Contact the developer for more information.

或者中文提示:

无法打开“Appname.app”,因为无法验证开发者。
macOS 无法验证此 App 不包含恶意软件。

要解决这个问题,就需要对 Electron 生成的程序进行签名和公证。官方的文档中有关于签名的说明,有多种方法,我使用的是 electron-builder 工具,重点参考了 Notarizing your Electron application 这篇文章,但因为时间及各个依赖库的变化,这些文档以及文章上的内容也有一些需要调整。下面是我踩了一些坑后的配置记录。

本文中的方法主要基于以下依赖版本:

"dotenv": "^8.2.0",
"electron": "^6.1.7",
"electron-builder": "^21.2.0",
"electron-notarize": "^0.2.1",

准备工作

首先,你需要一个有效的 Apple 开发者 账号,目前注册这个账号需要年费 $99。

有开发者账号,之后,需要在苹果官网的开发者后台 Certificates, Identifiers & Profiles 那儿申请若干证书以及要发布的 App 的 Identifiers 之类,这个和其他 App 的流程类似,此处不再赘述。下面假设你已经有了对应的证书以及应用 id。

electron-builder 配置

electron-builder 的配置中,mac 及 dmg 部分主要内容如下:

mac: {...,gatekeeperAssess: false,identity: YOUR_IDENTITY,hardenedRuntime: true,entitlements: 'scripts/entitlements.mac.plist',entitlementsInherit: 'scripts/entitlements.mac.plist'
},
dmg: {...,sign: false
},

其中 YOUR_IDENTITY 为你的证书的标识。比如你在 KeyChain 中看到你的证书名称类似“Developer ID Application: XXXXX (YYYYY)”,如下图:

那个 XXXXXX 就是 YOUR_IDENTITY

另外,entitlements.mac.plist 文件的内容为:

<?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/></dict>
</plist>

到这儿,签名部分的配置就基本完成了。

公证(notarize)

这儿使用 Electron-notarize 对 Electron 程序进行公证。

首先要在你项目的 package.json 中最顶层添加以下配置:

"build": {"afterSign": "scripts/notarize.js"
}

此 notarize.js 文件的内容类似:

require('dotenv').config()
const {notarize} = require('electron-notarize')exports.default = async function notarizing (context) {const appName = context.packager.appInfo.productFilenameconst {electronPlatformName, appOutDir} = contextif (electronPlatformName !== 'darwin') {return}let appPath = `${appOutDir}/${appName}.app`let {appleId, appBundleId, ascProvider} = process.envlet appleIdPassword = `@keychain:Application Loader: ${appleId}`return await notarize({appBundleId,appPath,ascProvider,appleId,appleIdPassword})
}

注意其中有一些变量是从环境变量 process.env 中获取的。你可以使用传统的方式设置环境变量,也可以在当前工作目录下添加一个 .env 文件,其中以 key=value 的形式写入环境变量,一行一对 key/value 值。

几个变量的说明如下:

appleId

你的 Apple 开发者账号,即登录 https://developer.apple.com/ 的账号,通常是一个 Email 地址。

appleIdPassword

你的 Apple 开发者账号密码。出于安全考虑,建议不要直接将密码写在 .env 文件或环境变量中,这儿 有一些安全建议,比如使用专用密码等。

我这儿用的是 @keychain:Application Loader: ${appleId} 这样的形式,你可以先在 Application Loader 等程序中用你的开发者账号登录一次,并让 Keychain 记住你的密码。由于现在最新版 Xcode 中已经不包含 Application Loader 了,你也可以在系统的 Keychain 中手动添加密码项。

ascProvider

此项是选填的,如果你的开发者账号与多个团队关联,运行时可能会遇到以下错误:

Your Apple ID account is attached to other iTunes providers. You will need to specify which provider you intend to submit content to by using the -itc_provider command. Please contact us if you have questions or need help.

此时,就需要指定此项参数,它的值就是你在开发者后台看到的 Team ID 的值。

完成

到此,配置基本就完成了,此时正常运行 electron-builder 的命令,即可在打包完成之后继续进行签名、公证工作。需要注意的是公证部分需要将程序压缩包传到 Apple 服务器,需要保证网络畅通。

如果一切顺利,一会儿之后你会收到 Apple 给你发的提醒邮件:

此时,表明你的 Electron 程序已经签名及公证成功了。

macOS 下 Electron 程序的签名及公证相关推荐

  1. macOS下QT设置应用程序图标、程序坞图标

    1. 设置应用程序图标(finder中展示的图标) 在Qt助手(QT Assistant)中,输入"setting",可以看到下面的列表中有Setting the Applicat ...

  2. MacOS下qt签名与公证

    签名以及公证参考 简书参考 一.证书查看 security find-identity -p codesigning 二.签名 codesign -f -o runtime --timestamp - ...

  3. 51单片机在Ubuntu和MacOS下程序开发和下载

    这学期有51单片机课程,平时调试代码不用windows,查阅了一些资料,不太能用,现在将51单片机在ubuntu下(Linux通用)开发和下载说明一下:需要用到SDCC和stcgal. 推荐使用HML ...

  4. 巧用 XQuartz 实现在 macOS 下显示 Linux X11 图形化程序

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 在 Windows 中相信大家已经很熟悉使用 Xmanager(Xshell), MobaXterm, Secur ...

  5. Android 编程下获得应用程序的签名

    说明:应用程序的签名被封装在 packageInfo 中,所以我们要获得应用程序的签名就需要获得 PackageManager 来获得包含有签名信息的 packageInfo,再通过 packageI ...

  6. Electron教程(三)如何打包 electron 程序:electron-forge 的使用教程

    Electron教程(三)如何打包 electron 程序:electron-forge 的使用教程 Electron教程(一)什么是 Electron,由来.适用场景 和 Electron 的环境搭 ...

  7. qt linux mac,MacOS下Qt Installer Framework使用教程【个人经验】

    MacOS下Qt Installer Framework怎么使用?使用Qt Installer Framework之前,必须先下载它, 下载地址: 下载完成之后自己进行安装,安装之后,我们就可以开始进 ...

  8. css 注入,electron程序,如何在主进程远程页面中注入js及css?

    本博客不欢迎:各种镜像采集行为,请尊重知识产权法律法规.大家都是程序员,不要闹得不开心. 每日一篇的苏南大叔写代码教程,又来了.在本文中,苏南大叔描述的是,在electron程序加载远程页面的时候,如 ...

  9. MacOS下如何通过命令搜索文件和打开文件

    文章目录 find 命令 查找名称含有指定关键词的文件和目录 locate 命令 查找以指定字符串结尾的文件路径 查看命令 locate 的使用说明 mdfind 命令 查找名称中含有指定关键词的文件 ...

最新文章

  1. 随机森林OOB score作用
  2. speech codec (G.711, G.723, G.726, G.729, iLBC)
  3. 如何查看外网ip_内网ip和外网ip的联系以及连接过程
  4. linux c 获取 CPU、内存、IO、磁盘、网速
  5. word文档怎么限制编辑(禁止编辑、只读)?
  6. 分享:根据svg节点对象类型和路径值转换坐标值
  7. jQuery 处理xml
  8. HDU - 3338 Kakuro Extension(最大流+思维建边)
  9. 计算机关机又自动重启,为什么w7电脑关机后自动重启_w7电脑关机后自动重启怎么解决...
  10. 在原生js中的事件监听方法
  11. SpringBoot之静态资源访问
  12. 解决IE为7939.com的病毒~
  13. android studio导入eclipse项目各种问题,Android | 导入Eclipse项目到Android studio的问题解决全过程...
  14. KeyError: ‘segment_ids paddlehub中出现segement_ids错误解决方案
  15. PHP笔记-文件上传例子
  16. python豆瓣mysql_python操作mysql
  17. Python 集合定义及运算
  18. 详解NFS共享储存服务布署
  19. maven编译时出现读取XXX时出错invalid LOC header bad signature
  20. 【MFC开发(5)】单选按钮控件RADIOBUTTON

热门文章

  1. Not allowed to access normals on mesh ‘Combined Mesh (root: scene)‘ (isReadable is false...报错解决方法
  2. 华为路由器ws5200虚拟服务器,华为路由器配置dhcp怎么弄?华为路由WS5200设置DHCP服务器方法...
  3. cf网络不稳定或服务器异常,电脑玩穿越火线为什么提示网络环境异常 - 卡饭网...
  4. 关于x>y?x:y的含义
  5. PS之人物磨皮与特效(适用于商业海报)
  6. Linux网络之DHCP
  7. 大二的第一次社会毒打
  8. 如何学习微信公众平台开发?
  9. windows输入英文-搜狗输入法不提示很恼火怎么办
  10. 资料搜集-JAVA系统的梳理知识3-面试篇