Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
© DMM.com DMM iOS meetup #2 (2021/12/15) DMMオンラインサロンアプリの ReactNative → Swift化への道のり 合同会社DMM.com 堤下薫
Slide 2
Slide 2 text
© DMM.com 堤下薫(つつみん) 合同会社DMM.com CTO室 iOS, ReactNative あたりを主に触っています。 最近触れていないAndroidも ガッツリ触る機会も作っていきたい。 自己紹介
Slide 3
Slide 3 text
© DMM.com 目次 ・ReactNative を採用した理由 🙆 ・なぜSwift移行する? 🤔 ・フルSwiftへの移行計画とアプリ設計 ✍ ・実際に移行を実行してみてどうか 💪
Slide 4
Slide 4 text
© DMM.com ReactNativeを採用した理由 1
Slide 5
Slide 5 text
© DMM.com ReactNativeを採用した理由 🙆 DMMオンラインサロンのコミュニティツールを作った当初は フロントエンドエンジニアが主軸に開発、Web,iOSで同じ技術を利用 2
Slide 6
Slide 6 text
© DMM.com なぜSwiftへ移行する? 3
Slide 7
Slide 7 text
© DMM.com 現在はiOSネイティブエンジニアが2人で開発を進めていて リッチなことを求めるほどフロント/ iOS 両方のスキルが必要 → 当初は良かったが現在では、デメリットの方が大きくなってきた → さらにReactNativeができる人の採用が難しい 😢 なぜSwift移行する? 🤔 4
Slide 8
Slide 8 text
© DMM.com なぜSwift移行する? 🤔 もし、ReactNativeで続けるとしても ReactNativeのアップデート + iOSネイティブ周りのアップデート(Xcode, Swift) + アップデートに追いつかないnpmライブラリの対応 が必要で、iOSエンジニアが本領発揮するのが難しい 😢 5
Slide 9
Slide 9 text
© DMM.com フルSwiftへの 移行計画とアプリ設計 6
Slide 10
Slide 10 text
© DMM.com 目的 ・ iOSエンジニアが本領発揮できる状態にする 💪 進め方 ・段階的にSwiftに移行する ・できるだけReactNativeの改修は少なくし、Swiftに置き換える フルSwiftへの移行計画とアプリ設計 ✍ 7
Slide 11
Slide 11 text
© DMM.com まずReactNativeをメインターゲットと別け 1つのモジュールとして動くようにする フルSwiftへの移行計画とアプリ設計 ✍ App (Main Target) ReactNativeFeature (Module) 8
Slide 12
Slide 12 text
© DMM.com ReactNativeFeatureから Swiftに機能毎に置き換えていく フルSwiftへの移行計画とアプリ設計 ✍ App (Main Target) ReactNativeFeature (Module) ReactNativeBridge (Module) AFeature (Module) BFeature (Module) ・ ・ ・ 9
Slide 13
Slide 13 text
© DMM.com ReactNativeFeatureで 持つ機能がどんどん小さくなり フルSwiftへの移行計画とアプリ設計 ✍ App (Main Target) ReactNativeFeature (Module) ReactNativeBridge (Module) AFeature (Module) BFeature (Module) ・ ・ ・ 10
Slide 14
Slide 14 text
© DMM.com ReactNativeFeatureが消え フルSwiftなアプリになる フルSwiftへの移行計画とアプリ設計 ✍ App (Main Target) AFeature (Module) BFeature (Module) ・ ・ ・ CFeature (Module) 11
Slide 15
Slide 15 text
© DMM.com フルSwiftへの移行計画とアプリ設計 ✍ 12
Slide 16
Slide 16 text
© DMM.com 実際に移行を 実行してみてどうか 13
Slide 17
Slide 17 text
© DMM.com ReactNativeのバージョンは0.62.3までアップデートすることで Xcode13.xでも動く状態になっている Xcodeのアップデートが行われると ReactNative + iOSネイティブな機能を持ったnpmライブラリ のアップデートが必要になることが多く、都度対応するしかない 🥺 ライブラリの改修は npm の patch-package を利用して解決 ReactNativeのバージョン 14
Slide 18
Slide 18 text
© DMM.com リファクタリングならリグレッションテストなどで担保できるが Swift移行はリアーキテクチャのようなもの ReactNativeで書いたテストをSwiftで動作させることはできない🤔 既存のReduxのStoreに流れてくるイベントなどの処理を追い 処理全体を一度シーケンス図に起こす + 主要な機能要件の洗い出し テストがない状態の移行について 15
Slide 19
Slide 19 text
© DMM.com アプリケーションのステート ReactNative (シングルステート):Swift (各画面でのステート) 画面毎の状態をテストしやすくなったのは良かった 😊 今まではアプリケーション内部で参照できていた値が、 APIを経由して再取得する必要が出てくる箇所があった 😇 変更の少ないと想定されるAPIはレスポンスを 期限付きでキャッシュすることで対応 🕐 16
Slide 20
Slide 20 text
© DMM.com ReactNativeとSwiftのやりとり この画面はReactNative ドロワーはSwift メニューをタップ RN to Swift トピックをタップ Swift to RN 17
Slide 21
Slide 21 text
© DMM.com ReactNativeとSwiftの連携 ReactNativeとSwiftの橋渡しはBridgeModuleが行う ReactNativeから自動的に init() が呼び出される 18
Slide 22
Slide 22 text
© DMM.com ReactNative → Swift ReactNativeからBridgeにイベントを送信 19
Slide 23
Slide 23 text
© DMM.com ReactNative → Swift ReactNativeからBridgeのイベント購読で受け取る 20
Slide 24
Slide 24 text
© DMM.com Swift → ReactNative SwiftからReactNativeへのイベント送信 21
Slide 25
Slide 25 text
© DMM.com Swift → ReactNative SwiftからBridgeのイベント購読で受け取る 22
Slide 26
Slide 26 text
© DMM.com ReactNative → Swiftの遷移 先程と同じようなイベントの流れで Swift移行されたFeatureのUIViewControllerをpresentで表示 ReactNativeとSwiftの画面遷移 23
Slide 27
Slide 27 text
© DMM.com ReactNativeとSwiftの画面遷移 Swift → ReactNativeの遷移 UIViewController.dismiss後にReactNative側でpush遷移するような見慣 れない画面遷移が起こってしまうため、アプリの末端機能から移行 また、1アプリの中でReactNativeを複数インスタンスを起動させると意図し ない動作を起こす可能性がある🙅 24
Slide 28
Slide 28 text
© DMM.com ReactNativeとSwiftの画面遷移 (再掲) 25
Slide 29
Slide 29 text
© DMM.com さいごに 26
Slide 30
Slide 30 text
© DMM.com さいごに Swiftへの移行はまだまだ途中! ReactNativeでうまく実現できなかったところを Swiftネイティブで使いやすく作れてる実感あり👏 (ユーザーからも良くなった声💬も届いてました) ReactNative自体は良いもの ⭕ チームメンバー構成によっては移行は1つの手段として良い選択肢 👌 27
Slide 31
Slide 31 text
© DMM.com Thank you for listening ! 😁