티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

How to handle notification when app in background in Firebase

Firebase에서 앱이 백그라운드에 있을 때 어떻게 알림을 처리하나요?

 문제 내용 

Here is my manifest:

여기가 제 매니페스트입니다:
<service android:name=".fcm.PshycoFirebaseMessagingServices">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

<service android:name=".fcm.PshycoFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

 

When the app is in the background and a notification arrives, then the default notification comes and doesn't run my code of onMessageReceived.

앱이 백그라운드에 있을 때 알림이 도착하면 기본 알림이 표시되고 onMessageReceived 코드가 실행되지 않습니다.

 

Here is my onMessageReceived code. This is invoked if my app is running on the foreground, not when it is running in the background. How can I run this code when the app is in background too?

다음은 onMessageReceived 코드입니다. 이 코드는 앱이 foreground에서 실행될 때 호출되지만, background에서 실행될 때는 호출되지 않습니다. background에서도 이 코드를 실행하는 방법은 무엇인가요?
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // If the application is in the foreground handle both data and notification messages here.
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
    data = remoteMessage.getData();
    String title = remoteMessage.getNotification().getTitle();
    String message = remoteMessage.getNotification().getBody();
    String imageUrl = (String) data.get("image");
    String action = (String) data.get("action");
    Log.i(TAG, "onMessageReceived: title : "+title);
    Log.i(TAG, "onMessageReceived: message : "+message);
    Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
    Log.i(TAG, "onMessageReceived: action : "+action);

    if (imageUrl == null) {
        sendNotification(title,message,action);
    } else {
        new BigPictureNotification(this,title,message,imageUrl,action);
    }
}
// [END receive_message]

 

 

 높은 점수를 받은 Solution 

1. Why is this happening?

1. 왜 이런 일이 발생하는 걸까요?

 

There are two types of messages in FCM (Firebase Cloud Messaging):

FCM(Firebase Cloud Messaging)에는 두 가지 유형의 메시지가 있습니다:

 

  1. Display Messages: These messages trigger the onMessageReceived() callback only when your app is in foreground
  2. Data Messages: Theses messages trigger the onMessageReceived() callback even if your app is in foreground/background/killed
1. 표시 메시지(Display Messages): 이러한 메시지는 앱이 foreground(전면)에 있을 때에만 onMessageReceived() 콜백을 트리거합니다.
2. 데이터 메시지(Data Messages): 이러한 메시지는 앱이 foreground(전면)/background(백그라운드)/killed(종료) 상태일 때에도 onMessageReceived() 콜백을 트리거합니다.

 

NOTE: Firebase team have not developed a UI to send data-messages to your devices, yet. You should use your server for sending this type!

참고: Firebase 팀은 아직 기기에 데이터 메시지를 보내는 데 사용할 수 있는 UI를 개발하지 않았습니다. 이 유형의 메시지를 보내려면 서버를 사용해야합니다!

 



2. How to?

2. 어떻게 하면 될까요?

 

To achieve this, you have to perform a POST request to the following URL:

이를 위해 다음 URL로 POST 요청을 수행해야 합니다:

 

POST https://fcm.googleapis.com/fcm/send

 

Headers

Headers (헤더)

 

  • Key: Content-Type, Value: application/json
  • Key: Authorization, Value: key=<your-server-key>
헤더:
키: Content-Type, 값: application/json
키: Authorization, 값: key=<당신의-서버-키>

 

Body using topics

주제를 사용하는 경우 바디
{
    "to": "/topics/my_topic",
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     }
}

 

Or if you want to send it to specific devices

또는 특정 기기에 보내고 싶다면
{
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     },
    "registration_ids": ["{device-token}","{device2-token}","{device3-token}"]
}

 

NOTE: Be sure you're not adding JSON key notification
NOTE: To get your server key, you can find it in the firebase console: Your project -> settings -> Project settings -> Cloud messaging -> Server Key

참고: JSON 키 알림(notification)을 추가하지 않도록 주의하세요.
참고: 서버 키를 얻으려면 firebase 콘솔에서 찾을 수 있습니다: 프로젝트 -> 설정 -> 프로젝트 설정 -> Cloud messaging -> 서버 키

 

3. How to handle the push notification message?

푸시 알림 메시지를 처리하는 방법은 다음과 같습니다.

 

This is how you handle the received message:

다음은 수신된 메시지를 처리하는 방법입니다:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String myCustomKey = data.get("my_custom_key");

     // Manage data
}

 

 

 가장 최근 달린 Solution 

To be able to retrieve data from firebase notification sent when app is in background, you need to add click_action entry in your notification data set.

앱이 백그라운드에 있는 경우 firebase 알림에서 데이터를 검색하려면, 알림 데이터 세트에 click_action 항목을 추가해야합니다.

 

Set additional options of your notification in firebase console like this: (you have to include any extra data that you want to retrieve in your app here):

파이어베이스 콘솔에서 다음과 같이 알림의 추가 옵션을 설정하십시오. (여기에서 앱에서 검색하려는 추가 데이터를 포함해야합니다.):

add click_action to firebase notification

 

And include the intent filter in your manifest file under the activity to be launched

그리고 액티비티 하단에 매니페스트 파일에 인텐트 필터를 포함시켜야 합니다.
messaging.onBackgroundmessage((payload)=>{
    console.log("background message detected!!");
    console.log("message : ", payload);
})

 

Then get the bundle data in your activity onNewIntent:

그런 다음 onNewIntent에서 bundle 데이터를 가져옵니다.
{
    "notification": {
        "title": "Hey there",
        "body": "Subscribe to AMAL MOHAN N youtube channel"
    },
    "to": "your-browser-token",
    "data": {
        "value1": "text",
        "value2": "",
        "value3": "sample3",
        "value4": "sample4"
    }
}

 

When your app is in foreground, you can set your onMessageReceived like this:

앱이 foreground에서 실행될 때는 onMessageReceived를 다음과 같이 설정할 수 있습니다.
{
    "to": "your-browser-token",
    "data": {
            "value1": "text",
            "value2": "",
            "value3": "sample3",
            "value4": "sample4"
          }
}

 

 

출처 : https://stackoverflow.com/questions/37711082/how-to-handle-notification-when-app-in-background-in-firebase

반응형
댓글
공지사항
최근에 올라온 글