본문 바로가기

iOS

FCM과 APNs에 관하여

지금까지 서비스를 개발하며,

 

단순히 사용자들에게 메시지를 전달하기 위해 사용하였던 Push Notification과

 

메시지 전달을 위해 사용하였던 FCM(Firebase Cloud Messging), APNs에 관하여 공부하였고

 

이 블로그에 남깁니다.

 

1. Push Notification

 

Push Notification이란?

=> 서버에서 발생한 Event를 특정 클라이언트에게 Event 발생 사실을 통지하는 기술

 

그렇다면 , Push Notification이 왜 필요할까요?

 

iOS App의 경우 기본적으로 Background 상태가 되면 모든 처리 기능이 제한됩니다.

 

따라서 Background / Foreground 상태에 관계없이 사용자에게 메시지 전달이 필요한 경우, 

 

Push Notification 기능을 사용하게 됩니다.

 

Push Notification의 지원 기능으로는

- 짧은 텍스트 메시지 표시

- 짧게 소리 울리기

- 앱 아이콘 배지 숫자 설정

 

정도가 있으며 Notification Extension를 사용하거나,

 

데이터 형식의 메세지의 경우 이미지를 푸시메시지와 함께 노출시킬수 있습니다.

 

해당 내용은 추후에 다시 설명하도록 하겠습니다.

 

 

2. Push Notification의 동작 방식

 

Push Notification을 사용하여 사용자들에게 어떻게 메시지를 전달할까요?

 

안타깝게도 

 

Application(Client) <------------ Message ------------- Provider

 

이런식으로 메시지가 전달되지 않습니다.

 

iOS의 경우 APNs라는 플랫폼을 통해서만 사용자들에게 메시지를 전달합니다.

 

APNs(Apple Push Notification service)란?

=> third party 개발자(푸시 서버)가 우리 앱에 푸시 알람을 보낼 수 있도록 Apple에서 만든 "알림 서비스 플랫폼"

 

따라서 

 

Application(Client) <------------ Message ----------APNs ----------- Message -----------     Provider

 

다음과 같은 형태로 메시지가 전달됩니다.

 

 

Provider (Push Server)는 어떻게 많은 사용자들 중 내 App을 찾아서 푸시 알람을 보낼까요?

 

그림을 보면서 설명드리겠습니다.

 

그림과 같이

 

1. Application(Client)는 iOS API를 사용하여 APNs에게 Device Token을 요청합니다.

 

※ Device Token이란 푸시가 전송되는 App의 주소이며 애플에서 암호화 해서 전달될 NSData 형식의 64바이트 문자열입니다.

 

따라서 Device Token은 APNs를 통해서만 복호화가 가능합니다.

 

someApp@someDevice와 같이 메일과 비슷한 형식으로 정의되어 있으며, 앱과 디바이스를 특정하는 역활을 하는 토큰입니다.

 

 

2. Device Token을 전달받은 Client는 Provider에게 해당 토큰을 전달합니다.

 

 

이후, Provider (Push Server)에서 특정 Client에게 푸시 메시지를 전송할 시, 

 

APNs에게 Device Token과 전달하고자 하는 Message를 전달합니다.

 

이때, Provider와 APNs는 TLS 통신을 하기 때문에 Provider에 인증서가 준비되어 있어야 합니다.

 

 

3. Device Token과 Message를 전달받은 APNs는 해당 주소로 Push Notification를 발생,

Client로 하여금 메시지를 확인할 수 있도록 합니다.

 

3. FCM(Firebase Cloud Messaging)

지금까지 Push Notification을 발송하는 방법을 알아보았습니다.

 

그렇다면 FCM은 무엇일까요?

 

FCM이란?

=> Android, iOS 및 웹 애플리케이션의 메시지 및 알림을 위한 크로스 플랫폼 클라우스 솔루션

 

구글의 firebase에 지원하는 클라우드 메시징 서비스로 크로스 플랫폼 솔루션인 만큼

 

플랫폼에 종속되지 않고 메시지를 전송할 수 있습니다.

 

