ElectronのアプリをAppStoreで配信する(2020年)

以前

h3poteto.hatenablog.com

こういう記事を書いた.

あれから1年半経ち,少し変わったことがあるので記事にしておく.

パッケージングは相変わらずelectron-packager

electorn-builderでもできなくはないのだが……

www.electron.build

ここに書いてあるオプションだけでは,現在使っているplistに対して,数が不足している.loginhelper.plist を指定する場所がない.

また,結局electron-builderだけでcodesignができないので,ちゃんとどこかでcodesignしてやる必要がある. そういうことを考えると別にelectron-packagerとたいして手間が変わらない.

codesignの対象が増えた

Whalebirdは現在,Electron v6.1.xを使っているが,この状態でのCodeSignでは,以前に比べてcodesignする場所が増えた.

新たに,

  • $APP Helper (GPU).app
  • $APP Helper (Plugin).app
  • $APP Helper (Renderer).app

に対して行う必要がある.

というわけでこんなスクリプトになる.

# Name of your app.
APP="Whalebird"
# The path of your app to sign.
APP_PATH="./packages/Whalebird-mas-x64/Whalebird.app"
# The path to the location you want to put the signed package.
RESULT_PATH="./packages/$APP.pkg"
# The name of certificates you requested.
APP_KEY="3rd Party Mac Developer Application: name (team_id)"
INSTALLER_KEY="3rd Party Mac Developer Installer: name (team_id)"
# The path of your plist files.
CHILD_PLIST="./plist/child.plist"
PARENT_PLIST="./plist/parent.plist"
LOGINHELPER_PLIST="./plist/loginhelper.plist"

FRAMEWORKS_PATH="$APP_PATH/Contents/Frameworks"

# At first, rename app.asar.unpacked directory.
# Because electron-builder does not store app.asar.unpacked directory.
# I want to store unpacked files at the same directory as electron-builder.
mv $APP_PATH/Contents/Resources/app.asar.unpacked/* $APP_PATH/Contents/Resources/

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 (GPU).app/Contents/MacOS/$APP Helper (GPU)"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper (GPU).app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper (Plugin).app/Contents/MacOS/$APP Helper (Plugin)"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper (Plugin).app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper (Renderer).app/Contents/MacOS/$APP Helper (Renderer)"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper (Renderer).app/"
codesign -s "$APP_KEY" -f --entitlements "$LOGINHELPER_PLIST" "$APP_PATH/Contents/Library/LoginItems/$APP Login Helper.app/Contents/MacOS/$APP Login Helper"
codesign -s "$APP_KEY" -f --entitlements "$LOGINHELPER_PLIST" "$APP_PATH/Contents/Library/LoginItems/$APP Login Helper.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"

ApplicationLoaderが消えた

上記のスクリプトでできあがった.pkgファイルをアップロードするための,ApplicationLoaderというソフトウェアは,Xcode 11以降に付属されなくなった.

このため,ApplicationLoaderを使うことができない.もちろん古いXcodeをインストールすればApplicationLoaderはあるのだが.

というわけでApplicationLoaderがない場合,どうやって.pkgファイルをAppStoreにアップロードするかという話なのだが,やり方は2つある.

  • Transporter
  • altool

Transporter

Appleから,新しくTransporterというアプリケーションがリリースされている.

Transporter

Transporter

  • Apple
  • 開発ツール
  • 無料
apps.apple.com

これをインストールすることで,.pkgファイルはアップロードできる.

altool

Transporterは,ごく最近でてきたもので,それまではaltoolを使っていた. altoolはCLIツールで,Xcode内のすごくわかりにくい場所に格納されている.

手元のMacBookPro Catalinaの場合,

/Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/Frameworks/AppStoreService.framework/Versions/A/Support/altool

に存在する.

というわけでこのパスを,$PATHに設定する.

$ export PATH=$PATH:/Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/Frameworks/AppStoreService.framework/Versions/A/Support

そして,

$ xcrun altool --upload-app -f ./Whalebird.pkg -t osx -u $USER -p $PASSWORD

とすることでアップロードできる.

$USERicloudに登録されているユーザのemail,$PASSWORDはパスワードだが,アカウントに2段階認証を設定している場合,app-specific passwordを生成してそれを設定する.

support.apple.com

参考

blog.nkzn.info