かばちんのエンジニアブログ

日々の経験の中で培った内容を備忘録も兼ねて記録していくブログです。少しでも誰かの役に立つために頑張って続けていけたらなと思います。

Unity 2019.3 以降へのバージョンアップ TIPS

■Unity アップデート後に iOS でビルドは出来るが起動時にクラッシュする

症状

  • アップデート前と同じように iOS ビルドはでき、実機へのインストールも可能
  • インストールしたアプリを起動しようとすると黒い画面でフリーズのような挙動
  • 一定時間その状態が続いたあとにアプリがクラッシュ

エラー内容

iOS のホーム画面を管理している SpringBoard がアプリの異常を検知してクラッシュしていた。

SpringBoard
[application<com.yarukiman.appid>:9999] Watchdog termination request provided: <FBSProcessTerminationRequest: 0x000000000;
label: "watchdog provision violated";
exceptionCode: "Watchdog Violation (0x00000000)";
reportType: CrashLog;
explanation: "process-launch watchdog transgression: application<com.yarukiman.appid>:9999 exhausted real (wall clock) time allowance of 20.00 seconds">

■ここからが解決方法

UnityFramework の登場

Unity 2019.3 から UnityFramework が分離されるようになりました。

・UaaL(Unity as a Library)
forum.unity.com

Unity as a Library とは

簡単に説明すると、Unity のエンジン部分が切り離され、
ネイティブアプリに部分的に Unity を組み込めるようになる仕組みです。

この仕組みが導入されたことにより、iOS ビルドの Xcode 吐き出し時の挙動が大きく変わりました。
これまでは Xcode 上に Unity-iPhone というプロジェクトが作成され、その中に Unity エンジンが内包されていました。

Unity 2019.3 以降では Unity-iPhone と UnityFramework という2つのプロジェクトが作成され、
Unity エンジン関連はすべて UnityFramework 側に格納されるようになります。

そのため、PostProcess で PBXProject ファイルを操作する際のターゲットを変更する必要があります。

PostProcessBuild の処理を変更する

変更を加える点は以下の2点です。

1.設定するターゲットプロジェクトを Unity-iPhone から UnityFramework に変更
2.Unity-iPhone プロジェクトから UnityFramework を参照出来るようにフレームワーク参照を追加

実際の PostProcessBuil の処理はこんな感じに変更になります。

[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
{
    var pbxProjectPath = PBXProject.GetPBXProjectPath(path);
    var pbxProject = new PBXProject();
    pbxProject.ReadFromString(File.ReadAllText(pbxProjectPath));

    // これまで Unity-iPhone をターゲットにしていろいろ変更していたところを、
    // UnityFramework をターゲットに変更する
-   var target = pbxProject.TargetGuidByName("Unity-iPhone");
+   var target = pbxProject.GetUnityFrameworkTargetGuid();

    // Unity 2019.3 以降の UnityFramework 分離対応(Unity-iPhone から UnityFramework を参照できるように追加)
+   pbxProject.AddFrameworkToProject(pbxProject.GetUnityMainTargetGuid(), "UnityFramework.framework", false);

    File.WriteAllText(pbxProjectPath, pbxProject.WriteToString());
}

■まとめ

知っていればなんてことのない変更ではありますが、これについての日本語の情報が極端に少なく
解決するまでにかなりの時間を費やしてしまったため、同じ境遇の方の助けに少しでもなれば幸いです。