[unity2019]Firebase が Android で動くのに Mac はダメ…よくある話

普段 Windows で開発、Apple ストアに出すときだけ Mac を使う。
Linux bash(zsh?) も苦手だから出来る限り目を瞑りたい。でも動かない。
こんな人であれば、少しは役立つ情報が混じっているかもしれません。

unity2019.4.24Firebase7.1.0 にて確認。

Cocoapods が入っていない

iOS Firebase インストールには Cocoapods というバージョン管理ツール? が必要ですが、Mac OS X Catalina には標準搭載されておらず、unity FirebaseiOS Resolver でインストールしようとしてもエラーになってしまいました。

結局手動で入れることに。その顛末はこちら
Mac 使いには簡単なことでも、結構右往左往しました。

xcodeproj ではなく xcworkspace で開く必要がある

プチハマり第1弾。xcodeproj だと XCode ビルド時にエラーになってしまいますので、xcworkspace から開きます。

xcodeproj でビルドすると

なお、後から知りましたが Firebase iOS Resolver/Setting で、こんな設定がされていました。

これを Xcode Project にすると xcodeproj でもいいのかもしれないのですが、そちらは試しておりません。

iOS Resolver とは

Firebase をインストールすると、メニューに Assets/External Dependency Manager なるものが追加されています。Firebase のインストールは(機能が多いのもあり)複雑なので、出来るだけ自動で簡単に、というヘルパーだと思います。

Undefined Symbol: _Firebase_XXX

これは完全に自分の落ち度。恥ずかしいけどそのまま公開。
Mac の理解度が浅いままこういう事をやると、こんなうっかりでも致命傷になりかねない…反省。

どうりでネット探しても、同じことで引っかかってる人いなかった

Windows で作成したプロジェクトを svn 経由で Mac にインポート…したつもりが、どうやら libXXXXXX.a をリポジトリに追加していませんでした…。

ほら、よくみると meta しかない
unity も警告を出している

そしてこれに気づかず、XCode でコンパイルすると  大  量  の  エ  ラ  ー。

合計 100 も出ていました

Undefined symbol: _Firebase_...

C# に慣れきって、C++ の事情などすっかり忘れた身には厳しい状態でしたが、以下のような確認手順を進め、原因が発覚。
(そもそも unity の警告をちゃんと見ていれば不要でしたが…)

エラーが ld(リンク)で起こっている
Firebase のリンクなので多分 iOS 用のフレームワークが見つからず、エラーになっている
→ パスを通す必要性?
→ そもそも Firebase iOS 用フレームワークってどこにあるんだっけ…?
フレームワークが見当たらない事に気づく
(それ以外にも not found for architecture arm64 で散々探したり、結構迷走しました…)

これに該当する人はほぼいないと思いますが、対処法は…ですね?
カカッとリポジトリに必要なファイルを追加。

Link frameworks statically にチェックを入れないとエラーになる

よし、これでさすがにビルド通るだろう! と思いましたが、壁はまだありました。

Undefined Symbol: _OBJC_CLASS_$_GKLocalPlayer

これについては、同じエラーだけど解決方法が(ネット記事では)バラバラで、どれも該当しそうな記事も見当たりませんでした。
半ば諦めつつ、色々やっていたオペレーションの1つが、たまたま上手くいきました…。

Link frameworks statically にチェックをつける

iOS Resolver - Settings にある Link frameworks statically にチェックをつけます。

framework って単語や、static なら(なんか実行ファイルに)埋め込んでくれるんじゃね? というアバウトな発想でしたが、やってみるもんですね…。

ちなみに、Firebase 公式サイトにはこんな事も書かれていました。

CocoaPods1.9.0およびFirebase7以降では、Firebaseの依存関係を静的フレームワークとして構築するか動的フレームワークとして構築するかを選択できます。特定のダイナミックライブラリの動作が必要な場合を除いて、静的フレームワークを使用することをお勧めします。

Firebaseの依存関係を静的または動的にリンクする

なら…最初からチェックつけてよ…っ…!

なるほど。Firebase7 からのルールで、まだこなれていない部分なのでしょう。
日々、大量の要件に追われ、常にバージョンアップを続けているライブラリ開発者の方には感謝です(本当です)。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA