Programming/iOS

[iOS/Swift] FCM 메세지 수신, 포그라운드 앱에서 데이터 메시지 처리하기

devssun 2018. 4. 12. 20:00
728x90
반응형



최근에 프로젝트에 FCM을 도입하였다.

기존에 APNs로 되어있는 것에서 FCM 토큰을 받아 로그인 시 넘겨 푸시서비스를 이용하는데

postman 프로그램 (https://www.getpostman.com) 에서 테스트할 때는 백그라운드, 포그라운드 모두 수신이 잘 되었었고 푸시 메세지 클릭하면 로직대로 잘 이동을 했었다.


그런데 서버 담당자가 만든 프로그램 -> FCM -> 휴대폰 푸시 수신으로 진행할 당시 포그라운드모드로 테스트를 진행하였는데

푸시를 수신해서 클릭하면 화면 링크로 이동을 해야하는데, 그렇지않고 다른 화면으로 이동 후 원래 화면으로 돌아와야 푸시 수신을 알라내고 이동하는 오류가 있었다.


FCM 공식 문서에서 <포그라운드 앱에서 데이터 메시지 처리> 내용을 확인할 수 있는데 일부 내용은 아래와 같다.



앱이 포그라운드 상태일 때 APN이 아닌 FCM에서 데이터 전용 메시지를 직접 수신하려면 FCM 서비스에 연결하고FIRMessagingDelegate messaging:didReceiveMessage:로 메시지를 처리해야 합니다.

연결하려면 AppDelegate에서 shouldEstablishDirectChannel 플래그를 YES로 설정합니다. FCM은 연결을 관리하면서 앱이 백그라운드로 전환되면 연결을 종료하고 앱이 포그라운드로 전환되면 다시 연결합니다.

앱이 포그라운드 상태일 때 데이터 메시지를 수신하려면 messaging:didReceiveMessage:를 구현합니다. 앱이 백그라운드 상태일 때는 이 콜백이 없어도 여전히 데이터 메시지를 수신할 수 있지만 포그라운드 상태일 때는 이 콜백을 처리해야 합니다.



우리는 APN이 아닌 FCM에서 직접 수신할 예정이기 때문에 FCM 서비스에 연결하는 과정이 필요하다.

그래서 위의 문서에 나온대로 AppDelegate에서 shouldEstablishDirectChannel 플래그를 YES로 설정해줄 필요가 있다.

플래그는 MessagingDelegate의 messaging:didReceive remoteMessage에 작성하여준다


이 플래그를 설정하면 포그라운드에서 푸시를 받고, 클릭할 때 원하는 로직대로 바로 움직이게된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
extension AppDelegate : MessagingDelegate {
    // [START refresh_token]
    func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
        print("Firebase registration token: \(fcmToken)")
    }
    // [END refresh_token]
    // [START ios_10_data_message]
    // Receive data messages on iOS 10+ directly from FCM (bypassing APNs) when the app is in the foreground.
    // To enable direct data messages, you can set Messaging.messaging().shouldEstablishDirectChannel to true.
    func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
        print("Received data message: \(remoteMessage.appData)")
        Messaging.messaging().shouldEstablishDirectChannel = true
    }
    
    // [END ios_10_data_message]
}
 
cs



해당 함수 외에 AppDelegate에서 FCM 수신을 위한 로직을 확인하고 싶다면 아래 링크를 확인하면 된다.

현재 Firebase docs와 약간의 차이가 있다.


https://github.com/firebase/quickstart-ios/tree/master/messaging



#FCM데이터수신

#FCM데이터수신포그라운드

반응형