moyashidaisuke's diary

moyashidaisuke's diary

UnityのiPhoneX対応で苦労したポイントメモ

2018-07-14 moyashidaisukeUnityiOS

当時のログがあまり残ってないのもあって、不完全ですが、メモという事でご容赦ください。

やるべき事(ざっくり)

[https://developer.apple.com/ios/submit/:title]

[https://moyashidaisuke.hatenablog.com/entry/2018/04/03/202627:embed:cite]

  1. iOS 11 SDKでビルドする
  2. iPhoneXのSupreRetinaディスプレイに対応する

iOS 11 SDKでビルドする

必要要件の確認

iOS 11 SDKでビルドするためには、XCodeの9以上にする必要があります。

[https://qiita.com/rotors123/items/ea2af739b330b11c906b:embed:cite]

そして、XCodeの9.0〜9.2まではSierra、9.3以降はHighSierraに更新する必要があります。(9.2でSierraという組み合わせも考えられなくは無いですが、敢えて古いバージョンを使う理由がなければ、この際最新にした方が良いと思います。)

そして、HighSierraにするには、Unityのバージョンが問題になる事があります。

[https://helpdesk.unity3d.co.jp/hc/ja/articles/115012768187-macOS-10-13-High-Sierra-%E3%81%AB%E3%81%A6-Project%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E5%86%85%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E8%A6%8B%E3%81%88%E3%81%AA%E3%81%84-%E3%81%82%E3%82%8B%E3%81%84%E3%81%AFMonoDevelop%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84:embed:cite]

最低でもUnity 5.5.4p5 以上が必須になります。

必要要件まとめ

  • iOS 11 SDK
  • XCodeの9以上
  • HighSierra
  • Unity 5.5.4p以上

はい、明らかに大変そうな予感がぷんぷんします。 特にしんどそうなのが、Unityのバージョンアップが必要な場合です。

変更前

  • iOS 11 SDK
  • XCodeの9.3
  • HighSierra
  • Unity 5.6.

にを採用する事にしました。 Unityが5.6系なのは2017系だと更新が激しすぎてしんどそうだったためです。 5.5系よりは寿命が長そうとの判断もあります。(5.X系の最新なので)

もろもろバージョンアップ

OSのアップデート

普通にやればOK

XCodeのアップデート

普通にやればOK

ビルドで失敗する、、、(iOS) podが壊れてるっぽいエラーが出てたので最新化したら通りました。 https://qiita.com/Yuta/items/a20f4ea3207635b4ef9e

Unityのアップデート

インストールまでは普通にやればOK。 基本的には既存のUnityとは別でインストールする事をおすすめしますが、今回はHighSierraにした時点で過去のUnityが使い物にならなくなるので、上書きでも良いと思います。

コンパイルエラー潰す

gettype使えない対応 http://tsubakit1.hateblo.jp/entry/2016/11/25/235315#Unity-55%E4%BB%A5%E9%99%8D%E3%81%AE%E5%A0%B4%E5%90%88

targetSDKVersionはどちらにしろあげないといけないので、全て26に統一しました。

iPhoneXのSupreRetinaディスプレイに対応する

自分で書いたアプリのディスプレイ対応

Unity公式のを参考に

[http://chocolattips.hatenablog.com/entry/2018/01/29/000000:embed:cite]

外部ライブラリ対応

あと、外部ライブラリを使っている場合、ライブラリの更新が必要になるケースが多いです。(広告とか)

これがまた大変です、、、

Unityのライブラリはunitypackageという、関連ファイルをまとめたものを展開する方式が一般的ですが、これは上書き機能しかありません。

Aというファイルが、新しいsdkでAというファイルのまま更新される分には問題ないですが、AというファイルがBというファイルにリネームされた(ディレクトリ構造が変わった場合含む)場合、sdkを更新してもAというファイルは残り続けます。 古いファイルが残っていると、大体コンパイルエラーで動かなくなります。

なので、sdkを更新する前に、古いsdkのファイル郡を一旦削除する、という手順を踏む事になりますが、そもそもどれかunitypackageから展開されたものなのか、という関連性はどこにも残っていません。 バージョン管理しているのであればその履歴から、ディレクトリにまとまっているものであればディレクトリ単位で削除、といった手段が考えられますが、これも問題があります。

削除してくれるAssetもあったようですが、今見たら入手不可能になっていました、、

[http://baba-s.hatenablog.com/entry/2016/04/01/180000:embed:cite]

中にはお作法が悪くて、ディレクトリがまとまってないものが存在したり、インポートした後に、手動でマージ(AndroidManifest等)を強制されるライブラリもあったりするので、試行錯誤して消すしかありません。 AndroidManifestといえば、一生懸命書いた既存のAndroidManifestを無慈悲に上書きしようとしてくるやつもいるので注意が必要です。

また、native系のファイル(jarとか)も同じようなもので、昔のやつだとplaysotre系のjarとかaarが直接unitypackageに含まれていて、それが別のライブラリに含まれているバージョンと競合したりします。

unitypackageとのひもづけをproject上に残しておいて、一括で削除する機能、公式でください、、、

Android64k問題

trouble writing output: Too many field references to fit in one dex file: 92846; max is 65536.

[https://qiita.com/yyama2/items/9701a45556e90580c35d:embed:cite]

sdkを更新したらなぜか死ぬほど増えた。

MultiDexビルドも頑張ってやったけどアプリが安定せず、困ったな〜と思ってたら、5.6で追加されたgradleでのビルドにしたらあっさり通った。

[https://docs.unity3d.com/ja/current/Manual/android-gradle-overview.html:embed:cite]

特に Unity では、DEX (Dalvik Executable 形式) ファイルのメソッド参照数が減少します。つまり、DEX 制限問題に遭遇する可能性は低くなります。

特にカスタムすることなく、デフォルト設定であっけなく動いた、、、

UnityでAndroid64k問題にぶちあたった場合は、是非試してみてください。

感想

iPhoneX対応うんぬんより、unitypackageの更新しんどい問題が一番やばかった、、、