Quiet
  • 主页
  • 归档
  • 分类
  • 标签
  • 链接
  • 关于我

bajiu

  • 主页
  • 归档
  • 分类
  • 标签
  • 链接
  • 关于我
Quiet主题
  • NodeJs
  • Electron

MacOS 下 Electron 程序的签名及公证

bajiu
前端

2021-05-19 21:50:27

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

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

准备工作

首先,你需要一个有效的 Apple 开发者 账号

有开发者账号,之后,需要在苹果官网的开发者后台 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 中看到你的证书名称

另外, 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.productFilename
  const {electronPlatformName, appOutDir} = context
  if (electronPlatformName !== 'darwin') {
    return
  }

  let appPath = `${appOutDir}/${appName}.app`
  let {appleId, appBundleId, ascProvider} = process.env
  let 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 中手动添加密码项。

完成

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

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

上一篇

老式锅包肉

下一篇

实现宽高等比自适应矩形

©2024 By bajiu.