3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

iOS強化月間 - iOSアプリ開発の知見を共有しよう -

【Swift】CocoaPodsからSwift Package Managerへの移行で困ったこと・気をつけること

Last updated at Posted at 2023-09-11

📦💨 CocoaPodsからSwift Package Managerに移行する

Swift Package ManagerはAppleが公式に提供しているライブラリ管理ツールです。
そのため、CocoaPodsやCarthageと比較してApple純正という点で長期的な保守性が高く今後のスタンダードになるではないかと考えられます。
今回は2019年に個人で制作したアプリでCocoaPodsを使っているために発生したビルドエラーに悩まされたことがSPMに移行するきっかけになりました。その上で、使用ライブラリが全てSPMに対応しておりどうしてもCocoaPodsを使わなければいけない理由が無かったため移行するに至りました。
移行したライブラリはFirebaseとFirebaseUIで、Xcode上のGUIからSPMを使用しました。

移行前に気をつけること

  • Podfileを消す前に何のライブラリを使っていたのかメモしておきます。
  • CocoaPodsを使っているままのファイルも残しておくと、後から元々使っていたライブラリのバージョンを確認するのに役立ちました。

移行時に困ったこと

1. FirebaseUI-iOS導入時にUp to Next Major Versionのバージョン上限が1.0.0から変わらない

Dependency RuleではVersion Branch Commitのいずれかを選択し、ライブラリのバージョンを設定します。ここでは指定したメジャーバージョン未満で最も新しいバージョンに更新することができ、デフォルトでも選択されているVersionUp to Next Major Versionが適切です。メジャーバージョンの更新では更新時にコード変更が発生することがあるため、メジャーバージョン未満で設定することが安全なようです。
しかし、Up to Next Major Versionを選択した状態で最小バージョンを変更しても本来変更されるはずの最大バージョンの値が変わらないという問題が起きました。
スクリーンショット 2023-09-11 14.50.46.png
解決した方法

  1. Dependency RuleをVersionRange of VersionsもしくはExact Versionにし、最新バージョンの13.0.0(2023年9月現在)に値を変更してAdd Packageします。
    ※CocoaPodsを使っているファイルのディレクトリでターミナルからpod outdatedを実行することでライブラリのバージョンと最新バージョンを確認することができます。
  2. PROJECT -> PackageDependenciesよりSPMから導入したライブラリを確認し、ダブルクリックして表示される設定から、Up to Next Major Versionに変更します。この時、すでに導入されたライブラリのバージョンが13.0.0であることから上限も13.0.0になった状態に変化していることが分かります。下限を12.0.0に設定しました。
    スクリーンショット 2023-09-11 15.38.58.png
    🎉解決🎉
    背景に、先に導入したFirebaseのバージョンに対してFirebaseUIのバージョンが低すぎるためにconflictが起きAdd Packageに失敗するということがありました。
    特に問題なければ最新バージョンを利用するのが適切かと思います。

2.ビルドするとModule 'FirebaseStorage' not foundエラーが発生する

No such Module~~のエラーの類だと思い

  • Clean Build Holder
  • DerivedDataの削除
  • シュミレータに既に入っているアプリの削除
  • Xcodeの再起動
  • FirebaseとFirebaseUIが互いに対応しているバージョンの確認
  • Swift Package Managerのキャッシュ削除

などのあらゆる方法を試しましたが治りませんでした。
調べてみると、こちらのissueで解決方法が提示されておりました。

解決した方法
TARGETS -> Build Settings -> Swift Compiler - Custom Flags -> Other Swift Flagsに-Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/FirebaseStorage.modulemapを追加します。
スクリーンショット 2023-09-11 16.12.08.png
DebugとReleaseどちらにも記述したところ解決しました。

🎉解決🎉

移行後に気をつけること

  • Crashlyticsを使用する場合、設定するRun ScriptがCocoaPodsとは異なるため変更する必要があります。Firebaseドキュメント - Firebase Crashlytics を使ってみるのステップ2に記載されている手順に従って変更します。
  • GitHubを使っている場合、.gitignoreのCocoaPodsに関する記述をSwift Package Managerに置き換えます。.gitignoreファイルの中身は、gitignore.ioから簡単に生成することができます。

おわりに

CocoaPodsからSPMに移行したことで、ビルド時間が短縮された気がします。よかったです。
お読みいただき、ありがとうございました。
お役に立てましたら幸いです。

参考

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?