酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Xcode12でCocoaPods以外の方法でFirebaseをインストールするとAppStoreへのアップロード時に失敗する

Firebase for iOS SDKの正式な導入方法としては、CocoaPods経由でインストールすることになっています。

しかし、CarthageまたはSwiftPMでの導入方法はまだベータ版扱いですが導入手段が提供されています。Xcode 12 betaあたりまでは正常に動いていたようなのですが、Xcode 12の正式版が出た段階で CocoaPods以外の方法でFirebaseをインストールするとAppStoreへのアップロードに失敗してしまうようになりました。

エラー内容は下記の通りで、まったく情報がありません。

Found an unexpected Mach-O header code: 0x72613c21

今週あたま、GitHubに書き込まれたコメントを参考にすることで、問題なくAppStoreにバイナリをアップロードすることができました。

実行環境

  • macOS 10.15.7 (19H2)
  • Xcode 12.0.1
  • Carthage v0.36.0

古いバージョンのCarthageを使っている場合には、Mac HomebrewでCarthageをアップデートしておくと良いかもしれません。

brew upgrade Carthage

Carthageは頻繁にアップデートがおこなわれないのでみんな最新のものを使っているかと思います。

Cartfile の中身

サンプルとして弄ったプロジェクトでは、Carthage経由で「AdMob」「Firebase Analytics」「Firebase Crashlytics」を導入しています。

github "realm/realm-cocoa"
github "SDWebImage/SDWebImageSwiftUI"
github "yhirano/LicensePlistViewController"
github "takecian/SwiftRater"
github "NYTimes/NYTPhotoViewer"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAdMobBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAnalyticsBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseCrashlyticsBinary.json"

*.framework をリンクする作業等は、通常通りしてください。Buld Phasesで/usr/local/bin/carthage copy-frameworksするのも忘れないで。

対応策

アプリターゲットの「Build Phases」を開いて、Run Scriptを追加します。スクリプトは一番最後に移動させてください。

f:id:ch3cooh393:20201016172244p:plain

このタイミングでFirebase関係の.frameworkを削除します。具体的には app/Frameworks/HOGEHOGE.framework を削除します。

f:id:ch3cooh393:20201016172259p:plain

画像だと見にくいと思いますので書き出しました。

# Type a script or drag a script file from your workspace to insert its path.
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/FIRAnalyticsConnector.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/Firebase.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/FirebaseAnalytics.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/FirebaseCore.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/FirebaseCoreDiagnostics.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/FirebaseCrashlytics.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/FirebaseInstallations.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/GoogleAppMeasurement.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/GoogleDataTransport.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/GoogleMobileAds.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/GoogleUtilities.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/nanopb.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/PromisesObjC.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/UserMessagingPlatform.framework"

これでCarthage経由でFirebase for iOS SDKをインストールしたアプリでもApp Storeへのアップロード時にエラーが発生することがなくなります。