Electron은 v0.34.0 버전부터 앱 패키지를 Mac App Store(MAS)에 제출할 수 있게 되었습니다. 이 가이드는 애플리케이션을 앱 스토어에 등록하는 방법과 빌드의 한계에 대한 설명을 제공합니다.
참고: Mac App Store에 애플리케이션을 등록하려면 Apple Developer Program에 등록되어 있어야 하며 비용이 발생할 수 있습니다.
다음 몇 가지 간단한 절차에 따라 앱 스토어에 애플리케이션을 등록하는 방법을 알아봅니다. 한가지, 이 절차는 제출한 앱이 Apple로부터 승인되는 것을 보장하지 않습니다. 따라서 여전히 Apple의 Submitting Your App 가이드를 숙지하고 있어야 하며 앱 스토어 제출 요구 사항을 확실히 인지하고 있어야 합니다.
앱 스토어에 애플리케이션을 제출하려면, 먼저 Apple로부터 인증서를 취득해야 합니다. 취득 방법은 웹에서 찾아볼 수 있는 가이드를 참고하면 됩니다.
애플리케이션에 서명하기 전에, 먼저 개발 계정의 Team ID를 알아야 합니다. Team ID를 알아보려면 Apple Developer Center에 로그인한 후, 사이드바의 Membership을 클릭합니다. Team ID는 Membership Information 섹션의 팀 이름 밑에 위치합니다.
준비 작업이 끝난 후, 애플리케이션 배포 문서에 따라 애플리케이션을 패키징한 후 애플리케이션에 서명합니다.
먼저, 앱의 Info.plist
에 Team ID 를 값으로 갖는 ElectronTeamID
키를 추가해야
합니다:
<plist version="1.0">
<dict>
...
<key>ElectronTeamID</key>
<string>TEAM_ID</string>
</dict>
</plist>
그리고, 다음 두 자격 파일을 준비해야 합니다.
child.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.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
</plist>
parent.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.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<string>TEAM_ID.your.bundle.id</string>
</dict>
</plist>
TEAM_ID
부분은 Team ID로 치환하고, your.bundle.id
부분은 애플리케이션의 Bundle
ID로 치환해야 합니다.
그리고 다음 스크립트를 통해 애플리케이션에 서명합니다:
#!/bin/bash
# 애플리케이션의 이름.
APP="YourApp"
# 서명할 애���리케이션의 경로.
APP_PATH="/path/to/YourApp.app"
# 서명된 패키지의 출력 경로.
RESULT_PATH="~/Desktop/$APP.pkg"
# 요청한 인증서의 이름.
APP_KEY="3rd Party Mac Developer Application: Company Name (APPIDENTITY)"
INSTALLER_KEY="3rd Party Mac Developer Installer: Company Name (APPIDENTITY)"
# plist 파일의 경로.
CHILD_PLIST="/path/to/child.plist"
PARENT_PLIST="/path/to/parent.plist"
FRAMEWORKS_PATH="$APP_PATH/Contents/Frameworks"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Electron Framework"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libnode.dylib"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper.app/Contents/MacOS/$APP Helper"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper.app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper EH.app/Contents/MacOS/$APP Helper EH"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper EH.app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper NP.app/Contents/MacOS/$APP Helper NP"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper NP.app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$APP_PATH/Contents/MacOS/$APP"
codesign -s "$APP_KEY" -f --entitlements "$PARENT_PLIST" "$APP_PATH"
productbuild --component "$APP_PATH" /Applications --sign "$INSTALLER_KEY" "$RESULT_PATH"
만약 macOS의 샌드박스 개념에 대해 처음 접한다면 Apple의 Enabling App Sandbox 문서를 참고하여 기본적인 개념을 이해해야 합니다. 그리고 자격(plist) 파일에 애플리케이션에서 요구하는 권한의 키를 추가합니다.
그 외에 별로도 electron-osx-sign 모듈을 사용하여 직접 서명할 수도 있습니다.
앱 내부에서 사용한 네이티브 모듈도 서명이 필요합니다. electron-osx-sign
을
사용한다면, 인수 목록에 빌트인 바이너리 경로가 포함되어 있는지 확인해야 합니다:
electron-osx-sign YourApp.app YourApp.app/Contents/Resources/app/node_modules/nativemodule/build/release/nativemodule
참고로 네이티브 모듈이 의도하지 않게 중간 파일을 포함하는 경우도 있으며 이 파일은
포함되어선 안됩니다. (해당 파일에도 서명해야 할 수도 있습니다)
버전 8.1.0 전의 electron-packager 는, --ignore=.+\.o$
를 추가하여 이 파일을 무시할 수 있습니다. 8.1.0 버전 이후에는 기본적으로
무시됩니다.
애플리케이션 서명을 완료한 후 iTunes Connect에 업로드하기 위해 Application Loader를 사용할 수 있습니다. 참고로 업로드하기 전에 레코드를 만들었는지 확인해야 합니다.
위 과정을 마치면 애플리케이션을 심사를 위해 제출할 수 있습니다.
모든 애플리케이션 샌드박스에 대한 요구 사항을 충족시키기 위해, 다음 모듈들은 MAS 빌드에서 비활성화됩니다:
crashReporter
autoUpdater
그리고 다음 동작으로 대체됩니다:
또한 애플리케이션 샌드박스 개념으로 인해 애플리케이션에서 접근할 수 있는 리소스는 엄격하게 제한되어 있습니다. 자세한 내용은 앱 샌드박싱 문서를 참고하세요.
Mac 앱 스토어 빌드를 위해 앱에서 사용하는 Electron API에 따라 parent.plist
파일에
추가적인 기능에 대한 권한을 추가해야 할 수도 있습니다.
서버와 연결하기 위한 외부로 나가는 네트워크 연결 허용 활성화:
<key>com.apple.security.network.client</key>
<true/>
네트워크 리스닝 소켓을 열기 위한 내부로 들어오는 네트워크 연결 허용 활성화:
<key>com.apple.security.network.server</key>
<true/>
자세한 내용은 [네트워크 접근 활성화 문서][network-access] 를 참고하세요.
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
자세한 내용은 User-Selected 파일 접근 활성화 문서를 참고하세요.
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
자세한 내용은 User-Selected 파일 접근 활성화 문서를 참고하세요.
국가와 살고 있는 지역에 따라, 맥 앱스토어는 제출한 애플리케이션에서 사용하는 암호화 알고리즘의 문서를 요구할 수 있습니다. 심지어 U.S. Encryption Registration (ERN)의 승인 사본을 제출하라고 할 수도 있습니다.
Electron은 다음과 같은 암호화 알고리즘을 사용합니다:
ERN의 승인을 얻는 방법은, 다음 글을 참고하는 것이 좋습니다: 애플리케이션이 암호화를 사용할 때, 합법적으로 Apple의 앱 스토어에 제출하는 방법 (또는 ERN의 승인을 얻는 방법).