Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

iOS에서 Firebase 클라우드 메시징 클라이언트 앱 설정

iOS 클라이언트 앱의 경우 Firebase 클라우드 메시징 APN 인터페이스를 통해 최대 4KB의 알림 및 데이터 페이로드를 수신할 수 있습니다.

Objective-C 또는 Swift로 클라이언트 코드를 작성하려면 FIRMessaging API를 사용하는 것이 좋습니다. 빠른 시작 예시에서는 두 언어의 샘플 코드를 제공합니다.

Firebase 클라우드 메시징의 메서드 재구성

FCM SDK는 FCM 등록 토큰에 APN 토큰을 매핑하고 다운스트림 메시지 콜백 처리 중에 애널리틱스 데이터를 캡처하는 등 2가지 주요 영역에서 메서드를 재구성합니다. 재구성을 사용하지 않으려는 개발자는 앱의 Info.plist 파일에 FirebaseAppDelegateProxyEnabled 플래그를 추가하고 NO(부울 값)로 설정하여 재구성을 해제할 수 있습니다. 이 가이드의 관련 영역에서는 메서드 재구성을 사용할 때와 그렇지 않을 때의 코드 예시를 모두 제공합니다.

iOS 프로젝트에 Firebase 추가

이 섹션에서 설명하는 작업은 앱에서 다른 Firebase 기능을 사용 설정한 경우 이미 완료된 상태일 수 있습니다. 특히 FCM의 경우 APN 인증 키를 업로드하고 원격 알림을 등록해야 합니다.

기본 요건

  • 다음을 설치합니다.

    • Xcode 11.0 이상
    • CocoaPods 1.9.0 이상
  • 프로젝트가 다음 요구사항을 충족하는지 확인합니다.

    • 프로젝트에서 iOS 10 이상을 타겟팅해야 합니다.
  • 실제 iOS 기기를 설정하여 앱을 실행하고 다음 작업을 완료합니다.

    • Apple 개발자 계정의 Apple 푸시 알림 인증 키를 가져옵니다.
    • XCode의 App(앱) > Capabilities(기능)에서 푸시 알림을 사용 설정합니다.

Xcode 프로젝트가 준비되지 않았다면 빠른 시작 샘플 중 하나를 다운로드하여 Firebase 제품을 사용해 볼 수 있습니다.

Firebase 프로젝트 만들기

Firebase를 iOS 앱에 추가하려면 먼저 iOS 앱에 연결할 Firebase 프로젝트를 만드세요. Firebase 프로젝트에 대한 자세한 내용은 Firebase 프로젝트 이해를 참조하세요.

Firebase에 앱 등록

Firebase 프로젝트가 준비되었으면 iOS 앱을 추가할 수 있습니다.

여러 빌드 변형을 처리하는 방법을 비롯하여 앱을 Firebase 프로젝트에 추가할 때의 권장사항 및 고려사항을 자세히 알아보려면 Firebase 프로젝트 이해를 참조하세요.

  1. Firebase Console로 이동합니다.

  2. 프로젝트 개요 페이지 중앙에 있는 iOS 아이콘()을 클릭하여 설정 워크플로를 시작합니다.

    Firebase 프로젝트에 앱을 이미 추가한 경우 앱 추가를 클릭하여 플랫폼 옵션을 표시합니다.

  3. iOS 번들 ID 필드에 앱의 번들 ID를 입력합니다.

  4. (선택사항) 다른 앱 정보(앱 닉네임App Store ID)를 입력합니다.

  5. 앱 등록을 클릭합니다.

Firebase 구성 파일 추가

  1. GoogleService-Info.plist 다운로드를 클릭하여 Firebase iOS 구성 파일(GoogleService-Info.plist)을 가져옵니다.

  2. 구성 파일을 Xcode 프로젝트의 루트로 이동합니다. 메시지가 표시되면 모든 대상에 구성 파일을 추가하도록 선택합니다.

프로젝트에 번들 ID가 여러 개 있으면 각 앱에 자체 GoogleService-Info.plist 파일이 포함되도록 각 번들 ID를 Firebase Console에서 등록된 앱과 연결해야 합니다.

앱에 Firebase SDK 추가

CocoaPods를 사용하여 Firebase 라이브러리를 설치하는 것이 좋습니다. 하지만 CocoaPods를 사용하지 않으려는 경우 SDK 프레임워크를 직접 통합하거나 Swift 패키지 관리자 베타를 사용할 수 있습니다.

