はじめに
iOS アプリを App Store にリリースする際、手動でのビルドと署名は複雑で時間がかかります。GitHub Actions を使用することで、このプロセスを完全に自動化できます。
本記事では、以下の内容をカバーします:
- Apple 証明書とプロビジョニングプロファイルの管理
- GitHub Actions ワークフローの構築
- IPA ファイルの自動生成
- App Store Connect への自動アップロード
注意: 本記事の情報は2025年11月時点のものです。AppleやGitHubの仕様変更により、手順や設定が変更される可能性があります。
前提条件
- Flutter プロジェクト(またはネイティブ iOS プロジェクト)
- Apple Developer Account(有料)
- App Store Connect アカウント
- GitHub リポジトリ
ステップ 1: 必要な認証情報の準備
このステップでは、GitHub Actions で iOS アプリをビルド・署名するために必要なすべての認証情報を準備します。
1-0. CSR(証明書署名要求)ファイルの作成
まず、Apple に提出するための CSR ファイルを作成します。
- キーチェーンアクセス アプリケーションを開く
- メニューから キーチェーンアクセス > 証明書アシスタント > 認証局に証明書を要求... を選択
- 以下を入力:
- ユーザーメールアドレス: Apple ID のメールアドレス
-
通称: 任意の名前(例:
My iOS App Store Certificate) - CA メールアドレス: 空白のままでOK
- リクエストは...: ディスクに保存 を選択
- 続ける をクリック
- CSR ファイルを保存(
CertificateSigningRequest.certSigningRequest)
1-1. Bundle ID(Identifier)の作成
App Store で配布するアプリのBundle IDを作成します。
- Apple Developer Portal にログイン
- Certificates, Identifiers & Profiles > Identifiers をクリック
- + ボタンをクリック
- App IDs を選択 → Continue をクリック
- App を選択 → Continue をクリック
- 以下を入力:
-
Description: アプリの説明(例:
MyApp) -
Bundle ID: アプリケーションの一意識別子(例:
com.example.myapp)- 通常は Explicit を選択
- ワイルドカード(
*)は使用しない
-
Description: アプリの説明(例:
-
Capabilities セクションで必要な機能を確認
- Push Notifications、HomeKit、Health Kit など、アプリが使用する機能をチェック
- Register をクリック
✅ Bundle ID が作成されました。このIDは後のステップで使用します。
1-2. Apple Distribution 証明書の作成・取得
App Store 配布用の証明書を作成します:
- Apple Developer Portal にログイン
- Certificates, Identifiers & Profiles > Certificates をクリック
- + ボタンをクリック
- Apple Distribution を選択して Continue をクリック
- CSR ファイルをアップロード
- 証明書がダウンロードできるようになったら、ダウンロード(
distribution.cer) - ダウンロードした
.cerファイルをダブルクリック → キーチェーンに自動インポート
1-3. 証明書を P12 形式に変換
GitHub Actions で使用するために、キーチェーンから P12 形式で証明書をエクスポートします。
キーチェーンアクセスでの手順:
- キーチェーンアクセス アプリケーションを開く
- ログイン キーチェーンを選択
- 証明書 カテゴリを選択
- 先ほどインストールした「Apple Distribution」で始まる証明書を右クリック
- 「秘密鍵...」を書き出す をクリック
- ファイル名を入力(例:
distribution-certificate) - ファイル形式は Personal Information Exchange (.p12) を選択
- 保存場所を選択(例:
~/Desktop) - 保存 をクリック
- P12 ファイル用の任意のパスワードを入力 → OK
⚠️ 重要: このパスワードは後で GitHub Secrets に登録する際に必要になるため、覚えておいてください。
- macOS のログインパスワードを入力 → 許可
これで distribution-certificate.p12 ファイルが Desktop に保存されました。
1-4. P12 ファイルを Base64 エンコード
GitHub Secrets で安全に管理するために、P12 ファイルを Base64 でエンコードします:
# App Store 用証明書をエンコード
base64 -i ~/Desktop/distribution-certificate.p12 | pbcopy
# コピーしたテキストを GitHub Secrets に登録(後述)
# 一旦メモ帳とかに貼り付けておく
1-5. App Store 用プロビジョニングプロファイルの作成・取得
アプリが特定の Bundle ID で App Store から配布されることを許可するプロビジョニングプロファイルを作成します。
- Apple Developer Portal にログイン
- Certificates, Identifiers & Profiles > Profiles をクリック
- + ボタンをクリック
- App Store Connect を選択 → Continue
- ステップ 1-1 で作成した Bundle ID を選択 → Continue
- App Store Distribution 証明書を選択 → Continue
- プロファイル名を入力(例:
MyApp App Store) → Generate - ダウンロード(
MyApp_AppStore.mobileprovision)
1-6. プロビジョニングプロファイルを Base64 エンコード
# App Store 用プロファイルをエンコード
base64 -i ~/Downloads/MyApp_AppStore.mobileprovision | pbcopy
# コピーしたテキストを GitHub Secrets に登録(後述)
# 一旦メモ帳とかに貼り付けておく
1-7. Apple Team ID の確認
- Apple Developer Portal にログイン
- Membership details をクリック
-
Team ID を確認(例:
ABC123XYZ)
1-8. Apple ID 用アプリケーション固有パスワードの取得
App Store Connect へのアップロード時に使用するアプリケーション固有パスワードを取得します:
- Apple ID アカウント にログイン
- サインインとセキュリティ セクションをクリック
- アプリケー用パスワード > + をクリック
- アプリケーション名を入力(例:
GitHub Actions) - 生成されたパスワードをコピー(16文字のハイフン区切り形式)
⚠️ 重要: このパスワードは一度だけ表示されるため、安全に保管してください。
ステップ 2: GitHub Secrets の設定
GitHub リポジトリに以下の Secrets を設定します:
| Secret 名 | 説明 |
|---|---|
APPLE_CERTIFICATE_BASE64 |
App Store 用 P12 証明書(Base64) |
APPLE_CERTIFICATE_PASSWORD |
App Store 用 P12 証明書のパスワード |
APPLE_PROVISIONING_PROFILE_BASE64 |
App Store 用プロビジョニングプロファイル(Base64) |
APPLE_TEAM_ID |
Apple Team ID(例:ABC123XYZ) |
APPLE_ID |
App Store Connect Apple ID |
APPLE_APP_SPECIFIC_PASSWORD |
Apple ID 用アプリケーション固有パスワード |
Secrets の設定方法:
- GitHub リポジトリの Settings > Secrets and variables > Actions をクリック
- New repository secret をクリック
- Name と Secret を入力して Add secret をクリック
📝 Secrets 登録例
APPLE_CERTIFICATE_BASE64: MIIFkDCCBBigAwIBAgIQZ7CrtWfQLu...
APPLE_CERTIFICATE_PASSWORD: MySecurePassword123
APPLE_PROVISIONING_PROFILE_BASE64: H4sIAAAAAAAC/1WSTQvCMBCF...
APPLE_TEAM_ID: ABC123XYZ
APPLE_ID: developer@example.com
APPLE_APP_SPECIFIC_PASSWORD: abcd-efgh-ijkl-mnop
ステップ 3: ワークフローの構築
このステップでは、GitHub Actions ワークフローの各ステップを詳しく解説します。完全なワークフロー例はステップ 4 を参照してください。
3-1. ワークフロー全体の構造
name: iOS App Store Release
on:
push:
branches:
- main
workflow_dispatch:
permissions:
contents: read
id-token: write
env:
FLUTTER_VERSION: "3.29.3"
jobs:
build_ios:
# ... ジョブ 1 - ビルドフェーズ
upload_to_app_store:
# ... ジョブ 2 - アップロードフェーズ
説明:
- name: ワークフローの名前(GitHub Actions で表示されます)
-
on: ワークフロー実行のトリガー
-
push branches: [main]: main ブランチへのプッシュで自動実行 -
workflow_dispatch: GitHub UI から手動で実行可能
-
- permissions: 必要な権限を指定
- env: すべてのジョブで使用する環境変数(Flutter バージョン)
- jobs: 実行するジョブを定義
3-2. ジョブ 1: build_ios の構成
ジョブの基本設定
build_ios:
runs-on: macos-latest
steps:
# ... ステップ
説明:
-
runs-on: macos-latest: macOS ランナーを使用(iOS ビルドに必須)
セットアップステップ
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Flutter SDK
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Cache Flutter dependencies
uses: actions/cache@v4
with:
path: ${{ runner.tool_cache }}/flutter
key: ${{ runner.os }}-flutter-${{ env.FLUTTER_VERSION }}-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
${{ runner.os }}-flutter-${{ env.FLUTTER_VERSION }}-
- name: Install Flutter dependencies
run: flutter pub get
説明:
- Checkout code: リポジトリのコードを GitHub Actions ランナーにダウンロード
- Set up Flutter SDK: 指定したバージョンの Flutter をインストール
-
Cache Flutter dependencies: Flutter のキャッシュを使用して、ビルド時間を短縮
- 同じ pubspec.lock であれば、キャッシュから復元
-
Install Flutter dependencies:
flutter pub getで依存パッケージをインストール
ビルド番号の生成
- name: Generate build number
id: build_version
run: |
BUILD_NUMBER=$(date +'%s')
echo "build_number=$BUILD_NUMBER" >> $GITHUB_OUTPUT
説明:
- 現在の Unix タイムスタンプをビルド番号として生成
-
id: build_versionにより、後のステップから${{ steps.build_version.outputs.build_number }}でアクセス可能 - これにより、ビルドのたびに一意の番号が割り当てられます
証明書とプロビジョニングプロファイルのインストール
- name: Install Apple Distribution Certificate and Provisioning Profile
env:
BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
PROVISIONING_PROFILE_BASE64: ${{ secrets.APPLE_PROVISIONING_PROFILE_BASE64 }}
run: |
KEYCHAIN_PATH="${{ runner.temp }}/app-signing.keychain-db"
# キーチェーンの作成
security create-keychain -p "prod_keychain_password" "$KEYCHAIN_PATH"
security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
security unlock-keychain -p "prod_keychain_password" "$KEYCHAIN_PATH"
# 証明書のインポート
echo "$BUILD_CERTIFICATE_BASE64" | base64 --decode > certificate.p12
security import certificate.p12 -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH"
security list-keychain -d user -s "$KEYCHAIN_PATH"
# プロビジョニングプロファイルのインストール
echo "$PROVISIONING_PROFILE_BASE64" | base64 --decode > profile.mobileprovision
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
説明:
-
キーチェーンの作成: GitHub Actions ランナー内に一時的なキーチェーンを作成
- ホストマシンのキーチェーンを汚さない
-
21600は 6 時間のロック解除タイムアウト
- 証明書のインポート: Base64 エンコードされた証明書をデコードして、キーチェーンにインポート
- プロビジョニングプロファイルのインストール: macOS の標準位置にプロファイルをコピー
ExportOptions.plist の作成
- name: Create ExportOptions.plist
run: |
PROFILE_UUID=$(security cms -D -i ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision | plutil -extract UUID xml1 - -o - | sed -n 's/.*<string>\(.*\)<\/string>.*/\1/p')
cat > ${{ runner.temp }}/ExportOptions.plist << EOF
<?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>method</key>
<string>app-store</string>
<key>teamID</key>
<string>${{ secrets.APPLE_TEAM_ID }}</string>
<key>signingStyle</key>
<string>manual</string>
<key>signingCertificate</key>
<string>Apple Distribution</string>
<key>provisioningProfiles</key>
<dict>
<key>com.example.myapp</key>
<string>$PROFILE_UUID</string>
</dict>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<true/>
<key>compileBitcode</key>
<false/>
</dict>
</plist>
EOF
説明:
-
ExportOptions.plist: Xcode のエクスポート設定ファイル
-
flutter build ipaでこのファイルを指定することで、適切な署名と設定でビルド -
method: app-store: App Store 配布用に指定 -
provisioningProfiles: Bundle ID とプロビジョニングプロファイル UUID のマッピング -
uploadSymbols: true: クラッシュレポート用にシンボルをアップロード
-
Xcode プロジェクト設定の更新
- name: Configure distribution signing for App Store
run: |
# プロビジョニングプロファイルのUUIDを取得
PROFILE_UUID=$(security cms -D -i ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision | plutil -extract UUID xml1 - -o - | sed -n 's/.*<string>\(.*\)<\/string>.*/\1/p')
# プロジェクト設定を手動署名に変更
sed -i '' 's/CODE_SIGN_STYLE = Automatic;/CODE_SIGN_STYLE = Manual;/g' ios/Runner.xcodeproj/project.pbxproj
sed -i '' "s/DEVELOPMENT_TEAM = .*/DEVELOPMENT_TEAM = ${{ secrets.APPLE_TEAM_ID }};/g" ios/Runner.xcodeproj/project.pbxproj
sed -i '' 's/"iPhone Developer"/"Apple Distribution"/g' ios/Runner.xcodeproj/project.pbxproj
# プロビジョニングプロファイル設定を追加
sed -i '' "/DEVELOPMENT_TEAM = ${{ secrets.APPLE_TEAM_ID }};/a\\
\"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]\" = \"$PROFILE_UUID\";\\
" ios/Runner.xcodeproj/project.pbxproj
説明:
- CODE_SIGN_STYLE: 自動署名から手動署名に変更
- DEVELOPMENT_TEAM: Team ID を設定
-
PROVISIONING_PROFILE_SPECIFIER: プロビジョニングプロファイル UUID を指定
- これにより、ビルド時に正しいプロファイルが使用されます
IPA ファイルのビルド
- name: Build Flutter IPA (for App Store)
run: |
flutter build ipa --release \
--build-number=${{ steps.build_version.outputs.build_number }} \
--export-options-plist=${{ runner.temp }}/ExportOptions.plist
説明:
-
flutter build ipa: iOS アプリを IPA 形式でビルド -
--release: リリースビルド(最適化) -
--build-number: ビルド番号の生成 で生成したビルド番号を指定 -
--export-options-plist: ExportOptions.plist の作成 で作成した ExportOptions.plist を使用
アーティファクトとしての保存
- name: Upload iOS IPA artifact
uses: actions/upload-artifact@v4
with:
name: ios-ipa-build
path: build/**/*.ipa
説明:
- ビルドした IPA ファイルを GitHub Actions のアーティファクトとして保存
クリーンアップ
- name: Clean up distribution keychain and provisioning profile
if: always()
run: |
KEYCHAIN_PATH="${{ runner.temp }}/app-signing.keychain-db"
security delete-keychain "$KEYCHAIN_PATH" || true
rm -f ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision || true
説明:
- if: always(): 前のステップが成功・失敗に関わらず実行
- 一時的なキーチェーンとプロビジョニングプロファイルを削除
-
|| true: エラーでも処理を続行
3-3. ジョブ 2: upload_to_app_store の構成
ジョブの基本設定
upload_to_app_store:
runs-on: macos-latest
needs: build_ios
if: success()
steps:
# ... ステップ
説明:
-
needs: build_ios: build_ios ジョブが完了するのを待つ(依存関係) -
if: success(): build_ios が成功した場合のみこのジョブを実行 - ビルド失敗時は自動的にアップロードがスキップされます
アーティファクトのダウンロード
- name: Download iOS IPA artifact
uses: actions/download-artifact@v4
with:
name: ios-ipa-build
説明:
- build_ios で保存したアーティファクト(IPA ファイル)をダウンロード
- 別のジョブから前のジョブの成果物を利用可能
App Store Connect へのアップロード
- name: Upload to App Store Connect
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
run: |
# IPAファイルを動的に検索
IPA_FILE=$(find . -name "*.ipa" -type f | head -1)
if [ -z "$IPA_FILE" ]; then
echo "Error: No IPA file found"
exit 1
fi
echo "Found IPA file: $IPA_FILE"
# App Store Connect へアップロード
xcrun altool --upload-app \
-f "$IPA_FILE" \
-u "$APPLE_ID" \
-p "$APPLE_APP_SPECIFIC_PASSWORD" \
--type ios
echo "=== Upload completed ==="
説明:
- IPA ファイルの位置を特定(ダウンロード後の位置)
-
xcrun altool: Apple 公式ツールで App Store Connect にアップロード -
--upload-app: アプリをアップロード - パスワードはアプリケーション固有パスワードを使用
ステップ 4: 完全なワークフロー例
ここでは、実際に使用できる完全なワークフロー設定を提供します。
ワークフロー全体の構成
このワークフローは 2 つのジョブで構成されています:
- build_ios: iOS アプリをビルドして IPA ファイルを生成
- upload_to_app_store: 生成した IPA ファイルを App Store Connect にアップロード
name: iOS App Store Release
on:
push:
branches:
- main
workflow_dispatch:
permissions:
contents: read
env:
FLUTTER_VERSION: "3.29.3"
jobs:
build_ios:
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Flutter SDK
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Cache Flutter dependencies
uses: actions/cache@v4
with:
path: ${{ runner.tool_cache }}/flutter
key: ${{ runner.os }}-flutter-${{ env.FLUTTER_VERSION }}-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
${{ runner.os }}-flutter-${{ env.FLUTTER_VERSION }}-
- name: Install Flutter dependencies
run: flutter pub get
- name: Generate build number
id: build_version
run: |
BUILD_NUMBER=$(date +'%s')
echo "build_number=$BUILD_NUMBER" >> $GITHUB_OUTPUT
- name: Install Apple Distribution Certificate and Provisioning Profile
env:
BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
PROVISIONING_PROFILE_BASE64: ${{ secrets.APPLE_PROVISIONING_PROFILE_BASE64 }}
run: |
KEYCHAIN_PATH="${{ runner.temp }}/app-signing.keychain-db"
security create-keychain -p "prod_keychain_password" "$KEYCHAIN_PATH"
security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
security unlock-keychain -p "prod_keychain_password" "$KEYCHAIN_PATH"
echo "$BUILD_CERTIFICATE_BASE64" | base64 --decode > certificate.p12
security import certificate.p12 -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH"
security list-keychain -d user -s "$KEYCHAIN_PATH"
echo "$PROVISIONING_PROFILE_BASE64" | base64 --decode > profile.mobileprovision
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
- name: Create ExportOptions.plist
run: |
PROFILE_UUID=$(security cms -D -i ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision | plutil -extract UUID xml1 - -o - | sed -n 's/.*<string>\(.*\)<\/string>.*/\1/p')
cat > ${{ runner.temp }}/ExportOptions.plist << EOF
<?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>method</key>
<string>app-store</string>
<key>teamID</key>
<string>${{ secrets.APPLE_TEAM_ID }}</string>
<key>signingStyle</key>
<string>manual</string>
<key>signingCertificate</key>
<string>Apple Distribution</string>
<key>provisioningProfiles</key>
<dict>
<key>com.example.myapp</key>
<string>$PROFILE_UUID</string>
</dict>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<true/>
<key>compileBitcode</key>
<false/>
</dict>
</plist>
EOF
- name: Configure distribution signing for App Store
run: |
PROFILE_UUID=$(security cms -D -i ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision | plutil -extract UUID xml1 - -o - | sed -n 's/.*<string>\(.*\)<\/string>.*/\1/p')
sed -i '' 's/CODE_SIGN_STYLE = Automatic;/CODE_SIGN_STYLE = Manual;/g' ios/Runner.xcodeproj/project.pbxproj
sed -i '' "s/DEVELOPMENT_TEAM = .*/DEVELOPMENT_TEAM = ${{ secrets.APPLE_TEAM_ID }};/g" ios/Runner.xcodeproj/project.pbxproj
sed -i '' 's/"iPhone Developer"/"Apple Distribution"/g' ios/Runner.xcodeproj/project.pbxproj
sed -i '' "/DEVELOPMENT_TEAM = ${{ secrets.APPLE_TEAM_ID }};/a\\
\"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]\" = \"$PROFILE_UUID\";\\
" ios/Runner.xcodeproj/project.pbxproj
- name: Build Flutter IPA (for App Store)
run: |
flutter build ipa --release \
--build-number=${{ steps.build_version.outputs.build_number }} \
--export-options-plist=${{ runner.temp }}/ExportOptions.plist
- name: Upload iOS IPA artifact
uses: actions/upload-artifact@v4
with:
name: ios-ipa-build
path: build/**/*.ipa
- name: Clean up distribution keychain and provisioning profile
if: always()
run: |
KEYCHAIN_PATH="${{ runner.temp }}/app-signing.keychain-db"
security delete-keychain "$KEYCHAIN_PATH" || true
rm -f ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision || true
upload_to_app_store:
runs-on: macos-latest
needs: build_ios
if: success()
steps:
- name: Download iOS IPA artifact
uses: actions/download-artifact@v4
with:
name: ios-ipa-build
- name: Upload to App Store Connect
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
run: |
# IPA ファイルを動的に検索
IPA_FILE=$(find . -name "*.ipa" -type f | head -1)
if [ -z "$IPA_FILE" ]; then
echo "Error: No IPA file found"
exit 1
fi
echo "Found IPA file: $IPA_FILE"
# App Store Connect へアップロード
xcrun altool --upload-app \
-f "$IPA_FILE" \
-u "$APPLE_ID" \
-p "$APPLE_APP_SPECIFIC_PASSWORD" \
--type ios
echo "=== Upload completed ==="
ステップ 5: 証明書の有効期限管理
証明書は 1 年間有効であり、期限切れ前に更新が必要です。スムーズな運用のため、以下のプロセスを推奨します。
証明書の有効期限確認
- Apple Developer Portal にログイン
- Certificates, Identifiers & Profiles > Certificates をクリック
- 各証明書の Expiration Date を確認
更新タイミングの管理
- 3ヶ月前:カレンダーにリマインダーを設定
- 1ヶ月前:チームに通知
- 有効期限前:新しい証明書を準備
証明書の更新手順
古い証明書が期限切れになる前に、以下の手順で新しい証明書を準備します:
-
新しい証明書を作成
# ステップ 1-0 から 1-2 を再度実行 -
P12 ファイルを Base64 エンコード
base64 -i ~/Desktop/distribution-certificate.p12 | pbcopy -
GitHub Secrets を更新
-
APPLE_CERTIFICATE_BASE64の値を新しいものに置き換え -
APPLE_CERTIFICATE_PASSWORDが変わった場合は更新
-
-
動作確認
- テストビルドを実行して成功を確認
運用のベストプラクティス
- Secrets の定期監査:月 1 回、登録されている Secrets を確認
- 証明書の削除:期限切れ後、Apple Developer Portal から削除
- ドキュメント化:証明書の更新日時をプロジェクトの README に記録
注意事項
⚠️ セキュリティ
- Base64 エンコードされた証明書と password は GitHub Secrets で安全に管理してください
- 定期的に証明書をローテーションしてください
- 本番ビルドには常にテストを実行してください
⚠️ コスト
- Apple Developer Program の年間費用($99)
- GitHub Actions の使用時間
⚠️ 確認事項
- App Store Connect で最終確認を行う
- TestFlight でのベータテストを実施する
- リリースノートを準備する
まとめ
GitHub Actions を使用することで、iOS アプリの自動ビルドと App Store へのアップロードが可能になります。本記事のワークフローを参考に、プロジェクトに合わせてカスタマイズしてください。
この記事が、iOS アプリ開発の助けになれば幸いです。
質問やフィードバックがあれば、コメントでお聞かせください!