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
でプロジェクトを作成後、
1 2 3 4 |
$ cd your_flutter_project $ cd ios $ pod init |
で Podfile が作成されますので、通常の CocoaPods を使う場合と同様に、pod を追加します。
1 2 3 4 5 6 7 8 9 |
target 'Runner' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! # Pods for Runner pod 'NemSwift' # add end |
その後、pod install
をするわけですが、pod install
をすると下記の警告が出るかと思います。
1 2 3 4 5 6 |
[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `Runner` to `Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig` or include the `Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig` in your build configuration (`Flutter/Debug.xcconfig`). [!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `Runner` to `Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig` or include the `Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig` in your build configuration (`Flutter/Release.xcconfig`). [!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `Runner` to `Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig` or include the `Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig` in your build configuration (`Flutter/Release.xcconfig`). |
CocoadPods は .xcconfig という設定ファイルを使って依存ライブラリのパスなどを管理しているようなのですが、Flutter の方で既に別の xcconfig ファイルを使っているために、このままだと CocoaPods の設定が反映されないよってことみたいです。
このままビルドしようとすると、下記のようなエラーが出てビルドできません。
1 2 3 |
diff: /Podfile.lock: No such file or directory diff: /Manifest.lock: No such file or directory |
というわけで、この警告の手順に従い、Flutter/Debug.xcconfig などを編集して CocoaPods の xcconfig を使用できるようにします。
xcconfig から別の xcconfig ファイルを参照できるので、Flutter/Debug.xcconfig を編集して Pods-Runner.debug.xcconfig をインクルードするようにします。
1 2 3 |
#include "Generated.xcconfig" #include "Pods/Target Support Files/Pods-Runner/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 の場合
1 2 3 |
flutter_with_cocoapods_test/ios/Runner/GeneratedPluginRegistrant.m:6:9: fatal error: 'firebase_analytics/FirebaseAnalyticsPlugin.h' file not found #import <firebase_analytics/FirebaseAnalyticsPlugin.h> |
cloud_firestore の場合
1 2 3 |
flutter_with_cocoapods_test/ios/Runner/GeneratedPluginRegistrant.m:6:9: fatal error: 'cloud_firestore/CloudFirestorePlugin.h' file not found #import <cloud_firestore/CloudFirestorePlugin.h> |
本来 CocoaPods で取得するはずだったライブラリがとれてないってことかと思います。
というわけで手順としては、
- 既に ios/Podfile が存在する場合は一旦別名のファイルにするなどして退避
- pubspec.yaml に firebase_analytics などの依存を追加
- flutter run を実行して Firebase関連のパッケージに Podfile を作成させる
- 作成された Podfile に使いたい pod の参照を追記
という感じで、Firebase と CocoaPods のライブラリの両方を使うことができるようになりました。
なお、こちらの手順の場合、Firebase のパッケージの方で xcconfig の設定もやってくれるので、xcconfig を自分で編集する必要もありません。
さいごに
あとで Firebase 追加しようと思ってアプリ作り始めたらえらいハマりました。
先に Firebase の設定しておけば良かったなという事案でした。
ちなみに Android の方はプロジェクト作成した段階で build.gradle ができてるのでそれに必要なライブラリを追加すれば良いだけで、とても簡単でした。
今回のセットアップを行っただけの状態ですが、GitHubにあげときました。
最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。
Follow @ryuta461
この記事をシェアする