빠른 시작 샘플 중 하나를 사용하고 있나요? Xcode 프로젝트 및 Podfile(pod 포함)이 이미 있더라도 Firebase 구성 파일을 추가하고 pod를 설치해야 합니다.

  1. Podfile이 없으면 만듭니다.

    cd your-project-directory
    pod init
  2. 앱에 사용할 Firebase pod를 Podfile에 추가합니다.

    지원되는 Firebase 제품을 iOS 앱에 추가할 수 있습니다.

    Firebase 클라우드 메시징 사용 환경을 최적화하려면 프로젝트에 Google 애널리틱스를 사용 설정하는 것이 좋습니다. 또한 애널리틱스 설정 과정에서 애널리틱스용 Firebase SDK를 앱에 추가해야 합니다.

    애널리틱스를 사용 설정한 경우

    # Add the Firebase pod for Google Analytics
    pod 'Firebase/Analytics'
    # Add the pod for Firebase Cloud Messaging pod 'Firebase/Messaging'

    애널리틱스를 사용 설정하지 않은 경우

    # Add the pod for Firebase Cloud Messaging
    pod 'Firebase/Messaging'
  3. pod를 설치하고 .xcworkspace 파일을 열어 Xcode에서 프로젝트를 확인합니다.

    pod install
    open your-project.xcworkspace

APN 인증 키 업로드

Firebase에 APN 인증 키를 업로드합니다. 아직 APN 인증 키가 없으면 FCM에서 APN 구성을 참조하세요.

  1. Firebase Console의 프로젝트 내에서 톱니바퀴 아이콘을 선택하고 프로젝트 설정을 선택한 다음 클라우드 메시징 탭을 선택합니다.

  2. iOS 앱 구성APN 인증 키에서 업로드 버튼을 클릭합니다.

  3. 키를 저장한 위치로 이동하여 키를 선택하고 열기를 클릭합니다. 해당하는 키 ID(Apple Developer Member CenterCertificates, Identifiers & Profiles(인증서, 식별자, 프로필)에서 확인 가능)를 추가하고 업로드를 클릭합니다.

앱에서 Firebase 초기화

애플리케이션에 Firebase 초기화 코드를 추가해야 합니다. 다음과 같이 Firebase 모듈을 가져오고 공유 인스턴스를 구성합니다.

  1. UIApplicationDelegate에서 Firebase 모듈을 가져옵니다.

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  2. 일반적으로 앱의 application:didFinishLaunchingWithOptions: 메서드에서 FirebaseApp 공유 인스턴스를 구성합니다.

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];

원격 알림 등록

애플리케이션이 시작될 때 또는 적절한 시점에 원격 알림에 앱을 등록합니다. 다음과 같이 registerForRemoteNotifications를 호출합니다.

Swift

