MacOS에서 Electron Builder로 구축된 Electron 어플리케이션에 대한 공증
18278 단어 electrondevelopmentnode
다음은 Electron Builder(22.7.0)과 Electron Notarize(1.0.0.0)을 사용할 때 맥OS에 공증을 설치하는 단계별 안내서입니다. 제가 애플 공증 서비스와 관련된 문제를 포함한 완전한 해결 방법입니다.진짜 슈퍼히어로처럼 도와줬으면 좋겠어요.🦸🏻♂️, 그래서 너의 시간과 정력은 다른 더 긴박한 일에 쓸 수 있다🦾.
약간 배경이 있어요.
바로 해결하고 싶으세요?🧐? 단계 가이드로 이동합니다.
왜 또 공증을 귀찮게 합니까?맥OS(그리고 Windows)에 운영체제는 악성 소프트웨어가 기계에 설치되고 운행되는 것을 방지하기 위해 각종 안전 메커니즘을 내장하였다.macOS와 Windows는 설치 프로그램과 바이너리 파일에 유효한 인증서를 사용하여 암호화 서명을 해야 합니다.그러나 맥OS에는 압축 파일을 보내는 것과 관련된 추가 구축 시 공증 절차가 있다.ANS(Appliance Archiving Service)를 통해 애플리케이션을 검증합니다.
대부분의 경우 전체 과정은 아프지 않지만, 나의 예에서, 즉 의존항과 제3자 이진 파일이 많은 전자 응용 프로그램은 그렇게 많지 않다🤕. ANS는 ZIP 아카이브가 필요합니다.응용 프로그램 패키지는 PKZIP 2.0 프로젝트를 사용하여 압축되며 맥OS와 함께 제공되는 기본 zip 유틸리티는 Electron Enrolize가 사용하며 일반적인 zip 알고리즘의 3.0 버전이 있습니다.이 둘 사이에는 몇 가지 현저한 차이가 있습니다. 제 뜻을 이해하기 위해 수동으로
.app
에 서명한 다음 다음 다음 명령을 사용하여 압축하십시오.zip
유틸리티, zipinfo
명령줄 도구 표시:zip
3.0 버전은 일반적인 ZIP 알고리즘을 사용합니다.__MACOSX
폴더를 포함합니다(예를 들어 일부 노드 모듈에서 발견).ditto
이 아닌 zip
을 사용하여 .app
패키지의 압축 아카이브를 만드는 것입니다.Ditto은 macOS와 함께 제공되는 명령줄 도구로 카탈로그 복제 및 아카이브 생성/추출에 사용됩니다.Finder(PKZIP)와 같은 방안을 사용하고 메타데이터를 보존하여 애플의 서비스와 출력을 호환시킨다.이 경우 Finder의 동작을 모방하는 ditto
의 옵션을 수행합니다.-c
및 -k
PKZIP 압축 파일 작성, —sequesterRsrc
메타데이터 저장(__MACOSX
), —keepParent
은 부모 디렉토리 이름 소스를 아카이브에 포함합니다.ditto -c -k —sequesterRsrc —keepParent APP_NAME.app APP_NAME.app.zip
Electron Builder의 공증 프로세스에 적용하려면 Electron 공증을 수정해야 합니다.응용 프로그램과 압축 절차를 '동상' 으로 사용합니다.이 작업은 Electron Builder 구성 파일에 정의된 "afterSign"훅을 통해 수행할 수 있습니다.너는 follow up essay에서 내가 왜 이런 방법을 선택했는지 이해할 수 있다.좋아했으면 좋겠어!
해결 방법 포함 macOS 응용 프로그램 공증 설정
시작하기 전에 먼저 code signing과 각종 지침에 따라 official documentation of Electron Builder을 정확하게 배치해야 한다.완전하게 보기 위해서, 나는 나의 경험과 다른 개발자의 뛰어난 업무에 따라 공증에 필요한 모든 절차를 열거했다.
.plist
파일을 만듭니다.우리의 예에서 다음과 같은 내용이 작용했다(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>
<!-- https://github.com/electron/electron-notarize#prerequisites -->
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<!-- https://github.com/electron-userland/electron-builder/issues/3940 -->
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
</dict>
</plist>
entitlements
과 entitlementInherit
옵션을 이전 단계에서 만든 .plist
으로 설정합니다.notarize.js
스크립트를 만들고 Electron Builder에서 .app
과 그 내용을 서명한 후에 실행합니다.Electron Builder 구성 파일에 정의된 빌드 디렉토리에 파일을 배치합니다.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: process.env.APP_BUNDLE_ID,
appPath: `${appOutDir}/${appName}.app`,
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_ID_PASSWORD,
});
};
"afterSign": "./PATH_TO_NOTARIZE_JS_IN_BUILD_DIRECTORY”
을 추가합니다.commons
모듈을 포함하고 이 모듈은 Electron Enjurize patcher가 가져온다..ts
파일은 다음과 같은 방법으로 ts-node
을 사용할 수 있습니다.ts-node -O {\"module\":\"CommonJS\"} scripts/patch-electron-notarize.ts
패치 자체는 build/node_modules/electron-notarize/lib/index.js
의 다음 코드를 교체하는 한 가지 작업만 수행합니다.spawn('zip', ['-r', '-y', zipPath, path.basename(opts.appPath)]
가지다spawn('ditto', ['-c', '-k', '--sequesterRsrc', '--keepParent', path.basename(opts.appPath), zipPath]
Dell 코드는 commons
(patcher-commons.ts
)입니다.import {promises as fsp} from "fs";
export type FileContentsTransformer = (content: string) => string;
export async function replaceFileContents(path: string, transformer: FileContentsTransformer) {
let fh: fsp.FileHandle | null = null;
let content: string = "";
try {
fh = await fsp.open(path, "r");
if (fh) {
content = (await fh.readFile()).toString();
}
} finally {
if (fh) {
await fh.close();
}
}
try {
fh = await fsp.open(path, "w");
if (fh) {
await fh.writeFile(transformer(content));
}
} finally {
if (fh) {
await fh.close();
}
}
}
및 패치(patch-electron-notarize.ts
):import {FileContentsTransformer, replaceFileContents} from "./common";
const ELECTRON_NOTARIZE_INDEX_PATH = "build/node_modules/electron-notarize/lib/index.js";
async function main() {
const transformer: FileContentsTransformer = (content: string) => {
return content.replace(
"spawn('zip', ['-r', '-y', zipPath, path.basename(opts.appPath)]",
"spawn('ditto', ['-c', '-k', '--sequesterRsrc', '--keepParent', path.basename(opts.appPath), zipPath]"
);
};
await replaceFileContents(ELECTRON_NOTARIZE_INDEX_PATH, transformer);
}
// noinspection JSIgnoredPromiseFromCall
main();
APPLE_ID
과 APPLE_ID_PASSWORD
환경 변수(단계 1에서 정의한 변수)를 설정합니다.너는 현지 기계에서 열쇠고리를 사용할 수 있다.세 개 배달
Piotr Tomiak()와 Jakub Tomanik()가 본문 초고를 읽어주셔서 감사합니다.
도구책
Reference
이 문제에 관하여(MacOS에서 Electron Builder로 구축된 Electron 어플리케이션에 대한 공증), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/christarnowski/making-notarization-work-on-macos-for-electron-apps-built-with-electron-builder-1i9k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)