タクシーアプリ「GO」の iOS アプリを開発をしている古屋です。
この記事ではiOS 13のサポートを切るにあたって対応した内容を紹介したいと思います。
みなさんの開発されているアプリはiOS 13のサポートはもう切りましたか?
「GO」は現在サポートバージョンがiOS 13.3ですが、近々iOS 14.0にする予定です。
WWDCを見た後はワクワクしながらiOS XX切ったらこれ使えるねとか話してたけど、いざ2,3年経って実際に切る時になると何できるんだっけ?ということもあるのではないでしょうか。
私もまさにそうですが、参考までにiOS 13を切った時の対応(予定も含む)を紹介します。
Deprecatedになって警告が出るものに関しては一部省略しています。
「GO」ではiOS 13系をサポートしつつ一部画面にSwiftUIを導入しています。
導入については RIBs アーキテクチャを採用している既存のアプリに SwiftUI を導入 をご覧ください。
Separatorなしの一覧画面を実装するのにListを使っていましたが、標準ではできないので UITableView.appearance() をいじることで実装していました。
これをLazyVStackにすることで実装がシンプルになりました。
before
List {
ForEach(items, id: \.self) { item in
// 省略
}
}
.listSeparatorStyleNone()
struct ListSeparatorStyleNoneModifier: ViewModifier {
public func body(content: Content) -> some View {
content
.onAppear {
UITableView.appearance().separatorColor = .clear
UITableView.appearance().separatorStyle = .none
}
.onDisappear {
UITableView.appearance().separatorColor = .separator
UITableView.appearance().separatorStyle = .singleLine
}
}
}
public extension View {
func listSeparatorStyleNone() -> some View {
modifier(ListSeparatorStyleNoneModifier())
}
}
after
ScrollView {
LazyVStack(spacing: 12) {
// 省略
}
}
iOS 15からは listRowSeparator(.hidden) が使えるようになるのでそちらにしても良さそうです。
「GO」ではViewControllerごとにUIHostingControllerを使いSwiftUIのViewを表示しています。
フェッチ中などローディングの表示をしたい時は、ViewController側にUIActivityIndicatorViewを持たせ表示していましたが、iOS 14からはProgressViewが使えるようになるのでSwiftUI側にその処理を移しました。
iOS 13をケアするために作ったViewModifierをまるっと消しました。
struct IgnoreKeyboardAvoidance: ViewModifier {
public func body(content: Content) -> some View {
if #available(iOS 14.0, *) {
content
.ignoresSafeArea(.keyboard, edges: .bottom)
} else {
content
}
}
}
struct ListBackgroundClearColor: ViewModifier {
public func body(content: Content) -> some View {
content
.onAppear {
UITableView.appearance().backgroundColor = .clear
}
.onDisappear {
UITableView.appearance().backgroundColor = .systemBackground
}
}
}
「GO」では使っていませんが、iOS 14からOpenURLAction/ScrollViewReader/ScrollViewProxy/LazyHStack/LazyVGrid/LazyHGridなども使えるようになりましたね。
UIStackViewに背景色をつけられるようになったので、背景色をつけるためにだけUIStackViewの親を同じサイズのUIViewにしていたところは順次消しています。
開発用のコードにしか使ってないので今回は対応してないですが、UITableViewCellの imageView/textLabel/detailTextLabel は将来的にdeprecatedになるので、順次 UIListContentConfiguration を使っていこうと思います。
新しい言語機能がでてから実際に使えるようになるのは年単位のラグがあるのでどうしても忘れがちになってしまいますが、数年後を見据えてしっかりタスク化していこうと思います。
WWDC 2022が6月にあるのでまずはそこからですね。
興味のある方は 採用ページ も見ていただけると嬉しいです。
Twitter @mot_techtalk のフォローもよろしくお願いします!