您的位置:常州熱線首頁 > 區塊鏈 > 正文

内蒙古11选5:macOS 下 Electron 程序的簽名及公證

内蒙古11选5 www.gafob.com 自 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},

其中 entitlements.mac.plist 文件的內容為:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "//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 中手動添加密碼項。

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 程序已經簽名及公證成功了。

來源:

{ganrao}