iOS 앱에 푸시 알림 추가

1. 소개

최종 업데이트: 2020년 1월 6일

Firebase 클라우드 메시징 (FCM)은 무료로 메시지를 안정적으로 전송할 수 있는 크로스 플랫폼 메시징 솔루션입니다.

FCM을 사용하면 새 이메일이나 기타 데이터를 동기화할 수 있음을 클라이언트 앱에 알릴 수 있습니다. 알림 메시지를 전송하여 사용자 재참여를 유도하고 유지율을 높일 수 있습니다. 채팅 메시지와 같은 사용 사례에서는 메시지가 최대 4KB의 페이로드를 클라이언트 앱으로 전송할 수 있습니다.

어떤 방식으로 작동되나요?

FCM 구현에는 송수신을 위한 두 가지 기본 구성요소가 포함됩니다.

  1. Firebase용 Cloud Functions 또는 앱 서버와 같이 메시지를 작성, 타겟팅, 전송할 수 있는 신뢰할 수 있는 환경
  2. 해당 플랫폼별 전송 서비스를 통해 메시지를 수신하는 iOS, Android 또는 웹 (JavaScript) 클라이언트 앱

FCM 아키텍처 개요

6636933bbe959ef2.png

FCM은 메시지를 빌드, 전송, 수신하는 다음 구성요소 집합을 사용합니다.

  1. 메시지 요청을 작성하거나 빌드하는 도구 알림 작성기는 알림 요청을 만들기 위한 GUI 기반 옵션을 제공합니다. 모든 메시지 유형을 완전하게 자동화하고 지원하려면 Firebase Admin SDK 또는 FCM 서버 프로토콜을 지원하는 신뢰할 수 있는 서버 환경에서 메시지 요청을 작성해야 합니다. 이 환경은 Firebase용 Cloud Functions, Google App Engine 또는 자체 앱 서버일 수 있습니다.
  2. FCM 백엔드는 다른 기능 중에서 메시지 요청을 수락하고, 주제를 통해 메시지 팬아웃을 수행하고, 메시지 ID와 같은 메시지 메타데이터를 생성합니다.
  3. 플랫폼 수준 전송 계층은 대상 기기로 메시지를 라우팅하고, 메시지 전송을 처리하고, 적절한 경우 플랫폼별 구성을 적용합니다. 이 전송 계층에는 다음이 포함됩니다.
  • Google Play 서비스를 사용하는 Android 기기용 Android 전송 계층 (ATL)
  • iOS 기기용 Apple 푸시 알림 서비스 (APN)
  • 웹 앱용 웹 푸시 프로토콜
  1. 사용자 기기의 FCM SDK. 알림이 표시되거나 앱의 포그라운드/백그라운드 상태 및 관련 애플리케이션 로직에 따라 메시지가 처리됩니다.

빌드할 항목

이 Codelab에서는 FCM을 사용하여 샘플 iOS 앱에 푸시 알림을 추가합니다.

학습할 내용

  • 푸시 메시지를 위해 사용자 수신 및 수신 거부 방법
  • 수신된 푸시 메시지 처리 방법
  • 알림을 표시하는 방법
  • 알림 클릭에 응답하는 방법

필요한 항목

  • Xcode 11.0 이상
  • CocoaPods 1.9.0 이상
  • Apple 개발자 계정
  • 앱을 실행할 실제 iOS 기기
  • Swift 기본 지식

2. 설정

샘플 코드 다운로드

이 Codelab에서는 자체 테스트 앱을 빌드하지만, 기존 샘플 앱을 확인하고 실행하려면 빠른 시작 샘플 코드를 다운로드하면 됩니다.

다음 두 가지 방법으로 샘플을 가져올 수 있습니다.

  • Git 저장소를 복제합니다.
$ git clone https://github.com/firebase/quickstart-ios.git
  • ZIP 파일을 다운로드합니다.

소스를 ZIP 파일로 다운로드한 경우 압축을 풀면 루트 폴더 quickstart-ios가 생성됩니다.

새 앱 만들기

다음 단계에 따라 자체 테스트 앱을 만듭니다 (아래 단계는 XCode 12.3에 있음).

  1. XCode를 열고 Create a new Xcode project를 선택합니다.
  2. App(앱)을 선택하고 Next(다음)를 클릭합니다.

