【SwiftUI】Life Cycle SwiftUI App 뭐야 이거,,

아무래도, 안녕하세요.
아리키나, 사토입니다.
그래, 나야.

Xcode12부터, Life Cycle: SwiftUI App이 증가하고 있었다.



최근 Xcode를 12.1로 업데이트했습니다.
최근 SwiftUI를 만지지 마라. 뭔가 만들어 보자.
앱을 만들려고 했습니다.
본 적이없는 항목이있었습니다.
Life Cycle은 항목이 없어!
음, 선택할 수있는 것은
  • UIKit AppDelegate
  • SwiftUI App

  • SwiftUI App! 그래! 몰라! 너에게 결정했다!

    환경


  • XCode12.1 (12A7403)

  • 초기 파일 구성



    'AppDelegate.Swift', 'SceneDelegate.swift'가 언제나 진좌하고 있지만
    평소 너희들은 없다. . 「앱명 App.swift」가 있다. .
    매우 간단하고 매우 좋아하지만.


    소총주기는 어떻게 관리합니까?



    기동시에, 〇〇 처리하고,
    백그라운드로 갈 때, □□ 처리하고, 등 잘 Appdelegate에 신세를 지고 있었지만
    사라졌습니다.
    어떻게 할 것인가, 조사해 보았습니다.

    ScenePhase



    몰랐던 것만으로, ScenePhase 에 확실히 기재되고 있었습니다.
    @Environment (.scenePhase)를 추가하고 상태를 얻는 것 같습니다.
    
    @Environment(\.scenePhase) private var scenePhase
    

    WindowGroup에 .onChange를 추가하고 아래와 같이 실행해 보겠습니다.
    struct MyAppApp: App {
    
        @Environment(\.scenePhase) private var scenePhase
    
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
            .onChange(of: scenePhase) { phase in
                switch phase {
                case .active:
                    NSLog("・scenePhase : active")
                case .inactive:
                    NSLog("・scenePhase : inactive")
                case .background:
                    NSLog("・scenePhase : background")
                @unknown default:
                    NSLog("・scenePhase : @unknown")
                }
            }
        }
    }
    

    부팅 전용
    2020-11-11 15:07:19.852837+0900 MyApp[65073:4732940] ・scenePhase : active
    

    시작 후 홈 화면으로 돌아가기
    2020-11-11 15:07:19.852837+0900 MyApp[65073:4732940] ・scenePhase : active
    2020-11-11 15:11:43.979548+0900 MyApp[65073:4732940] ・scenePhase : inactive
    2020-11-11 15:11:44.701499+0900 MyApp[65073:4732940] ・scenePhase : background
    

    1, 기동 후, 홈 화면으로 돌아온다
    2, 홈 화면에서 아이콘 탭
    2020-11-11 15:07:19.852837+0900 MyApp[65073:4732940] ・scenePhase : active
    2020-11-11 15:11:43.979548+0900 MyApp[65073:4732940] ・scenePhase : inactive
    2020-11-11 15:11:44.701499+0900 MyApp[65073:4732940] ・scenePhase : background
    2020-11-11 15:12:52.412940+0900 MyApp[65073:4732940] ・scenePhase : inactive
    2020-11-11 15:12:52.720381+0900 MyApp[65073:4732940] ・scenePhase : active
    

    뭐, 이것이라도 괜찮으면 괜찮지만. . .

    UIApplicationDelegateAdaptor를 사용하는 방법도 있습니다.



    다음을 구현하고 "didFinishLaunchingWithOptions"를 구현합니다.
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
            NSLog("・\(#function)")
            return true
        }
    }
    

    부팅 전용
    2020-11-11 15:16:35.748372+0900 MyApp[68348:4752272] ・application(_:didFinishLaunchingWithOptions:)
    2020-11-11 15:16:35.780670+0900 MyApp[68348:4752272] ・scenePhase : active
    

    음. 평소처럼 ^^

    다음으로 didFinishLaunchingWithOptions에서 NotificationCenter를 작성하여 Log를 내 보았습니다.
         func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
            NSLog("・\(#function)")
    
            NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { _ in
                NSLog("・didBecomeActiveNotification")
            }
    
            NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: .main) { _ in
                NSLog("・didEnterBackgroundNotification")
            }
    
            NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main) { _ in
                NSLog("・willResignActiveNotification")
            }
    
            NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: .main) { _ in
                NSLog("・willEnterForegroundNotification")
            }
    
            NotificationCenter.default.addObserver(forName: UIApplication.willTerminateNotification, object: nil, queue: .main) { _ in
                NSLog("・willTerminateNotification")
            }
            return true
        }
    

    부팅 전용
    2020-11-11 16:11:55.657872+0900 MyApp[86873:4856069] ・application(_:didFinishLaunchingWithOptions:)
    2020-11-11 16:11:55.669768+0900 MyApp[86873:4856069] ・scenePhase : active
    2020-11-11 16:11:55.670455+0900 MyApp[86873:4856069] ・willEnterForegroundNotification
    2020-11-11 16:11:55.670839+0900 MyApp[86873:4856069] ・didBecomeActiveNotification
    

    시작 후 홈 화면으로 돌아가기
    2020-11-11 16:11:55.657872+0900 MyApp[86873:4856069] ・application(_:didFinishLaunchingWithOptions:)
    2020-11-11 16:11:55.669768+0900 MyApp[86873:4856069] ・scenePhase : active
    2020-11-11 16:11:55.670455+0900 MyApp[86873:4856069] ・willEnterForegroundNotification
    2020-11-11 16:11:55.670839+0900 MyApp[86873:4856069] ・didBecomeActiveNotification
    
    2020-11-11 16:12:40.028331+0900 MyApp[86873:4856069] ・scenePhase : inactive
    2020-11-11 16:12:40.028830+0900 MyApp[86873:4856069] ・willResignActiveNotification
    2020-11-11 16:12:41.232107+0900 MyApp[86873:4856069] ・scenePhase : background
    2020-11-11 16:12:41.256543+0900 MyApp[86873:4856069] ・didEnterBackgroundNotification
    

    1, 기동 후, 홈 화면으로 돌아온다
    2, 홈 화면에서 아이콘 탭
    // App起動
    2020-11-11 16:11:55.657872+0900 MyApp[86873:4856069] ・application(_:didFinishLaunchingWithOptions:)
    2020-11-11 16:11:55.669768+0900 MyApp[86873:4856069] ・scenePhase : active
    2020-11-11 16:11:55.670455+0900 MyApp[86873:4856069] ・willEnterForegroundNotification
    2020-11-11 16:11:55.670839+0900 MyApp[86873:4856069] ・didBecomeActiveNotification
    // バックグラウンドへ
    2020-11-11 16:12:40.028331+0900 MyApp[86873:4856069] ・scenePhase : inactive
    2020-11-11 16:12:40.028830+0900 MyApp[86873:4856069] ・willResignActiveNotification
    2020-11-11 16:12:41.232107+0900 MyApp[86873:4856069] ・scenePhase : background
    2020-11-11 16:12:41.256543+0900 MyApp[86873:4856069] ・didEnterBackgroundNotification
    // フォアグラウンドへ
    2020-11-11 16:13:29.154073+0900 MyApp[86873:4856069] ・scenePhase : inactive
    2020-11-11 16:13:29.154485+0900 MyApp[86873:4856069] ・willEnterForegroundNotification
    2020-11-11 16:13:29.466073+0900 MyApp[86873:4856069] ・scenePhase : active
    2020-11-11 16:13:29.467123+0900 MyApp[86873:4856069] ・didBecomeActiveNotification
    

    구현에 따라 지금까지와 같이 할 수 있어서 좋았다.

    앞으로



    ScenePhase만으로도, 대부분은, 대응을 할 수 있을 것 같습니다만, 세세하게 나누고 싶은 경우는,
    지금까지와 같이 AppDelegate를 사용하는 것이 무난할 것이라고 생각합니다.
    아직, 서둘러, SwiftUIApp에 대응하는 일도 없고, UIKit AppDelegate로 만들면 아무것도 신경쓰는 것은 없는 것입니다만, 신경이 쓰여 버렸기 때문에! !

    오늘은 여기까지! !

    좋은 웹페이지 즐겨찾기