MacOS 10.14.5 Electron公证(Notarization)申请教程

Electron 10.14.5 公证(Notarization)申请教程

从MacOS 10.14.5开始,所有“新”开发人员签名的App都需要进行公证(Notarization),否则将触发苹果的Gatekeeper,阻止用户安装你的App。这意味着,除了对 App 进行签名,还需要对其进行公证。如果你尝试启动应在MacOS 10.14.5上未经公证的Appp,则会看到以下的错误消息:

15131563767422_.pic_hd

打不开“XXX.app”,因为 Apple 无法检查其是否包含恶意软件。

此软件需要更新。请联系开发者来了解更多信息。

出现这个错误的原因就是没有进行公证。那接下来就来介绍如何公证 Electron App。以下是Electron公证申请指南:

  1. 使用hardened runtime构建App

  2. 使用有效的开发者ID进行签名

  3. 使用electron-notarize公证App

  4. 不要签署你的dmg

我将使用electronic -builder: v20.43.0进行说明。

1. 使用 hardened runtime 构建App

在添加公证时,苹果偷偷加入了一项要求,即App的 runtime 必须是 hardened runtime ,这在默认情况下会减少应用程序的权限。这不一定是坏事,但还有一件事需要考虑。

在一个 hardened runtime 中App需要两件事:

  • 在 electron-builder的 mac配置选项中设置 "hardenedRuntime": true
  • 设定正确的权限。

如果运行 hardened runtime 时,则至少设置一个非常重要的权限:“allow-unsigned-executable-memory”。您可以在此处指定更多权限,但这是Electron App所需的唯一权限。此权限应包含在构建文件夹中的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>

在 electron-builder的 mac配置选项中,需要将entitlementsentitlementsInherits的值同时设置为上述文件的路径。通过entitlementsInherits这个配置可以授予Electron在内部访问权限文件时相同的权限。

"mac": {
  "entitlements": "build/entitlements.mac.plist",
  "entitlementsInherit": "build/entitlements.mac.plist"
},

2. 使用有效的开发者ID进行签名

只有当你的 Mac上安装了有效的开发人员ID时,才能对App进行公证。Electron-bulder将自动从钥匙串中获取一个有效 ID 进行签名。这就需要你有一个Apple的开发者账号。关于这一点,不再赘述。

但是,electron-builder使用的签名工具(electronic -osx-sign)会进行完整性检查以验证签名是否成功。在MacOS 10.14.5之前,这个完整性检查将返回True,但在MacOS 10.14.5 中,它会返回False。因为虽然签名进行完毕了,但应用程序还没有公证信息,所以会返回错False。

所以我们需要禁用这种完整性检查。你可以通过在electron-builder的mac配置中设置“gatekeeperAssess”:false来实现。

最后,我们来看下 mac 参数的配置情况吧:

"mac": {
  "hardenedRuntime" : true,
  "gatekeeperAssess": false,
  "entitlements": "build/entitlements.mac.plist",
  "entitlementsInherit": "build/entitlements.mac.plist"
},

3. 使用electron-notarize公证App

接下来则是关于公证的部分。我们使用的工具叫 Electron-notarize 。因为只需要在开发阶段使用,因此请将其安装到 devDependency。

这个工具可以完成公证的所有工作:将App打包并上传到Apple的服务器,等待公证成功,然后给App加入公证信息。这些流程是异步发送的,构建过程会增多不少时间。

App应该在签名之后,打包成DMG之前进行公证。Electron-builder 有一个afterSign的钩子,通过执行对应的 js 文件。这个配置选项在“build”配置中。

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

afterSign.js代码如下:

require('dotenv').config();
const { notarize } = require('electron-notarize');

exports.default = async function notarizing(context) {
  const { electronPlatformName, appOutDir } = context;  
  if (electronPlatformName !== 'darwin') {
    return;
  }

  const appName = context.packager.appInfo.productFilename;

  return await notarize({
    appBundleId: 'com.yourcompany.yourAppId',
    appPath: `${appOutDir}/${appName}.app`,
    appleId: process.env.APPLEID,
    appleIdPassword: process.env.APPLEIDPASS,
  });
};

我们只需要签署MacOS,所以如果我们不在darwin(macOS的内部名称)上,我们返回并且不运行公证代码。

我使用dotenv从.env文件中轻松获取环境变量,因此我不必将真实用户凭据添加到我的脚本中。如果您使用git,请务必将.env添加到.gitignore文件中。为了更好的安全性,请考虑使用此处概述的MacOS钥匙串:使用appleIdPassword时的安全性。

说到用户凭证。这是您的Apple ID,但是您需要生成一个特定于应用程序的密码(所以不要使用常规密码!)你可以在appleid.apple.com上创建一个。

4. 不要对dmg签名

在版本20.43.0之前,electronic -builder还签署了您的DMG安装程序。这实际上不是一个问题,但是在新的公证规则下,任何签署的东西都需要公证。

但是,如果对DMG安装包签名并公证,它实际上会触发之前看到的错误。这可能是 Apple 审核逻辑中的一个错误。既然这个错误存在,我们必须要使用未经过公证的DMG文件。Apple的Gatekeeper可以检测到DMG中的经过公证的.app文件,并且可以让用户正常打开App。

从electronic -builder 20.43.0开始,默认情况下DMG是无签名的。您可以通过在“dmg”配置中添加“sign”:false来显式地处理这种行为:

"dmg": {
  "sign": false
},

最后,回顾一下签名的配置文件吧~

// electron-builder.json
"mac": {
  "hardenedRuntime" : true,
  "gatekeeperAssess": false,
  "entitlements": "build/entitlements.mac.plist",
  "entitlementsInherit": "build/entitlements.mac.plist"
},
"dmg": {
  "sign": false
}
// package.json
"build": {
  "afterSign": "scripts/notarize.js"
}

鉴于国内关于 Electron 的讨论交流都不多,我建了一个 「Electron 技术研究小组」,欢迎点击扫描下面的二维码加入,共同研究 Electron 技术。
在这里插入图片描述


我是空谷,独立产品经理、全栈设计师、全栈工程师。
技术栈为 React/Dva/Umi/Node/Egg/Electron
欢迎扫码加我微信交流,备注来源:CSDN
kongguxs001

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值