記事


SwiftUI ライフサイクルへの移行


既存のコードベースを維持しながら、SwiftUI でシーンを基礎としたライフサイクルを使用します。



概観


あなたのアプリを SwiftUI ライフサイクルに移行することで、SwiftUI の宣言型構文と空間フレームワークとの互換性を活用できます。


SwiftUI ライフサイクルへの移行には、あなたのアプリのエントリポイントの変更、アプリの起動の構成、SwiftUI が提供するメソッドを使用したライフサイクルの変更の監視など、いくつかの手順が必要です。



あなたのアプリのエントリポイントを変更する


UIKit フレームワークは、@main 注釈を使用して AppDelegate ファイルをあなたのアプリのエントリポイントとして定義します。@main の詳細については、『Swift プログラミング言語』の Attributes (属性) セクションを参照してください。SwiftUI アプリのエントリを示すには、あなたのアプリの構造を定義する新しいファイルを作成する必要があります。


  1. Xcode であなたのプロジェクトを開きます。

  2. "File (ファイル)" > "New (新規)" > "File(ファイル)" > "Swift File" を選択します。

  3. ファイル名を <YourAppName>App.swift にします。

  4. ファイルの先頭に import SwiftUI を追加します。

  5. 以下のコードスニペットに示すように、アプリ構造に @main 属性を注釈して、SwiftUI アプリのエントリポイントを示します。

重要
あなたのアプリデリゲート内の @main または @UIApplicationMain 属性を削除して下さい。

以下のコードを使用して、SwiftUI アプリの構造を作成します。この構造の詳細については、SwiftUI アプリの構造を調べる (Exploring the structure of a SwiftUI app) のチュートリアルをご覧ください。


import SwiftUI

@main
struct MyExampleApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}


アプリのデリゲートメソッドをサポートする


あなたのアプリのデリゲートでメソッドを引き続き使用するには、UIApplicationDelegateAdaptor プロパティラッパーを使用します。UIApplicationDelegate プロトコルに準拠したデリゲートについて SwiftUI に通知するには、このプロパティラッパーを App 宣言内に配置します。


@main
struct MyExampleApp: App {
    @UIApplicationDelegateAdaptor private var appDelegate: MyAppDelegate
    var body: some Scene { ... }
}

この例では、MyAppDelegate というカスタムアプリデリゲートをデリゲートアダプターとしてマークしています。その型に必要なデリゲートメソッドを実装してください。


注意
AppKit のサポートには NSApplicationDelegateAdaptor を使用してください。WatchKit のサポートには WKApplicationDelegateAdaptor を使用してください。


あなたのアプリの起動を構成する


ストーリーボードを含むアプリを SwiftUI に移行する場合は、ストーリーボードが不要になったら必ず削除してください。


  1. Xcode であなたのプロジェクトを開きます。

  2. プロジェクトナビゲータから Main.storyboard を削除します。

  3. あなたのアプリのターゲットを選択します。

  4. Info.plist ファイルを開きます。

  5. Main storyboard file base name (UIMainStoryboardFile) キーを削除します。

  6. アプリケーションシーンマニフェスト (UIApplicationSceneManifest) > シーン構成 (UISceneConfigurations) > WindowApplicationSessionRole (UIWindowSceneSessionRoleApplication) > アイテム 0 (既定の構成) 辞書内の Storyboard Name (UISceneStoryboardFile) キーを削除します。

この図は、これらのキーを削除する前の Info.plist ファイルの構造を示しています。



Info.plist ファイルからキーを削除した後もシーンデリゲートは引き続き呼び出されるため、このファイルで他のシーンベースのライフサイクル変更を引き続き処理できます。以前にシーンデリゲート内であなたのアプリを起動していた場合は、あなたのシーンデリゲートから scene(_:willConnectTo:options:) メソッドを削除してください。


以前にあなたのアプリでシーンをサポートしておらず、アプリの起動の対応にアプリデリゲートを使用していた場合は、application(_:didFinishLaunchingWithOptions:) でルートのビューコントローラをもはや設定していないことを確認してください。代わりに、true を返すようにしてください。



ライフサイクルの変化を監視する


SwiftUI はシーンベースであるため(Scene を参照)、あなたのアプリのデリゲートでライフサイクルの変更を監視できなくなります。これらの変更は、SwiftUI が提供するシーンのフェーズを監視するためのライフサイクル列挙型である ScenePhase で処理することをお勧めします。フェーズの変更時にアクションを開始するには、Environment の値を監視してください。


値の解釈は、読み取り元によって異なります。View インスタンス内からフェーズを読み取った場合、値はそのビューを含むシーンのフェーズを反映します。App インスタンス内からフェーズを読み取った場合、値はあなたのアプリ内のすべてのシーンのフェーズの集約を反映します。


シーンデリゲートを使用してシーンベースのイベントを処理するには、あなたのアプリデリゲート内で SwiftUI アプリにシーンデリゲートを提供します。詳細については、UIApplicationDelegateAdaptor の "シーンデリゲート" セクションを参照してください。


シーンベースのライフサイクルイベントの処理の詳細については、あなたのアプリのライフサイクルの管理 (Managing your app’s life cycle.) をご覧ください。





以下も見よ


アプリの作成


{} 目的のビデオ (Destination Video)

SwiftUI を活用して、マルチプラットフォームアプリで没入型のメディア経験を構築します。


{} Hello World (Hello World)

ウインドウ、ボリューム、没入型空間を活用して、人々に地球について教えます。


{} Backyard Birds: SwiftData とウィジェットを使ったアプリの構築 (Backyard Birds: Building an app with SwiftData and widgets)

永続的なデータ、インタラクティブなウィジェット、まったく新しいアプリ内購入経験を備えたアプリを作成します。


{} Food Truck: SwiftUI マルチプラットフォームアプリの構築 (Food Truck: Building a SwiftUI multiplatform app)

Mac、iPad、iPhone 用の単一のコードベースとアプリターゲットを作成します。


{} Fruta: SwiftUI で機能豊富なアプリを構築する (Fruta: Building a feature-rich app with SwiftUI)

共有コードベースを作成して、ウィジェットと App Clip を提供するマルチプラットフォームアプリを構築します。


protocol App

アプリの構造と動作を表す型。














トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