Analystic을 포함한 FCM에서 제공하는 여러가지 기능들도 함께 사용이 가능하며,

 

APNs키를 사용하여 인증할 경우 별도의 갱신없이 편리하게 사용할 수 있습니다.

 

FCM의 작동 원리 또한 그림을 보며 설명 드리겠습니다.

 

 

FCM 사용 등록

1. Application(Client)는 APNs로 부터 발급받은 Device Token을 FCM에 전달 및 FCM Token 발급을 요청합니다.

2. Firebase는 Device Token이 매핑된 FCM Token을 발급한 이루 Client에게 응답합니다.

3. Client는 Provider(Push Server)에게 FCM Token과 자신을 식별할 수 있는 식별자를 전달합니다.

4. Provider는 해당 식별자와 FCM Token을 매칭시켜 저장합니다.

 

 

FCM을 통한 Push Notification 발송

Provider(Push Server)에서 Push Notification을 발송 시 

 

Firebase에게 해당 유저의 FCM Token과 Message를 전달합니다.

 

FCM은 APNs로 부터 Target Address(Device Token)을 조회한 이후 

 

해당 Device Token으로 메시지를 전달합니다.

 

 

FCM에서 지원하는 Message 유형

 

Provider는 FCM을 통해 2가지 유형의 메시지를 클라이언트에 보낼 수 있습니다.

1. 알림 메시지

 =>  Client에서 별도의 처리없이 정해진 형식대로 FCM SDK에서 자동으로 처리

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"This is Title",
      "body":"This is Content"
    }
  }
}

 

2. 데이터 메시지

=> Client에서 처리

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "name" : "Kwon",
      "greeting" : "hello",
      "type" : "urgent"
    }
  }
}

data 형식의 페이로드의 경우

- Background

알림 페이로드가 앱의 알림 목록에 수신되며, 사용자가 알림을 탭한 경우에만 앱이 데이터 페이로드를 처리합니다.

 

- Foreground

앱에서 페이로드가 둘 다 제공되는 메시지 객체를 수신합니다.

 

 

4. FCM iOS 연동

FCM 인증서 설정이 모두 완료되었다면, iOS에서 Firebase를 연동합니다.

func application(_ application: UIApplication, 
				didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
	// FirebaseApp SDK 연결 및 초기화
	FirebaseApp.configure()				
    
	//Firebase의 Messaging delegate 지정 
	Messaging.messaging().delegate = self
    
	// NotificationCenter delegate 지정   
	UNUserNotificationCenter.current().delegate = self	
    
	// APNs에게 Device Token 발급 요청
	application.registerForRemoteNotifications()
}

func application(_ application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
     // 발급받은 Device Token 확인
    let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()
    log.debug("deviceToken: \(deviceTokenString)")		
    
    // 발급받은 Device Token을 FCM에 전달
    Messaging.messaging().apnsToken = deviceToken 		
}

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
/*
	전달한 device Token을 통해 발급받은 FCMToken
	해당값을 서버에 전달합니다
*/
	log.debug("fcmToken: \(fcmToken)")					
}

 

 

FCM 공식문서

https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ko 

 

FCM 메시지 정보  |  Firebase Documentation

Join Firebase at Google I/O online May 11-12, 2022. Register now 의견 보내기 FCM 메시지 정보 Firebase 클라우드 메시징(FCM)은 다양한 메시징 옵션과 기능을 제공합니다. 이 페이지의 정보는 다양한 유형의 FCM 메

firebase.google.com

iOS Norification이란?

https://babbab2.tistory.com/58

APNs와 Push Server간에 연결

https://sujinnaljin.medium.com/provider-server%EC%99%80-apns%EC%9D%98-%EC%95%88%EC%A0%84%ED%95%9C-%EC%97%B0%EA%B2%B0%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%91%90%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95-bb82d60ea7c8

 

'iOS' 카테고리의 다른 글

(동기/비동기)와 동시성에 대한 개념  (0) 2021.12.21
CI/CD(feat. Fastlane)  (0) 2021.11.29
Apple 인증서 및 CodeSigning  (0) 2021.11.24