先週の自分専用Web記事保存アプリのサムネイル画像がへんだ!に書いたiOSアプリですが、FiresBaseライブラリーはCocoaPodsを使っていますが、FiresBaseライブラリーはSwift Package Managerにも対応しているので置き換えてみる事にしました。
Swift Package Managerとは
JavaScriptにはnpm、RubyにはGemなどの標準のパッケージ(ライブラリー)を管理システムがありますが、昔iOSにはパッケージを管理システムがありませんでした。😲
私がiOSの開発を始めたiPhoneOS3の頃には全くパッケージを管理システムは無くて、ライブラリーはソースコードまたはヘッダー(.h)とコンパイルされたライブラリー(.a)を手動でプロジェクトに追加して使っていました😅
しかし、2011年にCocoaPodsが登場しOSSのライブラリーがとても使いやすくなりました。その後CocoaPodsよりも高速にビルドできるCarthageなどのパッケージ管理システムも登場しました。
そして、Swift言語の進歩に合わせ、2017年にApple公式のSwift Package Managerがリリースされました。2017年時点ではXcodeに統合されていませんでしたが、2019年にリリースされたXcode 11.0で統合されApple公式のパッケージを管理システムとしての地位をたかめ、対応ライブラリーも増えてきています。
これらのパッケージを管理システムの歴史や仕組みについては 振り返りながら学ぶPackage Managerに詳しく書かれているので興味がある方は読んでみて下さい。
移行作業
まずはCocoaPodsを削除
ネット上の情報を参考に、
- CocoaPodsの
pod deintegrate
コマンドを実行 - .xcworkspace、Podfile、Podfile.lockファルを削除
ここで、XcodeのClean Build Folder、Buildを実行しエラーになることで、Firebaseが無くなった事を確認。
Swift Package Managerでライブラリーをインストール
手順はFirebaseの公式ページのSwift Package Manager で Firebase をインストールするに書かれています。
しかし!
Xcode で、[File] > [Swift Packages] > [Add Package Dependency]に移動して
と書かれていますが、Swift Packages
メニューがありません!! Xcodeのバージョンアップでメニューが変わったようです。正しくは
Xcode で、[File] > [Add Swift Package] に移動して
です。
さて、これで終わりかなと思いましたがBuildするとエラーになります!
なんとFirebaseライブラリ https://github.com/firebase/firebase-ios-sdk.git
にはGoogle認証用UIのFirebaseGoogleAuthUI等は含まれてないようです!?
いろいろ調べたところ、https://github.com/firebase/firebase-ios-sdk.git
はFirebaseAPIを使うためのライブラリーで、UIは別の https://github.com/firebase/FirebaseUI-iOS.git
にあるようです。
そこで、XcodeのAdd Swift Packageメニューを使いfirebase-ios-sdk.gitを追加しましたが、Conflictエラーになってしまいました。
FirebaseUI-iOS.gitはfirebase-ios-sdk.gitに依存していますが、そのバージョンは8.11.0で、最初に追加した最新バージョン8.12.1のfirebase-ios-sdk.gitとConflictしているようです。
そこで、いったん最新firebase-ios-sdk.gitは外し、FirebaseUI-iOS.gitを追加しなおし、Clean Build Folder、BuildするとFirebaseGoogleAuthUIのエラーは無くなりましたが、Firestore, Storageのところでエラーになります。
FirebaseUI-iOS.gitはfirebase-ios-sdk.gitに依存しているのでfirebase-ios-sdk.gitの実体は取り込まれているようですがコンパイル用の情報がないのかもしれないので、下の画像のように
FirebaseStorageUI, FirebaseFirestoreUIをリンクしたところ、コンパイルエラーは無くなり、アプリも動くようになりました。
すこし、モヤモヤしますが今回はこれで良い事にしました。😊