能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

SwiftUI App Lifecycle をプラットフォーム毎にカスタマイズする

SwiftUI のApp/Sceneのカスタマイズが必要となる機能一覧とサンプルコード。

1) 概要

WWDC2020で喧伝されたSwiftUI App/Scene Multiplatformに対応したアプリライフサイクルコードを簡潔にに記述できるという触れ込みであったが、実際はPlatformごとのデフォルトライフサイクル機能に変換されるだけであり、カスタマイズが必要な場合はPlatformごとにライフサイクル機能を記述する必要がある。

iOSプロジェクトのサンプルとして、UIKit App DelegateとSwift UI Appのそれぞれのプロジェクトを合体させたサンプルコードをGitHub に公開している。

notoroid/SwiftUILifeCycleOverride: SwiftUI App Life Cycle Override by UIKit App

2) カスタマイズが必要となる機能一覧

SwiftUI で機能を提供できているものは除く(SceneのActive/Deactive、ColorSchemeの更新など) 判明したものがあれば随時追加予定。

2-1) iOS/iPadOS

カスタマイズ種類 機能 機能詳細
AppDelegateのカスタマイズが必要 プッシュ通知関係 プッシュ通知トークン取得
プッシュ通知の登録成否
バックグラウンド通知受け取り
SceneDelegateのカスタマイズが必要 ショートカットイベントの取得
- HostingControllerの生成
HostingControllerのカスタマイズが必要 StatusBar Styleの変更

2-2) macOS

カスタマイズ種類 機能 機能詳細
ApplicationDelegateのカスタマイズが必要 プッシュ通知関係 プッシュ通知トークン取得
プッシュ通知の登録成否
バックグラウンド通知受け取り
- DocMenuの登録

macOSのNSApplicationDelegate はUIKitのUIAppDelegateに相当するprotocolでDocMenuの登録とプッシュ通知のイベントが実装されている。

public protocol NSApplicationDelegate : NSObjectProtocol {
// macApp Doc menm の登録

    @available(macOS 10.13, *)
    optional func applicationDockMenu(_ sender: NSApplication) -> NSMenu?

// プッシュ通知の登録
    @available(macOS 10.7, *)
    optional func application(_ application: NSApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)

    @available(macOS 10.7, *)
    optional func application(_ application: NSApplication, didFailToRegisterForRemoteNotificationsWithError error: Error)

    @available(macOS 10.7, *)
    optional func application(_ application: NSApplication, didReceiveRemoteNotification userInfo: [String : Any])
}

3) まとめ

SwiftUI App/Sceneを使うとSwiftUI側でプラットフォームのデフォルト実装を提供してくれる。そこまで詳しくないプラットフォームでアプリを始める場合にSwiftUI App/Sceneを導入することは開発スピードを上げるために有用だが開発が進むとカスタマイズは必要になる。

必要なカスタマイズにも程度があってUIKitならクイックショートカットやStatusBarの色置き換えを諦めればSwiftUI App/Sceneの全てを置き換えるまでには至らないだろう。

SwiftUI App/Sceneとプラットフォーム毎のライフサイクルの関係について知りたい場合は以下のプレゼンテーション資料を確認して欲しい。

SwiftUI App/Scene - SwiftUI App/Scene の実際 - Speaker Deck

参考

AppKitにさようなら - pineapple blog

見出し画像