【SwiftUI】 앱의 기동 상태를 취득하는 방법 【iOS】

첫 투고입니다!
SwiftUI에서 iOS 앱을 개발하고 있어, 앱의 기동 상태를 취득하는 방법을 조사하는데 고생했기 때문에 비망록도 겸해 이 자리에서 공유하겠습니다.

iOS 앱의 시작 상태 정보



iOS 앱의 시작 상태는 Active, Inactive, Background의 세 가지 상태로 나눌 수 있습니다.
상태 천이도는 아래 그림과 같습니다. 기동할 때는 Inactive를 경유하고 나서 Active가 되는 것이나, Active로부터 Background가 될 때도 Inactive를 경유하는 것을 알 수 있다고 생각합니다.



자세한 내용은 Apple 공식 문서을 참조하십시오.

SwiftUI에서 얻는 방법



최근까지 SwiftUI에서는 앱의 기동 상태를 취득하는 API가 준비되어 있지 않았습니다만, iOS14에서는 ScenePhase를 이용하는 것으로 간단하게 취득할 수 있게 되었습니다.

특히 App 인스턴스에 다음 속성을 추가하여 검색할 수 있습니다.
@Environment(\.scenePhase) private var scenePhase

예를 보자. Xcode에서 새 프로젝트를 시작할 때 자동 생성되는 TestApp.swift를 다음과 같이 다시 작성합니다. (이 경우 Test는 프로젝트 이름입니다)
//
//  TestApp.swift
//  Test
//
//  Created by Ossamoon on 2020/12/25.
//

import SwiftUI

@main
struct TestApp: App {
    @Environment(\.scenePhase) private var scenePhase

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase) { phase in
            switch phase {
            case .background:
                print("バックグラウンド状態になりました")
            case .active:
                print("アクティブ状態になりました")
            case .inactive:
                print("非アクティブ状態になりました")
            default:
                print("このメッセージがでたら何か変だよ")
            }
        }
    }
}

시뮬레이터에서 앱을 실행해 봅시다. 그러면 콘솔에 "활성 상태가되었습니다."라는 메시지가 나타납니다.



여기에서 스 와이프하여 메뉴를 표시하면 "비활성 상태가되었습니다."라는 메시지가 나타납니다.



다른 화면으로 이동하면 '백그라운드 상태가 되었습니다'라는 메시지가 나타납니다.



여기에서 다시 앱 화면으로 돌아가면 '비활성 상태가 되었습니다'라는 메시지에 이어 '활성 상태가 되었습니다'라는 메시지가 나타납니다.



이런 느낌의 거동을 나타냅니다. 실제로 여러분의 수중에서 여러가지 만져보실 수 있으면 좋겠습니다.

요약



ScenePhase를 사용하면 앱의 시작 상태를 쉽게 얻을 수 있다는 것을 알 수 있을까 생각합니다.

iOS14 이후가 아니면 사용할 수 없다는 제약은 있습니다만, 매우 편리한 API이므로 여러분도 꼭 ScenePhase를 시험해 주세요!

참고문헌


  • ScenePhase | Apple Developer Documentation
  • SwiftUI: How to detect if the application in background or foreground? - Prafulla Singh - Medium
  • Managing Your App's Life Cycle | Apple Developer Documentation
  • 좋은 웹페이지 즐겨찾기