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

DMMオンラインサロンアプリのSwift化

hayatan
January 17, 2025

 DMMオンラインサロンアプリのSwift化

2025/01/17 Sansan x DMM.swift

オンラインサロンメンバーの関連する発表

ReactNative のアプリを Swift に置き換えてます
https://speakerdeck.com/hayatan/reactnative-falseahuriwo-swift-nizhi-kihuan-etemasu

DMMオンラインサロンアプリのReactNative→Swift化への道のり
https://speakerdeck.com/roana0229/dmmonrainsaronapurifalsereactnative-nil-swifthua-hefalsedao-falseri

アプリ内課金 リジェクトとAppleとのやり取りのお話
https://speakerdeck.com/hayatan/apurinei-ke-jin-riziekutotoappletofalseyariqu-rifalseohua

サロンアプリの技術的負債解消への取り組み
https://speakerdeck.com/k_torishima/saronapurinoji-shu-de-fu-zhai-jie-xiao-henoqu-rizu-mi

hayatan

January 17, 2025
Tweet

More Decks by hayatan

Other Decks in Programming

Transcript

  1. © DMM.com オンラインサロンアプリとは? 9 オンラインサロンはクローズドな会員制コミュニティサービス タイムライン 投稿・コメント・返信など コミュニティの柱となる機能群 ライブ配信視聴 サロンオーナー(主宰者)が

    行っているライブ配信の視聴 Push通知 コミュニティの動向を リアルタイムで受け取る サロン会員専用のiOSアプリ 主な機能はSNSに似ておりそこそこの規模のアプリ(45画面以上)
  2. © DMM.com Swift移行前のアプリ 11 フロントエンドエンジニア主流でスピード開発を行った経緯がある アップデート Xcode / ReactNative /

    npm 等 影響範囲が複雑すぎて 手に負えない 採用 ReactNativeに精通した iOSエンジニア採用の難しさ メリットの薄さ iOSのみ提供しており ReactNativeの メリットが薄かった WebはReact, iOSはReactNativeを採用 ReactNativeのメリットよりも課題が大きくなってしまっていた
  3. © DMM.com 現状のサービスを保守運用しながら少人数での開発 15 私(リード) + ミドル1名 + ジュニア1名 Swift化以外にもタスクがある

    • サロンオーナー向けライブ配信アプリの保守 • VIPER+ReactNativeで一部Swift化していたアプリの保守 旧アプリとほぼ同じUI/機能を再開発
  4. © DMM.com スケジュール感 16 2021 2022 2023 2024 2025 アプリ内課金

    Swift化(VIPER / ReactNative共存) Swift化(Redux) 新機能実装 リファレンスアプ リ作成 機能移植 このあたりでVIPERに 限界を感じ始める 2024年11月 リリース ・クラッシュ ・デグレ ・スピード感
  5. © DMM.com Reduxとは何か 19 Action / Store / State /

    Reducer で構成される アプリケーションの状態管理を一元化し予測可能な動作を保証する Actionが発火 → 一元化された状態(State)を Reducerで更新する UIはStateを常に反映する
  6. © DMM.com オンラインサロンアプリのReduxの構成要素 20 Store, Dispatch Action Reducer Saga (Middleware)

    → Actionに応じた非同期処理を実現するために、 Redux+Sagaのような仕組みを実装している SelectState と UseDispatch → SwiftUIにReduxのStateを反映させるためのオンラインサロンアプリの独 自の仕組み
  7. © DMM.com Store, Dispatch 21 アプリの根幹部分はこの40行弱のコード @Published public var state:

    StoreState で SwiftUIに伝達可能な状態を保持している。 アクションが発火すると dispatch(action: Action)が 呼び出され、Reducerを実行し、新しい状態に更新 する。
  8. © DMM.com Reducer 23 StateとActionを引数にとり、新しいStateを返す単純な typealias 機能ごとにReducerはいくつも存在しますが、 最終的に appReducer(_:, _:)

    という関数に集約され るようになっています。 複数のReducerを一つのReducerにまとめる処理もある
  9. © DMM.com Saga (Middleware) 25 Actionが発火したときに非同期で処理を呼び出す仕組み APIの呼び出しや、データの更新などはこれを経由して 実行されます。 例えば、 FetchPosts

    というアクションが発火したときには APIから投稿のデータを取得し、取得できたことを示す FetchPostsSuccess というアクションを発火するとい う処理が実装されています。
  10. © DMM.com UseDispatch 28 SwiftUIからアクションを発火させるPropertyWrapper @UseDispatch(AppState.self, TimelineActions.self) private var useTimeline

    のように宣言すると、 SwiftUIの task() や ボタンのアクションで次のようにアクションを発 火させることができます。 useTimeline.dispatch(.fetchPosts)
  11. © DMM.com 現行の実装とメリット 29 状態の更新がViewに即座に反映される → WebSocketでリアルタイムに状態が更新されるが、 UI側の実装ではそれを意識する必要は無い 共通処理の一元化 →

    同じ情報(いいねなど)を画面毎に取得・更新する必要は無い 処理順序が概ね旧アプリと同じ → 移行時のロジック考慮漏れなどを減らす