e56c631b086c6d8.png

  1. 제품 이름 (예: MessagingExample)
  2. Team을 선택합니다 (팀을 만들지 않은 경우 Apple 개발자 계정에서 구성하세요).
  3. 조직 식별자 (예: com.your-name)
  4. 입력 번들 식별자 (예: com.your-name.MessagingExample의 경우 모든 iOS 앱에서 고유해야 합니다.
  5. 인터페이스 풀다운에서 스토리보드를 선택합니다.
  6. 수명 주기 풀다운에서 UIKit 앱 위임을 선택합니다.
  7. Language에서 Swift를 선택합니다.
  8. 다음을 클릭합니다.

fb860c0fa4a02818.png

APN 키를 만들고 Firebase 프로젝트에 앱을 등록할 때 번들 식별자가 필요합니다.

3. APN 구성

인증 키 만들기

이 섹션에서는 푸시 알림이 사용 설정된 앱 ID의 인증 키를 생성하는 방법을 설명합니다. 기존 키가 있는 경우 새 키를 생성하는 대신 기존 키를 사용할 수 있습니다.

인증 키를 만들려면 다음 안내를 따르세요.

  1. 개발자 계정에서 인증서, 식별자 및 프로필을 클릭하고 로 이동합니다.

19ae87d0f00402b1.png

  1. 오른쪽 상단의 추가 버튼 (+)을 클릭합니다.

c4acd10dbc4f721f.png

  1. APN 인증 키에 대한 설명을 입력하세요.
  2. '키 서비스'에서 APN 체크박스를 선택하고 계속을 클릭합니다.

6a3e8ff7457a8251.png

  1. 등록을 클릭한 다음 다운로드를 클릭합니다. 키를 안전한 곳에 저장하세요. 일회성 다운로드이며 나중에 키를 검색할 수 없습니다.

42c205e072fbd622.png

앱 ID 만들기

앱 ID는 앱을 고유하게 식별하는 식별자입니다. 관례적으로 이는 역방향 도메인으로 표현됩니다.

  1. Apple Developer Member Center로 이동하여 로그인합니다.
  2. Certificates, Identifiers and Profiles(인증서, 식별자, 프로필)로 이동합니다.
  3. 식별자로 이동합니다.
  4. + 버튼을 클릭하여 새로운 앱 ID를 만듭니다. <ph type="x-smartling-placeholder">e04fc394c52a866f.png</ph>
  5. 앱 ID 라디오 버튼을 선택하고 계속을 클릭합니다.

d454fd5df3b8d93d.png

  1. 을 선택하고 계속을 클릭합니다.

3bd2e836be5e0291.png

  1. 새 앱 ID를 만들려면 다음 단계를 따르세요.
  2. 앱 ID의 이름을 입력합니다.
  3. 팀 ID를 입력합니다. 이 값은 '멤버십' 탭의 팀 ID와 일치해야 합니다.
  4. 앱 ID 접미사 섹션에서 명시적인 앱 ID를 선택한 다음 번들 ID를 입력합니다. <ph type="x-smartling-placeholder">7363c4d1962b486d.png</ph>
  5. 앱 서비스 섹션에서 푸시 알림이 선택되어 있는지 확인합니다. <ph type="x-smartling-placeholder">552ea08703f7e323.png</ph>
  6. 계속을 클릭하고 올바르게 입력했는지 확인합니다.
  7. 식별자의 값이 팀 ID 및 번들 ID의 값을 연결한 것과 일치해야 합니다.
  8. Push NotificationsConfigurable(구성 가능)이어야 합니다
  9. 등록을 클릭하여 앱 ID를 만듭니다.

프로필 만들기

개발 중에 앱을 테스트하려면 아직 App Store에 게시되지 않은 앱을 기기에서 실행하도록 기기를 승인할 수 있는 개발용 프로필이 필요합니다.

  1. Apple Developer Member Center로 이동하여 로그인합니다.
  2. Certificates, Identifiers and Profiles(인증서, 식별자, 프로필)로 이동합니다.
  3. 왼쪽 상단의 드롭다운 메뉴에서 iOS, tvOS, watchOS가 선택되지 않은 경우 해당 항목을 선택하고 프로필로 이동합니다.
  4. + 버튼을 클릭하여 새 프로필을 만듭니다. <ph type="x-smartling-placeholder">1fa2342cfe45a925.png</ph>
  5. 프로비저닝 프로필 유형으로 iOS 앱 개발을 선택한 다음 계속을 클릭합니다.

507434a466220dfe.png

  1. 드롭다운 메뉴에서 사용할 앱 ID를 선택한 다음 계속을 클릭합니다.
  2. 이전 단계에서 선택한 앱 ID의 iOS 개발 인증서를 선택한 다음 Continue를 클릭합니다.
  3. 프로비저닝 프로필에 포함할 iOS 기기를 선택한 다음 계속을 클릭합니다. 테스트에 사용할 기기를 모두 선택해야 합니다.
  4. 프로비저닝 프로필의 이름 (예: MessagingExampleProfile)을 입력한 다음 생성을 클릭합니다.

4395f04647afa997.png

  1. Download를 클릭하여 프로비저닝 프로필을 Mac에 저장합니다.

106761fa786ba580.png

  1. 프로비저닝 프로필 파일을 더블클릭하여 설치합니다.

4. iOS 프로젝트에 Firebase 추가

Firebase 프로젝트 만들기

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

  1. Firebase Console에서 프로젝트 추가를 클릭한 후 프로젝트 이름을 선택하거나 입력합니다. <ph type="x-smartling-placeholder">e462afd91c149238.png</ph>

기존 Google Cloud Platform (GCP) 프로젝트가 있으면 드롭다운 메뉴에서 프로젝트를 선택하여 Firebase 리소스를 해당 프로젝트에 추가할 수 있습니다.

  1. (선택사항) 새 프로젝트를 만드는 경우 프로젝트 ID를 수정할 수 있습니다.

Firebase는 Firebase 프로젝트에 자동으로 고유 ID를 할당합니다. Firebase에서 프로젝트 ID가 어떻게 사용되는지 알아보려면 Firebase 프로젝트 이해하기를 참조하세요.

  1. 계속을 클릭합니다.
  2. 다음 Firebase 제품을 사용하여 최적의 환경을 경험할 수 있도록 프로젝트에 Google 애널리틱스를 설정합니다.
  • Firebase Crashlytics
  • Firebase 예측
  • Firebase 클라우드 메시징
  • Firebase 인앱 메시지
  • Firebase 원격 구성
  • Firebase A/B 테스팅

메시지가 표시되면 기존 Google 애널리틱스 계정을 사용하거나 새 계정을 만들도록 선택합니다. 새 계정을 만들려면 애널리틱스 보고 위치를 선택한 다음 프로젝트에 대한 데이터 공유 설정 및 Google 애널리틱스 약관에 동의합니다.

1282a798556779ab.png

48ade68c8de27d2.png

  1. 프로젝트 만들기를 클릭합니다. 기존 GCP 프로젝트를 사용할 경우에는 Firebase 추가를 클릭합니다.

Firebase에서 Firebase 프로젝트용 리소스를 자동으로 프로비저닝합니다. 프로세스가 완료되면 Firebase Console에서 Firebase 프로젝트의 개요 페이지로 이동하게 됩니다.

Firebase에 앱 등록

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

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

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

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

93462beb642e8987.png

  1. iOS 번들 ID 필드에 앱의 번들 ID를 입력합니다.
  2. (선택사항) 다른 앱 정보(앱 닉네임App Store ID)를 입력합니다.
  3. 앱 등록을 클릭합니다.

2e7a00b0008344c1.png

Firebase 구성 파일 추가

  1. GoogleService-Info.plist 다운로드를 클릭하여 Firebase iOS 구성 파일 (GoogleService-Info.plist)을 가져옵니다. 69004caf7d448989.png
  2. 구성 파일을 Xcode 프로젝트의 루트로 이동합니다. 메시지가 표시되면 모든 대상에 구성 파일을 추가하도록 선택합니다.

7c5e0a46d07fa9c7.png

프로젝트에 번들 ID가 여러 개 있는 경우 각 앱이 자체 GoogleService-Info.plist 파일을 가질 수 있도록 각 번들 ID를 Firebase Console에서 등록된 앱과 연결해야 합니다.

XCode를 닫습니다.

앱에 Firebase SDK 추가

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

  1. Podfile이 없으면 만듭니다. 빠른 시작 샘플을 사용하는 경우 Xcode 프로젝트 및 Podfile (포드 포함)이 이미 있습니다.
$ cd MessagingExample
$ pod init
  1. 앱에서 사용할 Firebase 포드를 Podfile에 추가합니다.

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

빠른 시작 샘플에 Google 애널리틱스 및 Firebase 클라우드 메시징 SDK가 추가되었습니다.

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

# Add the pod for Firebase Cloud Messaging
pod 'Firebase/Messaging'
  1. 포드를 설치하고 .xcworkspace 파일을 열어 Xcode에서 프로젝트를 확인합니다.
$ pod install
  1. MessagingExample.xcworkspace을 열고 Firebase Console에서 다음을 클릭합니다. 6d1f8230d16693e6.png

앱에서 Firebase 초기화

애플리케이션에 Firebase 초기화 코드를 추가해야 합니다.

Firebase 모듈을 가져오고 공유 인스턴스를 구성합니다 (빠른 시작 샘플에서는 Firebase 모듈을 이미 가져왔습니다).

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

AppDelegate.swift

import UIKit
import Firebase // Add this line
  1. 일반적으로 앱의 application:didFinishLaunchingWithOptions: 메서드에서 FirebaseApp 공유 인스턴스를 구성합니다.

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure() // Add this line
  return true
}
  1. Firebase Console에서 다음을 클릭합니다. <ph type="x-smartling-placeholder">f9d37423d346ff0.png</ph>
  2. Firebase SDK가 앱에 추가됩니다. 콘솔로 이동을 클릭합니다. <ph type="x-smartling-placeholder">d1b1309cd3790f66.png</ph>

