JenkinsでUniy iOSプロジェクトのTestFlight配信を行う(輸出コンプライアンスも対応)


Unity iOSプロジェクトでTestFlight配信をJenkinsで行う方法です

動作環境

Xcode9.2, Xcode10.0
Unity2017
Jenkins2.70

前提

JenkinsでAdHocビルドはできている状態を想定します
AdHocビルドのJobからTestFlightのJobへの変更点の説明になります

おおまかな流れ

  1. exportOptionsPlist.plistを変更する
  2. Info.plistに輸出コンプライアンスの返答を記述する
  3. altoolでバリデーションする(必須ではない)
  4. altoolでアップロードする

1.exportOptionsPlist.plistのmethodをapp-storeに変更する

xcodebuild -exportArchiveのオプションexportOptionsPlistで指定するplistファイルを変更します
下記のようにmethodの値をad-hocからapp-storeにします

<plist version="1.0">
    <dict>
        <key>method</key>
-        <string>ad-hoc</string>
+        <string>app-store</string>

2.Info.plistに輸出コンプライアンスの返答を記述する

ここまでの状態でTestFlightにアップロードすると, 輸出コンプライアンス情報がありませんという状態で配信はされません
暗号化機能を含まない場合, いいえを選択する必要があります

この手順を自動化するため, Info.plistにキーITSAppUsesNonExemptEncryptionを追加し値をNoとします

参考までに, UnityのPostProcessBuildInfo.plistに上記の値を追加するコードは下記のようになります

[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
{
    var plistPath = Path.Combine(path, "Info.plist");
    var plist = new PlistDocument();
    plist.ReadFromFile(plistPath);
    plist.root.SetString("ITSAppUsesNonExemptEncryption", "false");
    plist.WriteToFile(plistPath);
}

3.altoolでバリデーションする(必須ではない)

JenkinsのJobでipa作成より後の箇所にシェルの実行を追加し, 下記シェルを実行しバリデーションを行います
TestFlightにアップロードできるApp Store Connectユーザを作成し指定します

altoolオプション 説明
-f ipaファイルパス
-t タイプここではios
-u App Store Connectユーザ名
-p App Store Connectユーザパスワード

参考までに, 私はパスワードはJenkinsのMask Passwords Pluginを使ってログ表示されないようにしています
(APPSTORE_CONNECT_PASSの箇所)

/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool \
--validate-app \
-f Unity-iPhone.ipa \
-t ios \
-u hoge@ hoge.com \
-p ${APPSTORE_CONNECT_PASS}

4.altoolでアップロードする

バリデーションの次に下記のようなシェルの実行を追加しaltoolでアップロードします
アップデート後しばらく経つと, 内部テストユーザーにTestFlight配信がされます

なお, 外部テストの申請や外部テスト公開はブラウザで手動で行う必要があります

/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool \
--upload-app \
-f Unity-iPhone.ipa \
-t ios \
-u hoge@ hoge.com \
-p ${APPSTORE_CONNECT_PASS}

参考