if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self

  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: {_, _ in })
} else {
  let settings: UIUserNotificationSettings =
  UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()

Objective-C

if ([UNUserNotificationCenter class] != nil) {
  // iOS 10 or later
  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
      UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter]
      requestAuthorizationWithOptions:authOptions
      completionHandler:^(BOOL granted, NSError * _Nullable error) {
        // ...
      }];
} else {
  // iOS 10 notifications aren't available; fall back to iOS 8-9 notifications.
  UIUserNotificationType allNotificationTypes =
  (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
  UIUserNotificationSettings *settings =
  [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
  [application registerUserNotificationSettings:settings];
}

[application registerForRemoteNotifications];

등록 토큰 액세스

기본적으로 FCM SDK는 앱을 시작할 때 클라이언트 앱 인스턴스용 등록 토큰을 생성합니다. APN 기기 토큰과 마찬가지로 이 토큰을 사용하여 타겟팅한 알림을 앱의 모든 특정 인스턴스로 전송할 수 있습니다.

iOS가 일반적으로 앱 시작 시 APN 기기 토큰을 전달하는 것과 마찬가지로 FCM은 FIRMessagingDelegatemessaging:didReceiveRegistrationToken: 메서드를 통해 등록 토큰을 제공합니다. FCM SDK는 최초 앱 시작 시 및 토큰이 업데이트/무효화될 때마다 신규 또는 기존 토큰을 검색합니다. 어떠한 경우든 FCM SDK는 유효한 토큰이 있는 messaging:didReceiveRegistrationToken:을 호출합니다.

다음과 같은 경우에 등록 토큰이 변경될 수 있습니다.

  • 새 기기에서 앱 복원
  • 사용자가 앱 삭제/재설치
  • 사용자가 앱 데이터 소거

메시지 대리자 설정

등록 토큰을 받으려면 [FIRApp configure]를 호출한 후 메시지 대리자 프로토콜을 구현하고 FIRMessagingdelegate 속성을 설정합니다. 예를 들어 애플리케이션 대리자가 메시지 대리자 프로토콜을 준수하는 경우 application:didFinishLaunchingWithOptions:에서 대리자를 애플리케이션 대리자로 설정할 수 있습니다.

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

현재 등록 토큰 가져오기

등록 토큰은 messaging:didReceiveRegistrationToken: 메서드를 통해 전달됩니다. 일반적으로 앱 시작 시 등록 토큰을 사용하여 이 메서드를 한 번 호출합니다. 이 메서드가 호출되면 다음과 같은 작업을 할 수 있습니다.

  • 새 등록 토큰이라면 애플리케이션 서버에 전송합니다.
  • 등록 토큰을 주제에 구독 처리합니다. 이 작업은 신규 구독 또는 사용자의 앱 재설치 같은 상황에서만 필요합니다.

token(completion:)을 사용하여 직접 토큰을 가져올 수 있습니다. 어떤 방식으로든 토큰 가져오기에 실패할 경우 null이 아닌 오류가 제공됩니다.

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];

언제든지 이 메서드를 사용하여 저장하는 대신 토큰에 액세스할 수 있습니다.

토큰 갱신 모니터링

토큰이 업데이트될 때마다 알림을 받으려면 메시지 대리자 프로토콜을 준수하는 대리자를 제공합니다. 다음 예시에서는 대리자를 등록하고 적절한 대리자 메서드를 추가합니다.

Swift

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
  print("Firebase registration token: \(String(describing: fcmToken))")

  let dataDict:[String: String] = ["token": fcmToken ?? ""]
  NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
  // TODO: If necessary send token to application server.
  // Note: This callback is fired at each app startup and whenever a new token is generated.
}

Objective-C

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
    NSLog(@"FCM registration token: %@", fcmToken);
    // Notify about received token.
    NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
    [[NSNotificationCenter defaultCenter] postNotificationName:
     @"FCMToken" object:nil userInfo:dataDict];
    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
}

대리자 메서드를 제공하는 대신 kFIRMessagingRegistrationTokenRefreshNotification이라는 NSNotification을 수신 대기할 수도 있습니다. 토큰 속성은 항상 현재 토큰 값을 갖습니다.

재구성 사용 중지됨: APN 토큰과 등록 토큰 매핑

메서드 재구성을 사용 중지했다면 APN 토큰을 명시적으로 FCM 등록 토큰에 매핑해야 합니다. didRegisterForRemoteNotificationsWithDeviceToken 메서드를 재정의하여 APN 토큰을 검색한 후 FIRMessagingAPNSToken 속성을 설정합니다.

Swift

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

Objective-C

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

FCM 등록 토큰이 생성된 후 재구성이 사용 설정되었을 때와 동일한 메서드를 사용하여 토큰에 액세스하고 새로고침 이벤트를 리슨할 수 있습니다.

자동 초기화 방지

FCM 등록 토큰이 생성되면 라이브러리는 식별자와 구성 데이터를 Firebase에 업로드합니다. 사용자에게 먼저 명시적인 수신 동의를 얻으려면 FCM을 사용 중지하여 구성 시 토큰이 생성되지 않게 하면 됩니다. 이렇게 하려면 메타데이터 값을 Info.plist(GoogleService-Info.plist 아님)에 추가합니다.

FirebaseMessagingAutoInitEnabled = NO

FCM을 다시 사용 설정하려면 런타임 호출을 만들면 됩니다.

Swift

Messaging.messaging().autoInitEnabled = true

Objective-C

[FIRMessaging messaging].autoInitEnabled = YES;

이 값을 설정하고 나면 앱을 다시 시작해도 유지됩니다.

다음 단계

iOS 클라이언트를 설정한 후에는 메시지 처리 및 기타 고급 동작을 앱에 추가할 수 있습니다. 자세한 내용은 다음 가이드를 참조하세요.