Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GANMA!にSwift PMを 導入した話

GANMA!にSwift PMを 導入した話

iOS Snack bar #1 2022/05/13

893416610fb2934d0f49f28c896937ed?s=128

masayuki sano

May 19, 2022
Tweet

Other Decks in Programming

Transcript

  1. GANMA!にSwift PMを 導入した話 FLINTERS 佐野真之 iOS Snack bar #1 2022/5/13

  2. 自己紹介 FLINTERS / GANMA! iOSエンジニア 1600万ダウンロード突破! プレミアム会員(サブスク)、広告、GANMA!コイン、グッズ、書籍など

  3. アジェンダ • GANMA!へのSwift Package Managerの段階的導入 ◦ ライブラリ管理 ◦ Embedded Framework

    → Swift Package ◦ Viewなどの移行 • その後の効果
  4. Swift PM導入の背景 • xcodeprojファイルのコンフリクト • Embedded frameworkを気軽に作成しづらい • Swift PMでライブラリ管理

    • Embedded frameworkをSwift Packageへ • マルチモジュール化 SwiftPMに対応したライブラリも増えてきたこともあり段階的に導入していく 課題感
  5. Swift PM導入 app.xcworkspace/contents.xcworkspacedata Package.swift プロジェクトナビゲーター ワークスペースの編集、Package.swiftを追加 既存コードをAppに移動

  6. <1st step> Cocoa Pods x Swift PMへ SwiftPMに対応 → Swift

    PM バイナリ形式のxcframework → Swift PM それ以外の広告SDKなど → CocoaPods Carthage → 削除 モジュールへ依存追加 Package.resolved
  7. Swift PMと CocoaPodsでのコンフリクト Swift PMでFirebase、CocoaPodsでAdMobをインストールした場合 GoogleAppMeasurementがどちらからもインストールされてしまう Podfile MyAdMob.podspec.json コンフリクトする依存を削除

  8. Appでのライブラリ使用 App側でSwiftPMでインストールしたライブラリを使用したい場合は 必要なライブラリをModuleに含めてFrameworkをプロジェクトに依存を追加

  9. <2nd step> Embedded Frameworkの移行 まずはEmbedded frameworkをSwift Packageに移行 そのあと第3ステップでViewやPresentationも移行 App ∟View

    ∟ ViewModel, Presenter ∟ Resources Embedded framework ∟DataLayer ∟ ModelLayer ∟ DomainLayer ∟ ApplicationLayer 以前のGANMA!のプロジェクト構成
  10. Module、Frameworkの作成 Sources以下のディレクトリを .targetでModuleとして作成 .libraryで複数ModuleからFrameworkを作成 xcodeprojのようにコンフリクトしない!

  11. Appへの取り込み FrameworkをAppのプロジェクトに追加していけばOK あとはモジュール単位でimport していくだけ App/File.swift imoprt ModelLayer ModelLayer.Model() ModelLayer =

    Framework ModelLayer = Module
  12. <3rd step> マルチモジュール化 xib, storyboardを使用する場合 App ∟View ∟ ViewModel, Presenter

    ∟ Resources 表示確認をしながら少しずつViewLayerに分離中 ViewのSwift Packageへの移動 コードからxibを使用する場合 Appに残っているコードをSwift Packageに移し モジュールを作成しやすいようにしていく
  13. Assetモジュール作成 Appの画像や色のアセットを ViewLayerでも使用したい SwiftGenの自動生成コードを Assetモジュールとして分離 SwiftGenでの自動生成コード

  14. @_exported import @_exported importにより同一モジュールでのimport Assetsを 書かなくても使用可能 @_exported import Assets //

    import Assets がいらない File1.swit File2.swit Module A import ModuleA // Assets使用可能 File1.swit Module B
  15. 導入の効果 • マルチモジュール化しやすくなった。ミニアプリつくりやすい • アプリサイズが減った ◦ 23.5MB -> 20.6MB •

    ライブラリバージョン変わってもコマンド叩かなくていい • ビルド時間短縮
  16. まとめ Swift Package Managerでライブラリ管理、モジュール分割を段階的に行った。 今後はさらにマルチモジュール化を進めていく予定。