5. FCM 클라이언트 구성

APNs 인증 키 업로드

Firebase에 APNs 인증 키를 업로드합니다.

  1. Firebase Console 프로젝트 내에서 톱니바퀴 아이콘을 선택하고 프로젝트 설정을 선택한 다음 클라우드 메시징 탭을 선택합니다. <ph type="x-smartling-placeholder">ba8b5f95241327fe.png</ph>
  2. iOS 앱 구성APNs 인증 키에서 업로드 버튼을 클릭합니다. <ph type="x-smartling-placeholder">357ddc0d4b182492.png</ph>
  3. 키를 저장한 위치로 이동하여 키를 선택하고 열기를 클릭합니다. 해당하는 키 ID(Apple Developer Member Center의 Certificates, Identifiers &Profiles(인증서, 식별자, 프로필)에서 확인 가능)를 추가하고 업로드를 클릭합니다. <ph type="x-smartling-placeholder">3dae27f2327daf9e.png</ph>

원격 알림 등록

시작 시 또는 애플리케이션 흐름의 원하는 지점에서 원격 알림을 위해 앱을 등록합니다.

빠른 시작 샘플에는 registerForRemoteNotifications가 이미 추가되어 있습니다.

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  // [START register for remote notifications]
  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()
  // [END register for remote notifications]
  return true
}

