はじめに
かれこれ1週間近く外に出ていません。
新型コロナウィルスとは関係無く、3月中旬くらいから娘を連れて実家に疎開してるマンなのですが、和室に布団敷いて仕事環境を構築してしまったもんだから、完全に和室に根を生やした状態にあります。
さて、クソ長いタイトルとなっていますが、そのままズバリそういう事象が起きたので、それの解決方法をつづります。
TL; DR
gem update cocoapods
事象
弊社では Mac mini を Unity アプリのビルドサーバにしています。
で、この Mac mini の環境が若干古くて *1 2020/03/31 (Tue) 時点で以下のような感じになっていました。
で、6月30日まで延長されたとは言え、「Xcode 11 (っていうか iOS SDK 13)でビルドしないとリジェクトすんぞ」という Apple 様からのお達しもあるので、申請の隙間を狙ってアプデをしようと思い立ちました。*2
で、macOS のアプデ途中に1時間経ってもリモートデスクトップに繋げなくて半ベソ状態になったりもしましたが、無事に以下の環境にアプデできました。
てことで、「よーし、パパ、ビルド投げちゃうぞー」と、Slack にビルドコマンド投げつけて *3 晩飯を食っていたら「Build Failed」と通知が飛んできました。
はい、ビルド転けました。😭
原因
「なんでやねん!」ってことで、これまた Slack に「ログ頂戴」と投げつけて、ログを読んでみたところ、Xcode の Archive フェーズで以下のようなエラーを吐いて死んでました。
Undefined symbols for architecture arm64: "_OBJC_CLASS_$_FIRConfiguration", referenced from: objc-class-ref in libFirebaseCppApp.a(log_ios_dd26aec5b8537064a4c15d38b58b4640.o) "_OBJC_CLASS_$_FIRDynamicLinkGoogleAnalyticsParameters", referenced from: objc-class-ref in libFirebaseCppDynamicLinks.a(dynamic_links_ios_0af0a68a25ef9955faed88c29e3c9d2f.o) "_OBJC_CLASS_$_FIRApp", referenced from: objc-class-ref in libFirebaseCppApp.a(app_ios_814e1620d4f88024cea4bade26623a67.o) "_OBJC_CLASS_$_FIROptions", referenced from: objc-class-ref in libFirebaseCppApp.a(app_ios_814e1620d4f88024cea4bade26623a67.o) "_OBJC_CLASS_$_FIRDynamicLinks", referenced from: objc-class-ref in libFirebaseCppApp.a(invites_receiver_internal_ios_aa7b75b2efc3269e88f1077e55250e5a.o) "_OBJC_CLASS_$_FIRDynamicLinkAndroidParameters", referenced from: objc-class-ref in libFirebaseCppDynamicLinks.a(dynamic_links_ios_0af0a68a25ef9955faed88c29e3c9d2f.o) "_OBJC_CLASS_$_FIRDynamicLinkComponentsOptions", referenced from: objc-class-ref in libFirebaseCppDynamicLinks.a(dynamic_links_ios_0af0a68a25ef9955faed88c29e3c9d2f.o) "_OBJC_CLASS_$_FIRDynamicLinkIOSParameters", referenced from: objc-class-ref in libFirebaseCppDynamicLinks.a(dynamic_links_ios_0af0a68a25ef9955faed88c29e3c9d2f.o) "_OBJC_CLASS_$_FIRMessaging", referenced from: objc-class-ref in libFirebaseCppMessaging.a(messaging_231c52c311096cfce13e67fa91eb9ac5.o) "_OBJC_CLASS_$_FIRDynamicLinkItunesConnectAnalyticsParameters", referenced from: objc-class-ref in libFirebaseCppDynamicLinks.a(dynamic_links_ios_0af0a68a25ef9955faed88c29e3c9d2f.o) "_OBJC_CLASS_$_FIRDynamicLinkComponents", referenced from: objc-class-ref in libFirebaseCppDynamicLinks.a(dynamic_links_ios_0af0a68a25ef9955faed88c29e3c9d2f.o) "_OBJC_CLASS_$_FIRAnalytics", referenced from: objc-class-ref in libFirebaseCppAnalytics.a(analytics_ios_d28a0e676a7367b8f2d91944bb505d87.o) "_OBJC_CLASS_$_FIRDynamicLinkSocialMetaTagParameters", referenced from: objc-class-ref in libFirebaseCppDynamicLinks.a(dynamic_links_ios_0af0a68a25ef9955faed88c29e3c9d2f.o) ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
弊社のアプリは一部に Firebase を使っているのですが、ソイツの Link 周りで転けているみたいでした。
はいはい。いつものね。
ってことで、いつものように調べていたところ、なんと言うことでしょう。 *4 本来であれば Firebase 入りの Unity iOS ビルドは CocoaPods による依存解決を行うために Unity-iPhone.xcworkspace
という Xcode Workspace が生成されるはずなんですが、それが生成されていないではありませんか。
で、これはナニカがオカシイ、というコトで再度 75,000 行超え(!)のログを読みあさってみたところ、以下のようなエラーを発見。
/bin/bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: bad interpreter: No such file or directory
はい。 CocoaPods のコマンドラインインタフェースである pod
コマンドが参照する Ruby のインタプリタが見付かっていない、と。
そうです。原因は Catalina になって、同梱される Ruby のバージョンが 2.3 から 2.6 に上がったのに、pod コマンドが更新されていない所為で参照しているバージョンが古いままだった というオチでした。
解決
てことで、RubyGems 経由でインストールしている CocoaPods をアップデートします。
$ gem update cocoapods $ pod --version 1.9.1
はい、これで無事にビルドフェーズで転けずに Xcode Workspace が出力されるようになって、正しく iOS アプリがビルドされるようになりましたとさ。めでたしめでたし。
おわりに
OS のアプデとか IDE のアプデとかする際には気をつけましょうというお話しでした。
まぁ、元々一発ですんなりビルド通るとは思っていませんでしたが、思ったよりも早期解決できたので、大分ビルドおじさんとしてのスキルが上がってきた感じかなぁ?とか思っております。
あ、そうそう。私が勤める株式会社キッズスターはオフィス移転して2020年4月6日より渋谷の民になります。 *5
例のリスト を公開しているので、遠慮せずにお祝いをお送りいただいて構いませんよ?😁