데스크탑 앱 빌드 시 macOS에서는 코드사인 뿐만 아니라 notarize도 해주어야 한다.
Electron으로 빌드하고 코드 사인 및 Notarization을 하는 경우, Apple ID를 사용하여 Notarization을 자동화하려면 몇 가지 단계를 따라야 한다.
인증서 시트의 왼쪽 하단 "추가" 버튼(+)을 클릭하고 다음 인증서 추가:
"Apple Development" (개발용 애플 인증서)
"Apple Distribution" (배포용 애플 인증서)
1) appleid.apple.com에 로그인
2) 로그인 및 보안 섹션에서 '앱 암호' 선택
3) '앱 암호 생성'을 선택하거나 추가 버튼 클릭
4) 앱의 암호 필드에 앱 암호를 입력하거나 붙여넣기
환경변수로 apple_id, apple_id_password, team_id를 전달해주었다.
APPLE_ID_PASSWORD는 apple 계정 비밀번호가 아닌, 위에서 생성한 앱 암호
APPLE_ID=myAppleId
APPLE_ID_PASSWORD=myAppleIdPassword
TEAM_ID=myTeamId
...
.env #추가
...
{
...
"build": {
...
"afterSign": "./notarize.js",
"mac": {
"hardenedRuntime": true,
"gatekeeperAssess": false,
"category": "your.app.category.type",
"entitlements": "./entitlements.mac.plist",
"entitlementsInherit": "./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/>
<!-- https://github.com/electron-userland/electron-builder/issues/3940 -->
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
</dict>
</plist>
require('dotenv').config();
const fs = require('fs')
const path = require('path')
const electron_notarize = require('@electron/notarize');
module.exports = async function (params) {
if (process.platform !== 'darwin') {
return
}
console.log('afterSign hook triggered', params)
let appId = 'your_app_id'
let appleId = 'your_apple_id@example.com'
let applePassword = 'your_apple_id_password'
let teamId = process.env.TEAM_ID
let appPath = path.join(
params.appOutDir,
`${params.packager.appInfo.productFilename}.app`
)
if (!fs.existsSync(appPath)) {
console.log('skip')
return
}
console.log(
`Notarizing ${appId} found at ${appPath} with Apple ID ${appleId}`
)
try {
await electron_notarize.notarize({
appBundleId: appId,
appPath: appPath,
appleId: appleId,
teamId: teamId,
appleIdPassword: applePassword,
})
} catch (error) {
console.error(error)
}
console.log(`Done notarizing ${appId}`)
}
npm run build:osx
https://www.electronjs.org/docs/latest/tutorial/code-signing
https://github.com/electron/notarize
https://kilianvalkhof.com/2019/electron/notarizing-your-electron-application/?ref=funtoimagine.com