本記事はKevin Suhajdaが執筆いたしました
Unityは、デスクトップ、コンソール、モバイルデバイス用の2Dおよび3Dゲームを作成するための人気のあるクロスプラットフォームゲームエンジンです。これは、モバイルゲームやAR(拡張現実)モバイルアプリ、UnityとFlutterやReact Nativeを組み合わせたハイブリッドアプリの構築に最適な選択肢の一つです。
本記事では、Codemagic CI/CDを使用してUnity iOSアプリをビルド、コード署名、App Store Connectに直接公開し、そこからTestFlightを使用してテスターや関係者にアプリを配布したり、App Storeにリリースを公開する方法についてご説明いたします。Codemagicでは、Xcodeをローカルにインストールすることなく、UnityのiOSアプリをビルドできることは特筆に値します。しかも、Macを持っている必要すらありません!
本記事では、Unityのプロジェクト自体には注目しません。その代わり、構築と公開の各ステップを踏みます。以下のような感じです:
- CodemagicでUnityプロジェクトをビルドし、App Store Connectに公開するための前提条件をご説明いたします。
- 環境変数の定義やYAMLファイルの調整など、Codemagicのセットアップを行います。
- 最後に、Xcodeプロジェクトをビルドし、公開するための準備をするために、いくつかのC#スクリプトを追加します。
CodemagicでUnity iOSアプリをビルドして公開するための前提条件
まず、この記事のすべてのステップを実行できるようにするために、以下のものをご用意ください:
- Unity PlusまたはPro ライセンス。
- 有効なApple Developer Programのメンバーシップ。
- 自動コード署名用のApp Store Connect APIキーを作成するためのApple Developer Programの管理者権限。
- Gitベースのバージョン管理システムにチェックインしたUnityのプロジェクト。
- Unity SDKが事前インストールされたmacOS VMインスタンスにアクセスできるCodemagicのチーム。この手配は、Codemagic(こちら)までご連絡ください。
UnityプロジェクトをCodemagicに追加
Codemagicにプロジェクトを追加する最も簡単な方法は、Gitプロバイダーを経由することです。GitHub、 Bitbucket、GitLab などのGitソース管理サービスにプロジェクトを追加し、以下の手順でCodemagicを開始します:
設定の統合(Integrations)から、UnityプロジェクトをアップロードしたGitプロバイダーに接続します。アプリをアップロードしたリポジトリにアクセス許可が与えられていることをご確認ください。
アプリケーションページに移動し、**アプリケーションの追加(Add application)**をクリックします。
Unity SDKインスタンスへのアクセス権が付与されているチームを選択します。アクセス権がない方は、Codemagicにお問い合わせください(こちら)。
Gitプロバイダーを選択します。
**次に、統合を承認する(Authorize integration)をクリックして、Codemagicを承認します。選択したGitプロバイダーの承認がお済みの場合は、その代わりに次に、レポジトリを選択(Next: Select repository)**を選択してください。
GitHubをGitプロバイダーとして使用している場合は、リポジトリを選択する前に追加ステップを1つ実行する必要があります。**GitHubアプリをインストール(Install GitHub App)**をクリックして統合をセットアップします。GitHubアプリ統合の設定についての詳細は、こちらをご覧ください。
ここで、ドロップダウンメニューからリポジトリを選択し、プロジェクトタイプとして Unityアプリを選択します。次に、**終了して、アプリケーションを追加(Finish: Add application)**をクリックします。
プロジェクトの設定に移ります。デフォルトではcodemagic.yamlタブが選択されます。
Unityの認証情報をセキュアな環境変数としてCodemagicに追加します。
Unityのシリアルナンバーは、CodemagicのビルドマシンでUnityをアクティベートするために使用され、iOSプロジェクトをエクスポートできるようになります。そして、ライセンスはYAML設定のpublishing
セクションで返されるため、ビルドステップの1つが失敗してもライセンスは返されます。
UNITY_SERIAL
、UNITY_USERNAME
、UNITY_PASSWORD
という名前の環境変数を含む、“unity”という環境変数グループを作成する必要があります。この環境変数群は、この後のステップでご説明する codemagic.yaml 設定ファイルにインポートされます。
Codemagicで必要な環境変数を以下のように作成します:
チームを使用している場合は、チーム > チーム名をクリックし、グローバル変数とシークレットをクリックします。そうでない場合は、**環境変数(Environment variables)**タブをクリックして、アプリケーションレベルで環境変数を追加できます。
UNITY_SERIAL
という変数を作成し、その値をあなたのUnityシリアル番号に設定します。グループの選択ドロップダウンにunity
と入力し、**“unity”グループの作成(Create “unity” group)ボタンをクリックします。値を暗号化するために、変数をセキュア(secure)**とマークし(マークは実際には、ここと以下のすべてのケースでデフォルトでチェックされています)、追加ボタンをクリックします。UNITY_USERNAME
という名前の変数を作成します。値を、Unity IDで使用しているメールアドレスに設定し、それを“unity”グループに追加します。値を暗号化するために、これを**セキュア(secure)**とマークし、追加ボタンをクリックします。UNITY_PASSWORD
という名前の変数を作成します。値をUnity IDパスワードに設定し、それを“unity”グループに追加します。値を暗号化するために、これをセキュアとマークし、追加ボタンをクリックします。
Unityのインストール先を定義する環境変数 UNITY_HOME
は、ビルドマシン上ですでに設定されていることにご注意ください。macOSの場合はこちら、Windowsの場合はこちらで場所を確認できます。
UnityアプリのiOSコード署名を自動的に行うための環境変数を追加する
Codeamgicでは、iOS向けUnityアプリを自動でコード署名できます。そのためには、以下の環境変数を“ios_credentils”という環境変数グループに作成する必要があります:
APP_STORE_CONNECT_KEY_IDENTIFIER
、APP_STORE_CONNECT_ISSUER_ID
、APP_STORE_CONNECT_PRIVATE_KEY
、 CERTIFICATE_PRIVATE_KEY
。
そこで、同じタブにとどまり、別の変数グループを作成する必要があります。
APP_STORE_CONNECT_KEY_IDENTIFIER
という変数を作成し、その値をApp Store Connect APIのキー識別子(Key Identifier)に設定します。グループの選択ドロップダウンにios_credentials
と入力し、 “ios_credentials"グループの作成ボタンをクリックします。値を暗号化するために、変数をセキュアとマークし、追加ボタンをクリックします。APP_STORE_CONNECT_ISSUER_ID
という名前の変数を作成します。値をApp Store Connect APIの発行者(Issuer)IDに設定し、それを“ios_credentials”グループに追加します。値を暗号化するために、変数をセキュアとマークし、追加ボタンをクリックします。APP_STORE_CONNECT_PRIVATE_KEY
という名前の変数を作成します。App Store Connect APIの秘密鍵(Private Key)(.p8)に値を設定し、それを“ios_credentials”グループに追加します。値を暗号化するために、変数をセキュアとマークし、追加ボタンをクリックします。CERTIFICATE_PRIVATE_KEY
という名前の変数を作成し、その値をiOS配信証明書の秘密鍵(iOS Distribution Certificate private key)に設定します。それを“ios_credentials”グループに追加します。値を暗号化するために、変数をセキュアとマークし、追加ボタンをクリックします。
App Store Connect APIキーの作成と必要な環境変数の値の取得方法については、iOSアプリの署名に関するドキュメントをご参照ください(こちら)。
codemagic.yamlを使用してUnity iOSアプリ用にCodemagicを設定する
Codemagicでは、WindowsとmacOSの両マシンでUnity SDKをご提供しておりますが、今回はiOS向けのアプリを作る必要があるため、macOSのマシンを使用することにいたします。YAMLを使ってビルドを設定するには、Unityプロジェクトに移動し、ルートディレクトリ内に codemagic.yaml
というファイルを新規に作成します。
以下のテンプレートをファイルに追加します:
workflows:
my-workflow:
name: Workflow name
max_build_duration: 120
environment:
groups:
- ...
vars:
- ...
scripts:
- ...
artifacts:
- ...
publishing:
- ...
これはCodemagicでアプリを構築するための基本的なワークフローテンプレートです。詳しくは、ドキュメントをご覧ください。
publishing
セクションでは、App Store Connectにアプリを公開し、貴社内のApp Store Connectユーザー様によるテストに利用できるようにすることにご注意ください。社内グループ(Internal Group)を作成し、アプリを配布したいテスターを追加するだけです。
アプリを外部のTestFlightユーザーに配布したり、App Store Reviewに直接提出する必要がある場合、その設定方法はこちらに記載されております。App Store Connectへのアプリ公開については、こちらの記事もご覧ください。
.ipaを生成し、App Storeに公開するには、以下のステップでワークフローを変更します:
ワークフロー
セクションで、適切なワークフロー名を定義します:workflows: -unity-ios-release-workflow: name: Unity iOS release workflow max_build_duration: 120
なお、この時点ではinstance_typeプロパティは定義しない方がよいです。Unity SDKを含むMac Proインスタンスへのアクセスが許可されている場合、デフォルトではすでに
mac_pro_unity
に設定されており、codemagic.yamlファイルでは設定する必要はありません。先ほど
groups
セクションで作成した環境変数グループをインポートします:environment: groups: - unity - ios_credentials
vars
セクションに以下の環境変数を設定します:vars: UNITY_BIN: /Applications/Unity/Hub/Editor/2020.3.20f1/Unity.app/Contents/MacOS/Unity BUILD_SCRIPT: BuildIos UNITY_IOS_DIR: ios XCODE_PROJECT: "Unity-iPhone.xcodeproj" XCODE_SCHEME: "Unity-iPhone" BUNDLE_ID: <BUNDLE_ID> APP_STORE_APP_ID: <APPLE_ID>
角括弧を適切な値に置き換えます。
バンドルID
とアップルID
は、App Store Connect > アプリ > 一般 > アプリ情報で確認できます。scripts
セクションで、macOSキーチェーンを初期化します:scripts: - name: Initialize macOS keychain script: keychain initialize
以下のスクリプトでUnityをアクティベートします:
- name: Activate Unity License script: $UNITY_BIN -batchmode -quit -logFile -serial ${UNITY_SERIAL?} -username ${UNITY_USERNAME?} -password ${UNITY_PASSWORD?}
Xcodeプロジェクトをエクスポートします
- name: Build the Xcode project script: $UNITY_BIN -batchmode -quit -logFile -projectPath . -executeMethod BuildScript.$BUILD_SCRIPT -nographics
iOSの署名ファイルを取得します:
- name: Fetch signing files script: app-store-connect fetch-signing-files $BUNDLE_ID --type IOS_APP_STORE
キーチェーンに証明書を追加します:
- name: Add certificates to default keychain script: keychain add-certificates
Xcodeにプロビジョニングプロファイルを追加します:
- name: Set up code signing settings on Xcode project script: xcode-project use-profiles
ビルド番号をインクリメントします:
- name: Increment build number script: | cd ios && agvtool new-version -all $(($(app-store-connect get-latest-testflight-build-number "$APP_STORE_APP_ID") + 1))
.ipaをビルドします:
- name: Build ipa for distribution script: xcode-project build-ipa --project "$UNITY_IOS_DIR/$XCODE_PROJECT" --scheme "$XCODE_SCHEME"
生成された.ipaを取得するために、
artifacts
(成果物)のパスを以下のように更新します:artifacts: - build/ios/ipa/*.ipa
Unityのライセンスを返すように
publishing
セクションを更新し、App Store Connectに公開します:publishing: scripts: - name: Deactivate Unity License script: $UNITY_BIN -batchmode -quit -returnlicense -nographics app_store_connect: api_key: $APP_STORE_CONNECT_PRIVATE_KEY key_id: $APP_STORE_CONNECT_KEY_IDENTIFIER issuer_id: $APP_STORE_CONNECT_ISSUER_ID
これでcodemagic.yaml
ファイルの設定は完了です。全体像を確認したい場合は、このブログ記事のサンプルプロジェクトのルートフォルダに、Unityアプリ用のcodemagic.yaml
ファイルの実用例があります。あとは、このファイルをコミットしてGitプロバイダーに追加するだけです。
Unityプロジェクトにビルドスクリプトを追加する
Xcodeプロジェクトをヘッドレスモードでビルドするには、Unityのビルドスクリプトが必要です。では、用意しましょう。
ローカルマシンでUnityを開き、アセット/エディタ(Assets/Editor)のプロジェクトエクスプローラーに**ビルド(Build)**というC#スクリプトを新規に追加します。
以下をファイルに追加します:
using System.Linq;
using System;
using UnityEditor;
using UnityEngine;
public static class BuildScript
{
[MenuItem("Build/Build iOS")]
public static void BuildIos()
{
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.locationPathName = "ios";
buildPlayerOptions.target = BuildTarget.iOS;
buildPlayerOptions.options = BuildOptions.None;
buildPlayerOptions.scenes = GetScenes();
Debug.Log("Building iOS");
BuildPipeline.BuildPlayer(buildPlayerOptions);
Debug.Log("Built iOS");
}
private static string[] GetScenes()
{
return (from scene in EditorBuildSettings.scenes where scene.enabled select scene.path).ToArray();
}
}
BuildIos
メソッドは、Xcodeプロジェクトをios
というフォルダにエクスポートするために使用されます。また、メニュー項目もUnity UIに追加され、ビルド > iOSのビルドをクリックすると、Xcodeプロジェクトをエクスポートできるようになります。
アプリが暗号化を使用しているかどうかを宣言するビルド後のスクリプトを追加
UnityアプリをApp Store Connectに公開する際、アプリに暗号化を使用しているかどうか尋ねられます。新しいバージョンを公開するたびに手動でこの質問に答えたくない場合は、Unityに別のスクリプトを追加して、XcodeプロジェクトのルートにあるInfo.plist
ファイルにITSAppUsesNonExemptEncryption
というキーを設定し、アプリで暗号化を使用していない場合は値をNOに、使用している場合はYESに設定すると、自動的にこの質問に答えることができるようになります。
暗号化のエクスポート規制の遵守について、詳しくはこちらをご覧ください。
必要なビルド後のスクリプトを追加するには、Unityを開き、アセット/エディタディレクトリのプロジェクトエクスプローラーにPostProcessing(後処理)という新しいC#スクリプトを追加し、そこに以下を追加します:
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;
public class IosBuildPostprocessor
{
[PostProcessBuild(1)]
public static void EditPlist(BuildTarget target, string path)
{
if (target != BuildTarget.iOS)
return;
string plistPath = path + "/Info.plist";
PlistDocument plist = new PlistDocument();
plist.ReadFromFile(plistPath);
PlistElementDict rootDict = plist.root;
// Add ITSAppUsesNonExemptEncryption to Info.plist
rootDict.SetString("ITSAppUsesNonExemptEncryption", "false");
File.WriteAllText(plistPath, plist.WriteToString());
}
}
このスクリプトは、XcodeプロジェクトがUnityからエクスポートされた後に実行されます。
UnityでiOSのバンドル識別子を設定する
Xcodeプロジェクトをビルドする前に、iOSアプリケーションのバンドルIDを設定する必要があります。
これは以下のように行えます:
- Unityを開き、ファイル > ビルド設定を実行します。
- iOSが選択されたプラットフォームとなっていることを確認し、プレイヤー設定ボタンをクリックします。
- その他の設定セクションを展開します。
- IDセクションで、**デフォルトのバンドル識別子をオーバーライドする(Override Default Bundle Identifier)**オプションにチェックを入れます。
- Apple Developer Programアカウントで使用している識別子名と一致するように、**バンドル識別子(Bundle Identifier)**を設定します。
- バージョンを0.0.1などご希望通りに設定します。Codemagicでは自動的にビルド番号をインクリメントするため、この設定は0にしたままでもいいです。
最初のビルドを実行
Gitプロバイダーに行ったすべての変更をコミットするのを忘れないでください。
YAMLファイルを使用してUnity iOSアプリのビルドを開始するには、Codemagicのプロジェクトページに移動し、**最初のビルドを開始する(Start your first build)**をクリックします。ワークフローを選択し、**新規ビルドを開始(Start new build)**をクリックしてビルドプロセスを開始します。プロジェクトの規模にもよりますが、数分から数十分かかる場合があります。
結論
おめでとうございます! これで、Unity iOSアプリがビルドされ、App Store Connectに公開されるはずです。しかも、すべてのプロセスが自動化されました! もう、手動でのビルド、コード署名、アップロードに悩まされる必要はありません! また、Codemagicを使うと、Unity iOSアプリをビルドするのに、Macを所持したりXcodeをインストールしたりする必要もありません。
本記事では、Codemagicを使ってUnity iOSアプリをビルドして、App Store Connectに公開する方法についてご紹介いたしました。Unity iOSアプリをビルドするための完全なcodemagic.yaml
設定ファイルはこちら にあります。Android向けのUnityアプリの構築については、こちらのドキュメントをご参照ください。
CodemagicでUnityアプリをビルドして公開するのは、非常にシンプルで簡単なはずです(記事は長めだったかもしれませんが)。ですが、もしどこかで行き詰まった場合、いつでも私たちがお助けいたします。例えばSlackで、一つ一つのご質問にお答えするように努めております。また、プロフェッショナルプランかエンタープライズプランをご利用の方は、アプリ内のチャットで、当社のエキスパートがいつでもご対応させていただきます。
楽しんでビルドしましょう!