MoTLab -Mobility Technologies Engineering Blog-MoTLab -Mobility Technologies Engineering Blog-

iOS 13のサポートを切る時にやったこと

iOS
April 25, 2022

タクシーアプリ「GO」の iOS アプリを開発をしている古屋です。

この記事ではiOS 13のサポートを切るにあたって対応した内容を紹介したいと思います。


はじめに

みなさんの開発されているアプリはiOS 13のサポートはもう切りましたか?

「GO」は現在サポートバージョンがiOS 13.3ですが、近々iOS 14.0にする予定です。

WWDCを見た後はワクワクしながらiOS XX切ったらこれ使えるねとか話してたけど、いざ2,3年経って実際に切る時になると何できるんだっけ?ということもあるのではないでしょうか。

私もまさにそうですが、参考までにiOS 13を切った時の対応(予定も含む)を紹介します。

Deprecatedになって警告が出るものに関しては一部省略しています。

SwiftUI

「GO」ではiOS 13系をサポートしつつ一部画面にSwiftUIを導入しています。

導入については RIBs アーキテクチャを採用している既存のアプリに SwiftUI を導入 をご覧ください。

List→LazyVStackへの置き換え

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) が使えるようになるのでそちらにしても良さそうです。

UIActivityIndicatorView→ProgressViewへの置き換え

「GO」ではViewControllerごとにUIHostingControllerを使いSwiftUIのViewを表示しています。

フェッチ中などローディングの表示をしたい時は、ViewController側にUIActivityIndicatorViewを持たせ表示していましたが、iOS 14からはProgressViewが使えるようになるのでSwiftUI側にその処理を移しました。

不要なModifierの削除

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なども使えるようになりましたね。

UIKit

UIStackView.backgroundColorを使う

UIStackViewに背景色をつけられるようになったので、背景色をつけるためにだけUIStackViewの親を同じサイズのUIViewにしていたところは順次消しています。

UIListContentConfigurationを使う

開発用のコードにしか使ってないので今回は対応してないですが、UITableViewCellの imageView/textLabel/detailTextLabel は将来的にdeprecatedになるので、順次 UIListContentConfiguration を使っていこうと思います。

さいごに

新しい言語機能がでてから実際に使えるようになるのは年単位のラグがあるのでどうしても忘れがちになってしまいますが、数年後を見据えてしっかりタスク化していこうと思います。

WWDC 2022が6月にあるのでまずはそこからですね。


We're Hiring!

📢
Mobility Technologies ではともに働くエンジニアを募集しています。

興味のある方は 採用ページ も見ていただけると嬉しいです。

Twitter @mot_techtalk のフォローもよろしくお願いします!