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
参考
見出し画像