FlutterでCocoaPodsのライブラリを使う

Flutter、ついに 1.0 がリリースされましたね。

これからFlutterはますます盛り上がっていきそうですね!

Flutterは 1.0 になる前から触っているのですが、その中でもおそらく一番はまったであろうことを今回は記事として残しておこうかと思います。

Flutterから、CocoaPodsでリリースされているライブラリを使う方法になります。

FlutterからSwiftのコードを呼ぶ時は platform channels を使う

Flutterで CocoaPods のライブラリを使うといっても、Dart のコードから直接 CocoaPods のライブラリを呼ぶわけではなく、platform channels というものを使います。

公式ドキュメントに使い方が詳しく書いてあります。

これに従って実装すれば、Flutter から Swift(Android であれば JavaかKotlin) のコードを呼び出すのはそれほど難しくなく実装できるかと思います。

せっかくSwift のコードを呼び出せるのであれば、その中で CocoaPods で公開されてるライブラリも使いたい!ということがありました。
いろいろあってセットアップが面倒だったのでハマったところとワークアラウンドを紹介していきます。

確認環境

  • macOS Mojave 10.14.1
  • flutter v1.0.0
  • Xcode 10.1
  • pod 1.5.3

手順

状況によって2パターンの方法でライブラリが利用できることを確認しました。

  • Firebase関連のパッケージを使わない場合
    => 自前で Podfile をセットアップした後、xcconfig の設定を追記する
  • Firebase関連のパッケージを使う場合
    => Firebaseのパッケージで追加される Podfile に使いたいライブラリを追加する

Flutter 本体は Podfile を使ってないみたいでしたが、Firebase 関連のパッケージが Podfile を使っているようで、その兼ね合いでFirebase 関連のパッケージを使うかどうかで違う手順を取る必要がありそうな感じでした。
一個ずつ説明します。

ここでは、わたしが CocoaPods に公開した NemSwift を試しにインストールしてみます。

Firebase関連のパッケージを使わない場合

まずは Firebase 関連のパッケージを使わない場合です。

アプリでFirebaseを使う可能性がある場合は、この手順は行わず、「Firebase関連のパッケージを使う場合」の方をご確認ください。

Flutterで新しくプロジェクトを作成すると、「ios」と「android」のディレクトリに、それぞれのプラットフォーム固有のデータが作成された状態になっています。

iOS の場合は Xcode のプロジェクト、ワークスペースがこの中に含まれる形になっているのですが、プロジェクトを作成した段階では Podfile などは作成されていませんので、自分で Podfile を作成する必要があります。

flutter create でプロジェクトを作成後、

で Podfile が作成されますので、通常の CocoaPods を使う場合と同様に、pod を追加します。

その後、pod install をするわけですが、pod installをすると下記の警告が出るかと思います。

CocoadPods は .xcconfig という設定ファイルを使って依存ライブラリのパスなどを管理しているようなのですが、Flutter の方で既に別の xcconfig ファイルを使っているために、このままだと CocoaPods の設定が反映されないよってことみたいです。

このままビルドしようとすると、下記のようなエラーが出てビルドできません。

というわけで、この警告の手順に従い、Flutter/Debug.xcconfig などを編集して CocoaPods の xcconfig を使用できるようにします。

xcconfig から別の xcconfig ファイルを参照できるので、Flutter/Debug.xcconfig を編集して Pods-Runner.debug.xcconfig をインクルードするようにします。

release も同様に。

これで Swift のコードの方から import NemSwift としてもエラーがでなくなるかと思います。

Firebase関連のパッケージを使う場合

FlutterでFirebase関連のパッケージを使う予定がある場合は、上記の自前でPodfileを使う手順は行わず、こちらの手順を行う必要があります。

Firebase関連のパッケージを使う場合、前述のとおり Podfile の設定がこれらのパッケージから実行されるようです。確認したのは、analytics のパッケージと firestore のパッケージです。

  • firebase_analytics: ^1.0.6
  • cloud_firestore: ^0.8.2+3

これらのパッケージの参照を pubspec.yaml に追加した状態で flutter run などで iOS 環境で動作させようとすると、ビルド時に Podfile を作成して pod install を実行するという動作をします。

ただし、この Podfile の作成処理、既に Podfile が存在する状態だとスキップされるみたいです。

そのせいで、先に上述の Podfile 作成処理をおこなってしまうと、firebase、firestore 関連の Pods がインストールされずに、下記のようなエラーが出てビルドが失敗します。

analytics の場合

cloud_firestore の場合

本来 CocoaPods で取得するはずだったライブラリがとれてないってことかと思います。

というわけで手順としては、

  1. 既に ios/Podfile が存在する場合は一旦別名のファイルにするなどして退避
  2. pubspec.yaml に firebase_analytics などの依存を追加
  3. flutter run を実行して Firebase関連のパッケージに Podfile を作成させる
  4. 作成された Podfile に使いたい pod の参照を追記

という感じで、Firebase と CocoaPods のライブラリの両方を使うことができるようになりました。

なお、こちらの手順の場合、Firebase のパッケージの方で xcconfig の設定もやってくれるので、xcconfig を自分で編集する必要もありません。

さいごに

あとで Firebase 追加しようと思ってアプリ作り始めたらえらいハマりました。

先に Firebase の設定しておけば良かったなという事案でした。

ちなみに Android の方はプロジェクト作成した段階で build.gradle ができてるのでそれに必要なライブラリを追加すれば良いだけで、とても簡単でした。

今回のセットアップを行っただけの状態ですが、GitHubにあげときました。


最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。



この記事をシェアする




りゅーた
フリーランスのエンジニアしてます。Android、iOS アプリの開発、対向サーバの開発、C/C++のライブラリ開発が現在のメイン。趣味はテニス。3児の父。 もっと詳しく

コメントを残す

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

CAPTCHA