728x90
반응형
didFinishLaunchingWithOptions
푸시를 클릭한 것과 같이 앱이 시작한 이유를 찾아 원하는 동작대로 하려면 어떻게 해야할까?
오늘 푸시 관련 기능을 추가하다가 앱이 완전 종료된 상태(메모리에도 없음)에서 푸시를 클릭하여 앱을 실행한 경우 원하는 페이지로 이동하지 않는 것을 확인하였다.
푸시 클릭으로 앱이 실행되었을 때를 기준으로 앱이 시작될 때 원하는 동작을 하려면 어떻게 해야하는지 확인해보고자한다.
1. didFinishLaunchingWithOptions
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622921-application
프로젝트 생성 시 기본으로 들어가있는
AppDelegate
클래스에 아래와 같은 함수가 있는 것을 확인할 수 있다.func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true }
이 함수는 delegate에게 실행 프로세스가 거의 끝나고 앱이 실행될 준비가 거의 되었음을 알리는 함수이다.
여기에는 두개의 파라미터가 존재하는데
UIApplication
과[UIApplication.LaunchOptionsKey: Any]
이다.반환값은 Bool 타입으로 앱이 URL 리소스를 처리할 수 없거나 사용자의 작업을 처리할 수 없다면 false를, 그렇지 않으면 true를 반환한다. 원격 알림으로 앱이 실행되면 반환값은 무시된다.
이 메서드가 반환된 후 시스템은 다른 델리게이트 메서드를 호출하여 앱을 Foreground 상태 또는 background 상태로 이동시킨다.
2. UIApplication
- https://developer.apple.com/documentation/uikit/uiapplication
- 모든 iOS앱에는 정확히 단 하나의 UIApplication 인스턴스가 존재한다.
3. [UIApplication.LaunchOptionsKey: Any]
- https://developer.apple.com/documentation/uikit/uiapplication/launchoptionskey
- 앱이 시작된 이유가 담겨있는
dictionary
이다. 사용자가 직접 앱을 실행한 경우 (앱 아이콘 클릭 등)이라면nil
을 가지고 있다. - 아래와 같은 다양한 키를 가지고 있고 각 타입별로 어떤 형의 데이터를 가지고 있는지 알려주니까 해당 타입에 맞춰 형변환을 해서 사용하면 된다
annotation
bluetoothCentrals
bluetoothPeripherals
cloudKitShareMetadata
location
newsstandDownloads
remoteNotification
shortcutItem
sourceApplication
url
userActivityDictionary
userActivityType
4. 종료된 상태에서 푸시 클릭으로 앱이 실행될 때 처리하기
- 위에 있는 키 중
remoteNotification
키가 원격 알림으로 앱이 실행되었을 때 사용할 수 있고NSDictionary
형을 가지기 때문에 해당 타입으로 형변환을 해준다. - 값이 없을 수 있기 때문에 옵셔널 바인딩을 해줘야 앱이 실행되자마자 종료되는 불상사를 막을 수 있다.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
if let userInfo = launchOptions?[.remoteNotification] as? [AnyHashable: Any] {
// 푸시로 앱 진입한 경우 처리
}
return true
}
5. 앱이 실행 중일 때 푸시 클릭 처리하기
- 푸시 클릭 핸들링을 하려면
UNUserNotificationCenterDelegate
를 채택하고userNotificationCenter(_:didReceive:withCompletionHandler:)
함수를 구현해야 한다. - payload는
response.notification.request.content.userInfo
에서 가져와 사용하면 된다.
마무리
- 매번 당연하게 자리를 지키던 didFinishLaunchingWithOptions의 존재를 확인할 수 있었다.
반응형
'Programming > iOS' 카테고리의 다른 글
[iOS] MVVM Pattern (0) | 2021.10.08 |
---|---|
[iOS] MVC Pattern (0) | 2021.10.07 |
[따라하기/iOS] App Switcher - 앱 화면 가리기 (2) | 2021.10.02 |
SwiftGen 라이브러리 간단 설명 & 사용법 (0) | 2021.07.12 |
[iOS 14] (내가 찾은) iOS 14 대응 할 거리들 (0) | 2020.12.22 |