AppDelegate.swift 끝에 다음 줄을 추가하여 UNUserNotificationCenter의 위임 속성을 할당합니다.

AppDelegate.swift

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo

    // Print full message.
    print(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

    // Print full message.
    print(userInfo)

    completionHandler()
  }
}

메시지 대리자 설정하기

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

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  Messaging.messaging().delegate = self // Add this line
  // [START register for remote notifications]
  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()
  // [END register for remote notifications]
  return true
}

AppDelegate.swift 끝에 다음 줄을 추가하여 FIRMessaging의 위임 속성을 할당합니다.

AppDelegate.swift

extension AppDelegate : MessagingDelegate {
  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)
  }
}

기능 추가

'Create an App ID(앱 ID 만들기)' 섹션에서 푸시 알림 기능을 추가했지만, XCode에서 다음 단계에 따라 이 기능도 추가해야 합니다(아래 단계는 XCode 12.3에 있음).

  1. 탐색기 영역에서 프로젝트 이름을 클릭합니다.
  2. 서명 및 기능.
  3. + 기능을 클릭합니다.

eaf41aefb3bf2c9e.png

  1. Background Modes(백그라운드 모드)를 더블클릭합니다.
  2. + 기능을 다시 클릭합니다.
  3. 푸시 알림을 더블클릭합니다.
  4. Background Modes(백그라운드 모드) 섹션에서 Remote notifications(원격 알림)를 선택합니다.

e5d0fc08651e04a9.png

6. 알림 메시지 전송

다음 단계에 따라 테스트 메시지를 보낼 수 있습니다.

  1. 대상 기기에 앱을 설치하고 실행합니다. 원격 알림을 받으려면 권한 요청을 수락해야 합니다.
  2. XCode 로그에서 등록 토큰을 가져옵니다.

a2e49a92f9807d34.png

  1. 앱이 기기에서 백그라운드에 있는지 확인합니다.
  2. 알림 작성기를 열고 새 알림을 선택합니다.
  3. 메시지 내용을 입력합니다. f485d7fbd2456ae0.png
  4. 테스트 메시지 보내기를 선택합니다.
  5. FCM 등록 토큰 추가 필드에 2단계에서 가져온 등록 토큰을 입력합니다.
  6. 테스트를 클릭합니다.

테스트를 클릭하면 타겟팅된 클라이언트 기기 (앱은 백그라운드 상태임)의 알림 센터에 알림이 표시됩니다.

앱으로 전송된 메시지의 통계를 파악하려면, iOS 및 Android 기기에서 열린 전송 메시지 수가 기록된 FCM 보고 대시보드를 확인하세요.

6570eea7b5228513.png

7. 축하합니다

축하합니다. 테스트 메일을 보냈습니다.

FCM에는 주제 구독 등 더 많은 기능과 구성이 있습니다.

자세히 알아보려면 공식 개발자 문서를 참고하세요.

다음 단계

다음 Codelab을 확인해 보세요.

추가 자료