iOS15でexpoアプリが「アップデートの必要があります」と出て起動しない場合の対応


expoで作成したInHouse(Enterprise)アプリで、iOS15にアップデート後に「デベロッパーによるアップデートが必要です」と出て起動しない現象が出ています。(21/9/22)

※あまり大騒ぎになっていないので、InHouseのみかと思います。

expo build:iosでビルドしなおしても、SDK42にアップデートしても同様のエラーとなります。

解決方法

ビルドサーバーが対応するまでは、ローカル環境(XCode 14.5 or 15)でビルドします。

必要な物

  • turtle-cli
  • fastlane
  • XCode

手順

$ npm install -g turtle-cli
$ brew install fastlane

下記のようなMakefileを作りました

Makefile
make_ipa:   
    @echo "Building IPA"
    EXPO_IOS_DIST_P12_PASSWORD='hogehoge' \
     turtle build:ios \
        -u <expo user> -p <expo pass> \
        --team-id <teamid> \
        --dist-p12-path <.p12 path> \
        --provisioning-profile-path <.mobileprovision path> \
        --public-url https://exp.host/<hostpath> \
        -o build/my-sample.ipa

エラーなど

  • EXPO_IOS_DIST_P12_PASSWORDを指定しなかったりパスワードを間違えるとエラーになります。エラーを見ても間違いがわかりにくいので注意。
  • Provisioningなどはexpoにアップロードしてあるものをダウンロードすると間違いないです
  • public-urlはexpoのアプリパスでメタデータを引いてくるため必須です。

参考

  • eas.jsonを追加する方法では効果ありませんでした(有償プラン必須?)
  • ビルドサーバーはXCode13が正式リリースになれば対応するとの事。

背景

どうやらEnterpriseアプリケーションのコード署名方法に何らかの変更があったようです。

下記に、AppStore, Testflightの場合は配布時に置き換えるので影響しないが、直接配布するadhocは影響しmacOS10.14(Mojave)以降では新しいフォーマットで署名されますとあります。

Look in the output for a string like CodeDirectory v=20500. For any value of v less than 20400, you’ll need to re-sign your app.

コードサインの確認

$ unzip old.ipa
$ codesign -dv Payload/ExpoKitApp.app 
Executable=...
Identifier=...
Format=app bundle with Mach-O thin (arm64)
CodeDirectory v=20400 size=303198 flags=0x0(none) hashes=9466+5 location=embedded

確認するとたしかにCodeDirectory v=20400で、更新の必要があるようです。

むにゃむにゃ

いつもexpoのビルドを便利に使っていたのですが、CLIからも意外に簡単にビルドする事ができました。待ち時間も無いので一度設定しておくと良いかと思います。どうして署名が古いのかは謎です。