Programming/iOS

[iOS/Swift] didFinishLaunchingWithOptions 알아보기, 푸시로 앱 실행할 때 처리하기

devssun 2021. 10. 6. 23:32
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

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의 존재를 확인할 수 있었다.
반응형