Carthage + Xcode の Archive で IPA processing failed が発生した場合の対処

状況

何年か前に作成した iOS プロジェクトを Xcode 11 でビルドできるようにし、デバッグ実行・実機転送では問題なく動くようにした状態で Enterprise 用に Archive しようとすると、 IPA processing failed とかいう適当なメッセージが表示されて先に進めません。

ログを確認すると以下のようなメッセージが出てました。

2020-xx-xx 02:28:49 +0000  /Applications/Xcode 11.3.app/Contents/Developer/usr/bin/ipatool exited with 1
2020-xx-xx 02:28:49 +0000  ipatool JSON: {
    alerts =     (
                {
            code = 3620;
            description = "Configuration issue: platform AppleTVSimulator.platform doesn't have any non-simulator SDKs; ignoring it";
            info =             {
            };
            level = WARN;
        },
                {
            code = 3620;
            description = "Configuration issue: platform WatchSimulator.platform doesn't have any non-simulator SDKs; ignoring it";
            info =             {
            };
            level = WARN;
        },
                {
            code = 3620;
            description = "Configuration issue: platform iPhoneSimulator.platform doesn't have any non-simulator SDKs; ignoring it";
            info =             {
            };
            level = WARN;
        }
    );
}

環境

  • Xcode 11.3
  • Carthage 0.34.0

調査

ログの内容で検索すると、ライブラリからシミュレーターのアーキテクチャーを除去すれば良いとかで怪しげなスクリプトが貼られており、「いやそれはないだろ」と思って Carthage の設定を見直すことにしました。

原因

やっぱり Carthage の設定が古いのが原因だったっぽいです。

対処

Carthage の GitHub を参考に、ライブラリの導入手順を見直しました。 GitHub の記述そのままですが、 2020/3 時点では以下のような感じ。

  1. carthage update --platform iOS でライブラリをビルド
  2. Xcode の TARGETS -> アプリ名 -> General -> Frameworks, Libraries, and Embedded Content に、Carthage/Build/iOS 配下の *.framework をドラッグアンドドロップ
  3. Xcode の TARGETS -> アプリ名 -> Build Phases -> Run Script に /usr/local/bin/carthage copy-frameworks を記述
  4. Cartfile のあるディレクトリに input.xcfilelistoutput.xcfilelist を作成
  5. input.xcfilelist$(SRCROOT)/Carthage/Build/iOS/xxx.framework のように、利用しているライブラリ分記述し、 Input Files でのライブラリの指定を削除
  6. output.xcfilelist$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/xxx.framework のように、利用しているライブラリ分記述
  7. Run Script の Input File Lists に $(SRCROOT)/input.xcfilelist を、 Output File Lists に $(SRCROOT)/output.xcfilelist を指定

今回はこれに加え、 Build Phases の Embed Frameworks で利用しているライブラリを設定していたので、これらを全部消しました。これがあるとデバッグ実行で Multiple commands produce とかいうエラーが出てました。これを消すことで Archive も通るようになりました。

以前は Embed Frameworks に指定するやり方だった気がするんですが、やっぱり環境アップデートする場合は公式ドキュメント読め、ですね。前提が間違っている状態でログの内容をもとに調べてもダメでした。あとはもうどうしても必要な場合以外は外部ライブラリはなるべく使わないほうが良いかもしれないですね。環境周りでハマるとつらすぎます。

iOS 開発難しい。よく皆こんなのできるな・・・。