もんりぃ is undefined.

育児ネタとか、技術ネタとか。

Mojave → Catalina のアプデで Firebase 入り Unity プロジェクトの iOS ビルドが通らなくなったおはなし

はじめに

かれこれ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
例のリスト を公開しているので、遠慮せずにお祝いをお送りいただいて構いませんよ?😁

*1:アプリのリリース頻度が高くて、なかなか環境弄るのが大変なんです 😓

*2:いや、完全な思いつきじゃなくて、ある程度は計画してますよ?

*3:KidsStar では、Slack にコマンド投げたらビルドができあがる凄いシステムが構築されております。興味ある人は Wantedly からエントリーしよう!

*4:例の BGM は皆さんの脳内で再生してください。

*5:と、言っても SSS みたいなオサレビルとかではなく、道玄坂上ったとこにある普通のオフィスビルなんですが。