Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

Apple 앱에서 메시지 수신

클라이언트 앱이 장치에 설치되면 FCM APN 인터페이스를 통해 메시지를 수신할 수 있습니다. 알림 작성기 를 사용하여 사용자 세그먼트에 알림 보내기를 즉시 시작할 수 있습니다.

경고 알림 처리

FCM은 APN을 통해 Apple 앱을 대상으로 하는 모든 메시지를 전달합니다. UNUserNotificationCenter를 통해 APN 알림을 수신하는 방법에 대해 자세히 알아보려면 알림 및 알림 관련 작업 처리 에 대한 Apple 설명서를 참조하세요.

FCM에서 표시 알림을 수신하려면 UNUserNotificationCenter 대리자 를 설정하고 적절한 대리자 메서드를 구현해야 합니다.

빠른


extension AppDelegate: UNUserNotificationCenterDelegate {
  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification) async
    -> UNNotificationPresentationOptions {
    let userInfo = notification.request.content.userInfo

    // With swizzling disabled you must let Messaging know about the message, for Analytics
    // Messaging.messaging().appDidReceiveMessage(userInfo)

    // ...

    // Print full message.
    print(userInfo)

    // Change this to your preferred presentation option
    return [[.alert, .sound]]
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse) async {
    let userInfo = response.notification.request.content.userInfo

    // ...

    // With swizzling disabled you must let Messaging know about the message, for Analytics
    // Messaging.messaging().appDidReceiveMessage(userInfo)

    // Print full message.
    print(userInfo)
  }
}

오브젝티브-C

// Receive displayed notifications for iOS 10 devices.
// Handle incoming notification messages while app is in the foreground.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
  NSDictionary *userInfo = notification.request.content.userInfo;

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // ...

  // Print full message.
  NSLog(@"%@", userInfo);

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}

// Handle notification messages after display notification is tapped by the user.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler();
}

알림에 사용자 지정 작업을 추가하려면 알림 페이로드 에서 click_action 매개변수를 설정합니다. APN 페이로드에서 category 키에 사용할 값을 사용합니다. 사용자 지정 작업을 사용하려면 먼저 등록해야 합니다. 자세한 내용은 Apple의 로컬 및 원격 알림 프로그래밍 가이드 를 참조하세요.

앱으로의 메시지 전달에 대한 자세한 내용은 FCM 보고 대시보드 를 참조하십시오. FCM 보고 대시보드 에는 Android 앱의 "노출"(사용자가 본 알림)에 대한 데이터와 함께 Apple 및 Android 장치에서 보내고 열었던 메시지 수를 기록합니다.

무음 푸시 알림 처리

content_available 키(APN의 content-available 에 해당)를 사용하여 메시지를 보낼 때 메시지는 백그라운드 데이터 새로 고침과 같은 작업을 위해 백그라운드에서 앱을 깨우는 자동 알림으로 전달됩니다. 포그라운드 알림과 달리 이러한 알림은 application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 메서드.

다음과 같이 application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 을 구현합니다.

빠른

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async
  -> UIBackgroundFetchResult {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)

  return UIBackgroundFetchResult.newData
}

오브젝티브-C

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // ...

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);
}

Apple 플랫폼은 백그라운드 알림 전달을 보장하지 않습니다. 백그라운드 알림이 실패할 수 있는 조건에 대해 알아보려면 앱에 백그라운드 업데이트 푸시 에 대한 Apple 문서를 참조하세요.

알림 메시지 페이로드 해석

알림 메시지의 페이로드는 키와 값의 사전입니다. APN을 통해 전송되는 알림 메시지는 아래와 같은 APN 페이로드 형식을 따릅니다.

  {
    "aps" : {
      "alert" : {
        "body" : "great match!",
        "title" : "Portugal vs. Denmark",
      },
      "badge" : 1,
    },
    "customKey" : "customValue"
  }

메서드 재구성이 비활성화된 메시지 처리

기본적으로 앱의 앱 대리자 클래스를 UNUserNotificationCenterMessaging 대리자 속성에 할당하면 FCM은 앱 대리자 클래스를 재구성하여 FCM 토큰을 기기의 APN 토큰과 자동으로 연결하고 알림 수신 이벤트를 Analytics에 전달합니다. 메서드 스위즐링을 명시적으로 비활성화하거나 SwiftUI 앱을 빌드하거나 두 대리자에 대해 별도의 클래스를 사용하는 경우 이 두 작업을 모두 수동으로 수행해야 합니다.

FCM 토큰을 장치 APN 토큰과 연결하려면 apnsToken 속성 을 통해 앱 대리자의 토큰 새로 고침 핸들러 에 있는 Messaging 클래스에 APN 토큰을 전달합니다.

빠른

func application(_ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  Messaging.messaging().apnsToken = deviceToken;
}
 

오브젝티브-C

- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  [FIRMessaging messaging].APNSToken = deviceToken;
}

알림 수신 정보를 Analytics에 전달하려면 appDidReceiveMessage(_:) 메소드 를 사용하십시오.

빠른

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            willPresent notification: UNNotification,
  withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
  let userInfo = notification.request.content.userInfo

  Messaging.messaging().appDidReceiveMessage(userInfo)

  // Change this to your preferred presentation option
  completionHandler([[.alert, .sound]])
}

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            didReceive response: UNNotificationResponse,
                            withCompletionHandler completionHandler: @escaping () -> Void) {
  let userInfo = response.notification.request.content.userInfo

  Messaging.messaging().appDidReceiveMessage(userInfo)

  completionHandler()
}

func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  Messaging.messaging().appDidReceiveMessage(userInfo)
  completionHandler(.noData)
}

오브젝티브-C

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
  NSDictionary *userInfo = notification.request.content.userInfo;

  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;

  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  completionHandler();
}

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];
  completionHandler(UIBackgroundFetchResultNoData);
}