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
Kyash TechTalk #3 Mobileチーム - KMM化、宣言的UI、Widget対応 2022/04/21 SwiftUI/Jetpack Composeを採用して よかったこと悪かったこと
Slide 2
Slide 2 text
2 2 iOS
Slide 3
Slide 3 text
自己紹介 ● Ryoya Kobitsu (@nekowen) ● iOS Engineer / Kyash Inc. ● Twitter: @n3k0w3n Kyash: @nekowen
Slide 4
Slide 4 text
4 4 01. SwiftUI導入までの経緯
Slide 5
Slide 5 text
5 ● Kyashには20種類以上の履歴画面が存在していた ○ Visa決済、QUIC Pay決済、Payeasy、クレジットカード 入金 etc… ● 技術的負債となっていたのでリファクタリングを実施 ● 以下の理由でSwiftUIを採用 ○ レイアウト要素が単純で作り直しが容易 ○ 要素の出し分けが多いためif文でレイアウトできた方が 好都合 ● 以降、新規画面は原則、既存画面は順次SwiftUIへ きっかけは履歴画面のリファクタリング
Slide 6
Slide 6 text
6 Kyash iOS アプリの履歴画面を SwiftUI でリファクタリングした話 https://blog.kyash.co/entry/2021/07/21/100307
Slide 7
Slide 7 text
7 7 02. よかったこと
Slide 8
Slide 8 text
8 SwiftUI UIKit
Slide 9
Slide 9 text
9 ● Storyboardを含むレビューはコストが高かった ○ diffが大量に発生する ○ コンフリクトが発生する頻度もそこそこあった ○ レビュワーがローカルでチェックアウトして確認 ■ スクリーンショットが貼ってあればスキップすることも ● SwiftUIを採用して上記の課題を軽減 ○ 変更箇所が明確なためレビューしやすい ○ コンフリクトの発生頻度も減少 コードレビューの敷居が下がった
Slide 10
Slide 10 text
10 Kyashリワードの表示パターン 読み込み中 通信成功 通信失敗
Slide 11
Slide 11 text
11 ● 通信が走る画面は ほぼこの共通Viewが使われて いる ● 中ではDataSourceのstateを みて出し分けているためとて もシンプル Viewの切り替え処理が簡単
Slide 12
Slide 12 text
12 ● cornerRadius, shadowといったModifierが用意されて いる ○ UIKitでは扱いづらかったViewカスタマイズがや りやすい ● アニメーション実装も簡単 ○ Shimmerのようなアニメーションも可能 ○ iOS14以降はmodifierが用意されている ■ .redacted(reason: .placeholder) Viewのカスタマイズも簡単
Slide 13
Slide 13 text
13 ● SwiftUIコードを変更するとサイドのプレ ビュー画面にリアルタイムで反映 ● Preview部分はSwiftでかけるので、画面 にサンプルデータを渡してプレビューす ることも可能 ○ 長い文字列を渡してレイアウトが崩 れないか簡易的に確認することもで きる 強力なXcode Previews
Slide 14
Slide 14 text
14 ● previewDeviceとpreviewDisplayNameを 活用すると、複数のデバイスでまとめて プレビューが可能 ○ 開発中にレイアウト崩れがないか サッと確認できる ○ 最小サイズであるiPhone SE第一世 代と最大サイズであるiPhone 12 Pro Max両方同時にみれるので効率 が良い ● previewDisplayNameはプレビュー端末の 上にタイトルとして表示される 強力なXcode Previews
Slide 15
Slide 15 text
15 15 03. 辛かったこと
Slide 16
Slide 16 text
16 ● UITableViewのrefreshControlに相当する機能がない ● iOS15からrefreshable(action:)が追加された ○ iOS13-14はどうする…? ● GeometryReaderとUIActivityIndicatorViewをラップしたView を組み合わせて実現 Pull to refreshが簡単にできない😭
Slide 17
Slide 17 text
17 ● iOS13ではUICollectionViewに代わるコンポー ネントがない ● iOS14以降ではLazyVGrid/LazyHGridが用意 された ● iOS13のサポートを切るまではVStackと HStackで表現することに Gridの実装が手間😭
Slide 18
Slide 18 text
18 ● iOS13と14でコンポーネントにキーボードが被ったときの挙動が異なる ○ iOS13だとそのまま ○ iOS14だと自動的に位置を調整してくれる ● iOS13はNotificationCenterを使うように分岐している キーボードの挙動が変わる😭
Slide 19
Slide 19 text
19 19 03. まとめ
Slide 20
Slide 20 text
20 まとめ ● SwiftUI導入によって、チーム全体の生産性が向上した ● OSバージョンごとにAPIの対応未対応の差が激しい ○ これから導入する場合は、iOS14以降から利用することをオススメします。
Slide 21
Slide 21 text
21 21 Android
Slide 22
Slide 22 text
22 22 01. Jetpack Compose 導入までの経緯
Slide 23
Slide 23 text
23 ● 決済や入出金を行うと履歴データが作られる。 ○ 履歴の種類は20種類以上... ● Fragmentとxmlがそれぞれ用意されていた ○ 履歴を追加/改修するのが大変! ○ QAコストも爆上がり ● リファクタリングと同時にJetpack Composeに置き換える作戦に。 きっかけは履歴画面のリファクタリング
Slide 24
Slide 24 text
24 24 01. よかったこと
Slide 25
Slide 25 text
25 ● 普段書いてるKotlinで書けるのでxml脳に切り替えなくて良い ● 簡単に意味のあるグループに分割して、かつ名前が付けられる (xmlだとファイル分けて includeするしかなかった) ○ レビューがしやすくなった Kotlinで書ける
Slide 26
Slide 26 text
26 xml Jetpack Compose
Slide 27
Slide 27 text
27 ● リストの実装が非常に楽になった ○ KyashはGroupieを使っていたが、セルの種類だけBindableItemを 継承したクラスを作る必要があった ● themeのカスタマイズが定義に飛ぶだけで一覧を見れるので扱いやすい ● すぐ調べられるようになった ○ 以前はandroid codesearchとか使っていた ● Webでも同じコードでUIが作れる ○ Webで試したら普通に使えそうだった 扱いやすい
Slide 28
Slide 28 text
28 ● View内に状態をもたないため自分でstateを管理する必要はあるが、想 定外なバグなどは出ない分安心できる ● 冪等性最高 ○ 副作用が分かれているので状態を意識しなくていい UIとロジックを分けられる
Slide 29
Slide 29 text
29 ● めっちゃ生産性向上した ● 新しくComposable作る際にある程度コストはかかるが、体感40%くら いは生産性向上してる ● Compose最高! 結果
Slide 30
Slide 30 text
30 30 02. 辛かったこと
Slide 31
Slide 31 text
31 ● Pager ○ animateToScrollPageで最後のページから最初のペー ジに飛ぶ時にアニメーションしてくれない ○ https://issuetracker.google.com/issues/198753 885 ● Placeholder ○ 複数のplaceholderのImagePainter#Stateを監視す るとクラッシュする(Android6だけ) accompanist
Slide 32
Slide 32 text
32 MotionLayout
Slide 33
Slide 33 text
33 ● 現状MotionSceneがjsonでしか書けない ● そのうちKotlinで書けるらしい ○ https://github.com/androidx/constraintlay out/wiki/Compose-MotionLayout-JSON-S yntax MotionLayout
Slide 34
Slide 34 text
34
Slide 35
Slide 35 text
35 ● かなり生産性が上がるのでどんどん導入していきたい ● もちろんまだまだ足りない機能はたくさんある ● もっとComposeが便利になっていくのが楽しみ まとめ
Slide 36
Slide 36 text
Thank you 36