2021.12.13
iOS15でInHouseアプリが突然動作しなくなった時の解決策 〜iOS15へのアプデート抑制ができなくなる前に〜
配布方法によらず ADEP(IDEP) の InHouse で業務アプリを使用している場合、iOS15にアップデートした途端に以下のようなダイアログが表示されて、アプリが起動しなくなることがあります。
ダイアログには「AppをこのバージョンのiOSで動作させるには、デベロッパによるアップデートが必要です。」とありますが一体何をすれば良いのでしょうか。
本稿では、このような現象に遭遇した方を対象に原因と解決策について解説します。
現象の原因
よく知られているようにiOSアプリはビルド時に署名を行います。アプリの起動時には、iOSがその署名の妥当性を検証します。問題があればそのアプリは起動させて貰えません。例えば、provisioning profile の期限が切れて起動できなくなるのが分かり易い例ですね。
今回問題にしているこの現象は、iOS15がよりセキュアな署名チェックを行うようになったことの影響で、署名が妥当でないと判断されるようになってしまったことに起因します。条件が厳しくなって、今まで大丈夫だったのに急に怒られるようになったというわけです。
実は、macOS Mojave(10.14) の頃からアプリの署名が新しい形式となっていて、さらに特別な Entitlement (許可情報) が含まれるようになりました。iOS15がそれらを厳密にチェックするようになったため、
- 新しい形式で署名されていない InHouse アプリ
- 新しい形式だが適切な Entitlement を含んだ署名になっていない InHouse アプリ
である場合に本現象が発生します。
毎年新しい環境でInHouseビルドして配布している環境では問題ない筈ですが、古い InHouse アプリを Provisioning Profile の単体配信で延命利用していたり、ずっと古い macOS や Xcode を使ってビルドしているInHouseアプリなどが該当します。
対応策
やるべきことは至って簡単で、
- macOS Big Sur 以降でビルド or 再署名する
- 生成した InHouse の ipa ファイルを配布する
の2ステップで解決できます。
少し余談になりますが、こんな時に MDM が導入されていない現場では大変です。2.の配布を管理側のオペレーションで遠隔一発更新というわけにはいかないからですね。このようなケースでもスピーディな対応ができるように、やはりMDMは導入必須です。まだの企業は是非導入を検討して下さい。
iOS15アップデート前に確認する方法
まだ iOS14 以下で InHouse アプリを使っている場合、事前に本現象が発生するのかしないのか確認しておくことをお勧めします。
iOS15のリリース(2021/9/21)から90日間はアップデートを抑制できますが、本記事執筆時点(2021/12/13)で期限は残り1週間しかありません。2021/12/21以降は、iOSアップデート抑制の設定を配信していても各端末でiOS15へアップデートできるようになります。(参考 : iOSのアップデートができないように抑制する方法 〜前編〜)
現場が勝手に iOS15 にアップデートし始めてしまう前に、本現象に遭遇するのかを調べておきましょう。iOS15環境がなくても InHouse アプリの ipa ファイルさえあれば、以下の手順で確認することができます。
(1) まず InHouse の ipa ファイルを解凍します。 (.ipa は実質 zip 形式のアーカイブファイル)
% unzip myApp.ipa Archive: myApp.ipa creating: Payload/ creating: Payload/myApp.app/ creating: Payload/myApp.app/_CodeSignature/ inflating: Payload/myApp.app/_CodeSignature/CodeResources ...(略)...
(2) Payload というディレクトリが生成され、中に [アプリ名].app というディレクトリが現れます。(Finder上ではファイルのように見える)
% ls -l Payload total 0 drwxr-xr-x@ 43 oishi staff 1376 12 11 19:16 myApp.app/
(3) このパスに対して codesign コマンドを以下のように実行します。
% codesign -dvvvvv Payload/myApp.app Executable=/path/to/ipa/Payload/myApp.app/myApp Identifier=jp.feedtailor.myApp.inhouse Format=app bundle with Mach-O thin (arm64) ...(略)... Executable Segment base=0 Executable Segment limit=688128 Executable Segment flags=0x1 Page size=4096 -5=f79bb5d986cfbb60b019f8e4be46a537ae2dcdfc15c9ca56303a45e8ab8bba37 -4=0000000000000000000000000000000000000000000000000000000000000000 -3=17891e74b11e06c57310a39c05558d7a0fdeb5c1fc5bb82d8dd76f2d0b22994c -2=da7932525b77ccade37b4ac72b436eae3a06271b4e75ee7858527518b317440a CDHash=fb91e7653ec272ead220a38713a09c95455d43fe Signature size=4755 Authority=iPhone Distribution: feedtailor Inc. Authority=Apple Worldwide Developer Relations Certification Authority Authority=Apple Root CA Signed Time=Dec 11, 2021 19:16:28 ...(略)...
表示された署名情報の中で、-7 という項目が存在していなかったり(上の例。-2から-5までは存在する)、-7 が存在していても 0000〜 となっている場合は再署名が必要です。mac OS BigSur 環境での再署名が推奨されます。逆に以下のように -7 の項目が存在している場合は、再度署名が不要で本現象には遭遇しないと判断できます。
Page size=4096 -7=6f44c7b43a6b0f20a8126100b905005e4a527bedeb321e598c56c443e394d667 -6=0000000000000000000000000000000000000000000000000000000000000000 -5=f79bb5d986cfbb60b019f8e4be46a537ae2dcdfc15c9ca56303a45e8ab8bba37 -4=0000000000000000000000000000000000000000000000000000000000000000 -3=17891e74b11e06c57310a39c05558d7a0fdeb5c1fc5bb82d8dd76f2d0b22994c -2=da7932525b77ccade37b4ac72b436eae3a06271b4e75ee7858527518b317440a
本件の詳細は Apple も公式ドキュメントで解説してくれています。Using the Latest Code Signature Format のページを併せてご覧下さい。
ということで、InHouseアプリがiOS15で突然動作しなくなる現象の原因と対応策について紹介しました。
ちなみに AppStore アプリや TestFlight 配信されるアプリでは発生しません。AppStoreから各ユーザ端末に配信される前に Apple 側で適切に再署名されるからです。このことを考えてもやはり、ADEPによるInHouseアプリ運用から早く脱却し、AppStore公開アプリかカスタムAppの運用にした方が良いことが分かりますね。(参考 : ADEPはもう取得することができないと諦めたほうが良い理由)