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

レガシーなiOSアプリのSwift化 〜5年分の成功と失敗事例〜

tinpay
January 09, 2024

レガシーなiOSアプリのSwift化 〜5年分の成功と失敗事例〜

tinpay

January 09, 2024
Tweet

More Decks by tinpay

Other Decks in Programming

Transcript

  1. 自己紹介 2 • 名前:福井 章平 (@tinpay) ◦ 2014年 入社 (iOSアプリエンジニア)

    • 役職:プロダクト本部    モバイルアプリケーション開発部    マネージャー • 趣味 ◦ 大阪のスパイスカレー屋さん巡り ◦ ビール
  2. 「Chatwork」モバイル版アプリの歴史 6 2011 2013 2011-9-29 iOS v1.0 リリース (Titanium) 2015

    2013-9-9 iOS v2.5 Robson リリース (Titanium) 2013-2-5 iOS v2.0 Fujiyama リリース (Titanium) 2014-1-27 iOS v3.0 Rocky リリース (Titanium) 2017 2019 2016-6-7 iOS v4.0 Eiger リリース (Objective-C) 2021 2022-5-12 iOS v6.0 リリース (Objective-C, Swift) 2018-5-21 iOS v4.30 MaunaLoa リリース (Objective-C, Swift) 2023 2023-8 フルSwift化 完了 2020-3-2 iOS v5.0 リリース (Objective-C, Swift) ファーストリリースから約12年!
  3. 「Chatwork」モバイル版アプリの歴史(前半) 7 2011 2013 2011-9-29 iOS v1.0 リリース (Titanium) 2015

    2013-9-9 iOS v2.5 Robson リリース (Titanium) 2013-2-5 iOS v2.0 Fujiyama リリース (Titanium) 2014-1-27 iOS v3.0 Rocky リリース (Titanium)
  4. 「Chatwork」モバイル版アプリの歴史(後半) 8 2017 2019 2016-6-7 iOS v4.0 Eiger リリース (Objective-C)

    2021 2022-5-12 iOS v6.0 リリース (Objective-C, Swift) 2018-5-21 iOS v4.30 MaunaLoa リリース (Objective-C, Swift) 2023 2023-8 フルSwift化 完了 2020-3-2 iOS v5.0 リリース (Objective-C, Swift)
  5. 「Chatwork」モバイル版アプリとiPhoneの歩み 12 2011 2013 2011-9-29 iOS v1.0 リリース (Titanium) 2015

    2013-9-9 iOS v2.5 Robson リリース (Titanium) 2013-2-5 iOS v2.0 Fujiyama リリース (Titanium) 2014-1-27 iOS v3.0 Rocky リリース (Titanium) 2017 2019 2016-6-7 iOS v4.0 Eiger リリース (Objective-C) 2021 2022-5-12 iOS v6.0 リリース (Objective-C, Swift) 2018-5-21 iOS v4.30 MaunaLoa リリース (Objective-C, Swift) 2023 2023-8 フルSwift化 完了 2020-3-2 iOS v5.0 リリース (Objective-C, Swift) iOS5 iOS6 iOS4 iOS7 iOS8 iOS9 iOS10 iOS11 iOS12 iOS13 iOS14 iOS15 iOS16 iOS17 最新OS Retina App Folders Notification Center iMessage Apple Maps Siri Passbook Panorama Photo Flat Design Control Center AirDrop Handoff Interactive Notifications Third Party Keyboard iCloud Drive 低電力 モード Night Shift iMessager Sticker 3D Touch Home App ファイル QRコード スキャン 片手 キーボード Live Photos スクリーン タイム Siri Shortcuts Apple TV App Dark Mode Shortcut App Widget App ライブラリ P in P 集中モード アプリ間 D & D アプリごと テキストサイズ iPhoneを Webカメラ ロック画面 Widget スタンバイ PDF 書き込み Swift4 Swift5 Swift4.1 Swift4.2 Swift5.1 Swift5.2 Swift5.3 Touch ID ARC AutoLayout Storyboard Swift1 Swift2 Swift3 SwiftUI Combine Swift5.4 Swift5.5 Swift Concurrency Xcode Cloud マルチタスク FaceTime Swift5.6 Swift5.7 Swift5.8 Swift5.9 Swift Package iPhone 新機能 iOS 新技術 TestFlight
  6. 「Chatwork」モバイル版アプリと「Chatwork」新機能の歩み 13 2017 2019 2011-9-29 iOS v1.0 リリース (Titanium) 2011

    2013-9-9 iOS v2.5 Robson リリース (Titanium) 2013-2-5 iOS v2.0 Fujiyama リリース (Titanium) 2014-1-27 iOS v3.0 Rocky リリース (Titanium) 2013 2015 2016-6-7 iOS v4.0 Eiger リリース (Objective-C) 2021 2022-5-12 iOS v6.0 リリース (Objective-C, Swift) 2018-5-21 iOS v4.30 MaunaLoa リリース (Objective-C, Swift) 2023 2023-8 フルSwift化 完了 2020-3-2 iOS v5.0 リリース (Objective-C, Swift) Chatwork Live iPad対応 Chatwork Live (音声通話) タスク 〆切時間設定 リアクション マルチアカウント ブックマーク Apple/Google ログイン/登録 名刺読み取り機能 プッシュ通知 本文表示 Chatwork Live 画面共有 リンクプレビュー ダークモード ロゴリニューアル 通知しない 曜日・時間帯設定 ミュート機能 UI刷新 iOSネイティブアプリになっ てから8年の間に リリースした新機能 (一部抜粋) Share Extension
  7. 本格的にSwift化を始める前に大きな課題があった 15 2011 2013 2011-9-29 iOS v1.0 リリース (Titanium) 2015

    2013-9-9 iOS v2.5 Robson リリース (Titanium) 2013-2-5 iOS v2.0 Fujiyama リリース (Titanium) 2014-1-27 iOS v3.0 Rocky リリース (Titanium) 2017 2019 2016-6-7 iOS v4.0 Eiger リリース (Objective-C) 2021 2022-5-12 iOS v6.0 リリース (Objective-C, Swift) 2018-5-21 iOS v4.30 MaunaLoa リリース (Objective-C, Swift) 2023 2023-8 フルSwift化 完了 2020-3-2 iOS v5.0 リリース (Objective-C, Swift)
  8. 本格的にSwift化を始める前に大きな課題があった 16 2015 2014-1-27 iOS v3.0 Rocky リリース (Titanium) 2017

    2019 2016-6-7 iOS v4.0 Eiger リリース (Objective-C) 2021 2020-3-2 iOS v5.0 リリース (Objective-C, Swift) Rocky→Eiger 負債が発生 Eiger→MaunLoa 負債を解消 2018-5-21 iOS v4.30 MaunaLoa リリース (Objective-C, Swift)
  9. 本格的にSwift化を始める前に大きな課題があった 17 2015 2017 2019 2021 2020-3-2 iOS v5.0 リリース

    (Objective-C, Swift) Rocky→Eiger 負債が発生 Eiger→MaunLoa 負債を解消 2018-5-21 iOS v4.30 MaunaLoa リリース (Objective-C, Swift) 2014-1-27 iOS v3.0 Rocky リリース (Titanium) 2016-6-7 iOS v4.0 Eiger リリース (Objective-C)
  10. RockyからEigerへ 18 Eigerで実現したかったこと • iOSネイティブアプリ化 ◦ 0からObjective-Cでの実装(元はTitanium) • UI/UXの刷新 ◦

    iOS7で採用されたフラットデザインに合わせたUI/UX • 新APIへの移行 ◦ Scala化PJで作られる予定の新APIに置き換える ◦ モデルをドメインレベルで再定義し、各モデルを取得するシンプル なAPIを想定 • プッシュ通知の拡張 ◦ すべてのメッセージ投稿において通知可能にする • WYSIWYGエディタの提供 ◦ メッセージ入力欄でタグを表示しないようにする
  11. 既存APIから新APIのレスポンス形式へ変換 21 新API 新API Client App 既存API 新API Client App

    Conversion 仮想 新API 修正前 修正後 サーバー クライアント
  12. リリーススピードを優先して出てきた問題 22 新APIと既存APIとでは設計思想が異なっており、新APIを使 う箇所で歪が生じた Conversion層だけで設計思想の差異を吸収することが困難 • クラッシュ数増加 • パフォーマンス低下 Mantle(JSON-ObjectのMapper)を廃止したり、クラッシュ数

    の多かったタイムラインでの非同期処理の見直し、CoreData からRealmへの変更など局所的な対応を行ったが、問題の発生 数はまだまだ多く、根本解決には至らなかった。 改善を試みたが...
  13. Eigerリリース時の負債解消を進めた 23 2015 2017 2019 2021 2020-3-2 iOS v5.0 リリース

    (Objective-C, Swift) Rocky→Eiger 負債が発生 2018-5-21 iOS v4.30 MaunaLoa リリース (Objective-C, Swift) 2014-1-27 iOS v3.0 Rocky リリース (Titanium) 2016-6-7 iOS v4.0 Eiger リリース (Objective-C) Eiger→MaunLoa 負債を解消
  14. 参考) MaunaLoa開発プロジェクト合宿 26 合宿でやること • ViewとModelまわりをどのように つなぎこむか検討する • APIの連携をどのように行うか検討 する

    • Realmのスレッド管理方法について 検討する • エラーハンドリングの検討する • コーディングの指針の整理する などなど 合宿でやらないこと • モデルの再設計 • 別のアーキテクチャーの選定/調査 • UI /UXについての考察 • Swift置き換えなどの単純作業 / 黙々とコーディング
  15. MaunaLoa Phase1で行ったこと 28 • Conversion層の撤廃 ◦ 既存APIのレスポンスから直接Modelに返還すること で、新APIレスポンスへの返還処理を撤廃した(後述) • Modelの再設計

    ◦ 既存APIに合わせたModel設計にした • Swift化 ◦ 静的型付け、オプショナル型を採用することで安定性 を向上させる ◦ ここからSwift化が始まる
  16. MaunaLoa Phase1 の具体的な作業内容 30 • 既存API Client作成 • ドメインモデル再設計 •

    Realmクライアント / メモリキャッシュ見直し • Application Service作成 • エラーハンドリング再設計 2018年5月21日 MaunaLoa Phase1 リリース
  17. MaunaLoa Phase2で行ったこと 32 • タイムラインの安定化 ◦ 不具合の根本解決を行った ▪ クラッシュ数の軽減 ▪

    オフセット位置がずれたり、キーボード周りの不 具合の解消 ▪ タイムラインの根本的な構成からの見直し • タイムラインのSwift化も行うことにした
  18. Eiger時代の負債解消(MaunaLoa)がきっかけでSwift化が始まった Swift化の目的 35 • 安定性の向上 ◦ Swiftは型安全言語であり、コンパイル時にエラー を検出できる ◦ オプショナル型

    • 可読性と保守性の向上 ◦ Swiftはシンタックスが簡潔で直感的である ◦ モダンな言語機能 • Appleの方向性に沿っている ◦ AppleがSwiftを推進している Swift化の目的
  19. MaunaLoa Phase1 リリース 39 ModelレイヤーのSwift化が完了 • API Client • ドメインモデル

    • アプリケーションサービス • エラーハンドリング 既存API 既存API Client Model View ViewModel Objective-C : 70.19%
  20. MaunaLoa Phase2 リリース 42 既存API 既存API Client Model Objective-C :

    45.7% View ViewModel タイムラインのSwift化が完了
  21. MaunaLoa Phase2リリースの4年後にSwift化が完了 45 2018-5-21 MaunaLoa Phase1 2023-8 フルSwift化 完了 2019-5-22

    MaunaLoa Phase2 全体的になだらかな傾斜 一気に進めることが出来なかった
  22. 難易度が高く工数がかかるプロジェクトと並行してSwift化を行った 49 2018-5-21 MaunaLoa Phase1 2023-8 フルSwift化 完了 2019-5-22 MaunaLoa

    Phase2 タスク 〆切時間設定 リアクション マルチアカウント ブックマーク Apple/Google ログイン/登録 プッシュ通知 本文表示 AST ダークモード iPad対応 通知しない 曜日・時間帯設定 フリープラン 仕様変更
  23. ASTプロジェクトとは? 52 抽象構文木(英: abstract syntax tree) 言語などの論理構造を表した木構造のデータのこと AST プロジェクトとは? AST

    「Chatwork」のメッセージ記法は、長年各クライアントで 独自の解釈がおこなわれており、タグによっては見た目が異 なるという問題が発生していた この問題を解消するためのプロジェクトで、メッセージ記法 解釈と描画の共通化を目指した
  24. Objective-CとSwiftが混在している 55 Objective-C内でもSwiftのコードを呼び出す可能 性があるため、Swiftらしい書き方ができない • NSObjectを継承する必要がある • enum: Intしか使えない ◦

    enum: String使えない • structが使えない ◦ すべてclassでかく必要がある • @objcを付ける必要がある 例えば... 技術的負債
  25. 現在のiOSアプリ 59 • 95%程度がUIKit ◦ 新画面ではSwiftUIを積極的に使っている • MVVMからSVVSというアーキテクチャへ移行中 ◦ SVVSはオリジナルのアーキテクチャ

    ◦ SwiftUI化も進めている ◦ 実装ガイドラインを策定し、ルールについての認 識をiOS開発チーム内で行っている • BitriseからXcode Cloudへの移行を進めている 技術観点
  26. 現在のiOS版アプリ開発のチーム体制 61 • この体制で開発を進めているが、まだまだ課題がある ◦ 両チームの責任範囲がきちんと分けられておらず、ボールが チーム間に落ちることがある ▪ 運用保守 ▪

    サポート対応 ◦ モジュール単位で機能チームが分割されておらず、自己管理さ れたチームづくりが難しい ▪ チーム間で密なコラボレーションが必要になり、認知負荷が 向上する