こんにちは。こんばんわ。とろあ(@tohroa)です。
タマハジキと石取りゲームという2本のスマートフォン向けゲームアプリをリリースしましたが、アプリ開発にあたってハマったことを少しづつ書いていきます。
今回はiOS向けにビルドしたときに、iOSシミュレータで起動できなかったり、起動直後にアプリが落ちてしまう問題でハマったので、iOSシミュレータで動作確認する方法を整理してみました。
ハマっている人は多そうで、数秒で解決できる手順だったのに、自分は解決するまで丸一日かかってしまったので誰かの役に立ったらいいなと思い書いてます。
★これで解決★ iOSシミュレータをRosettaで起動して実行する
いろいろ悩んだのですがまず解決策を記載しておきます。下の方に、いろいろ試したことも記載してみます。
手順実行時の自分の実行環境は以下。
- M2 Mac mini(2023)
- Unity 2021.3.19f1
- xCode 14.3
UnityでiOS向けにビルドしたあと、問題なく実行・動作確認できた方法としては「xCodeでアプリの実行対象をRosetta起動のiOSシミュレータにする」だけで解消できました。
iOSシミュレータをRosettaで起動する手順
iOSシミュレータをRosettaで起動する方法は非常に簡単です。
UnityでiOS向けにビルド後、xCodeでプロジェクトを開いた状態で、xCodeのメニューにてProduct→Destination→Destination Architectures→Show Both(もしくはShow Rosetta Destinations)を選択します。
上記手順後、実行対象にiOS Simulatorsの中に、iPhone XX (Rosetta)という感じでRosetta起動のiOSシミュレータが選択可能となります。
末尾にRosettaと書かれたiOSシミュレータを選択して実行すれば、無事iOSシミュレータ上でアプリを実行し動作確認を行うことができました。
※下記記事が解決の糸口になりました。大感謝!
https://qiita.com/mitsuharu_e/items/269ccd72dffe2ecdabb5Xcode 14.3 をインストールした環境で、Xcode 14.1 で Rosetta を有効にしてビルドする - QiitaXcode 14.3 から Rosetta のサポートはなくなりました。Xcode isn’t supported under Rosetta. See Developer Technote “R…
【前提】UnityでTarget SDKをSimulator SDKに設定してビルド
上記解決策を実行するにあたって、前提としてUnityでビルドを実行する前に、Unityのメニューから、Edit→Project Settings→Player Settings→Other Settings内のTarget SDKにSimulator SDKを設定する必要があります。(リリース時はDevice SDKを設定。戻し忘れ注意)
この設定は早い段階で行っていたのですが、これだけではiOSシミュレータ上ではうまく実行できず・・・解決方法に至る。
解決できなかった対処方法たち
ここから下は参考情報。解決方法に至るまでに試して駄目だったこともいくつか記載します。
xCodeでプロジェクトの設定変更しても実行直後にアプリ強制終了
Unityでシミュレータ向けにビルドしただけだと、実行対象にiOS Simulatorsは表示されていません。
これは、解決方法で記載したDestinationがApple Silicon Destinationsに設定されているからなのですが、Apple Siliconでの実行向けに、プロジェクト側でArchitecturesをx86_64からStandard Architecture(arm64, x86_64)に設定したり、Supported PlatformsをiOSに設定することで、iOS Simulatorsを表示する方法を最初に発見し試しました。
上記の設定変更を行うことで、たしかに実行対象にiOS Simulatorsが表示され、iOSシミュレータ向けにインストール・実行まではできたのですが・・・実行直後、Unityのスプラッシュロゴが表示されるよりも前にアプリが強制終了してしまう状態となってしまい解決となりませんでした。
Unityで使用していないファイルやパッケージを削除
アプリ起動後に強制終了になってしまうところでハマっていた段階で、Unityのプロジェクト内で何かしら問題になっているファイルがあるのでは無いかと思い、使っていないファイルを削除。
試している段階では、いずれのファイル、パッケージを削除しても解決に至らず、最終的に解決方法を発見後に元の状態でビルドしてみても実行できたので、使用していないファイル、パッケージが強制終了の要因では無かったようです。(ただ、このとき整理したおかげでリリースファイルの軽量化には繋がったはず)
iOSシミュレータを直接「Rosettaを使用して開く」で実行しようとした
調べ回ってRosettaでの起動が必要そうというところまで至ったあと、iOSシミュレータをRosettaで実行しようと、iOSシミュレータ本体の実行ファイルの情報(右クリックやCtrl+クリック→情報を見る で表示)から「Rosettaを使用して開く」にチェックを入れるとRosettaで起動できそうな情報を発見したのですが・・・
自分の環境では「Rosettaを使用して開く」というチェックボックスが表示されておらず断念。
そもそも、上記方法でRosettaを使用してiOSシミュレータが実行できたとして、そのシミュレータを指定して動作確認したいアプリをインストールできるかは未解決だったため、最初に紹介した解決方法が適切だったのかなといまでは思う。
他にもいろいろ試しましたが、試すたびにxCodeが新たなエラーを出力したりと、解決まではなかなか苦労してしまいました。
最後に(余談)
M1チップ以降のApple SiliconではRosetta 2での動作が基本のようなのですが、Unityでのビルド、xCodeの実行、iOSシミュレータの実行それぞれで、統一した方式を取らないと実行できないため、今回の解決方法でArchitectureを統一して実行できる手順が取れたようです。(…というところで理解しましたが、詳細まで学習しきれていません)
もしかしたら、自分が使っているUnityのPackageなどによる影響かもしれませんが、今のところ2つ作成したアプリどちらでも同じ手順が必要になっています。
Unity上のデバイスシミュレータや、xCodeのシミュレータ、あと持っていれば実機での動作確認も行えるため、iOSシミュレータでの動作確認は必須では無いと思いますが、自分の場合、リリース用のスクリーンショットが全指定サイズ揃えられなかったため、iOSシミュレータでの実行が必須でした。
ゲーム自体は出来上がって、あとはリリースするだけという状態で、スクショが準備できなくて断念…では非常に勿体ないので、丸一日かけてしまいましたがなんとか解決できてよかったです。
うまく解決方法にたどり着くまで時間がかかってしまったため、この記事が同じような問題でハマっている誰かの役に立つと幸いです。