반응형

이번 포스팅에서는 Firebase를 이용한 Push 처리 시 발생되는 Background 이슈에 대해 기술한다.



Foreground? Background?


Firebase를 이용한 Push처리시에 대부분이 콘솔 혹은 포스트맨을 통해 간략한 테스트 후 앱에서 정상수신이 되는 것을 보고 마무리 하는 경우가 많다.


만약 여기까지 성공했다면, 적어도 Foreground에선 정상적으로 처리되고 있다고 생각하면 된다.


문제는 Background에서 발생된다.


일반적으로 FCM은 SDK 내 에서 이벤트를 받아서 FirebaseMessagingService를 통해 사용자에게 제공되는 형태이다.


여기서 작은 이슈가 발생하는데, 앱이 Background 상태에 있는 경우(앱 자체가 시작되지 않았거나, 앱이 메모리에서 내려간 경우) SDK에서 전달받은 데이터에 키를 캐치하여 'Notification'키가 있는 경우,

SDK 내 에서 처리하고 우리가 흔히 아는 onMessageReceived로 제공하지 않는다.


다시 말해, Push를 통해 어떤 데이터를 수신하여 그 데이터를 이용하여 어떤 액션이 필요한 경우, Background에서 수신된 Push 정보를 클릭 시 개발자가 의도한 액션이 처리되지 않을 수 있다.


정리하면, 사용자는 앱이 Background 상태에 있을 때는 앱을 실행시키는 액션 이외에 푸시에서 넘어오는 데이터 처리가 사실상 불가하다고 보면 된다.



그럼 어떻게 해야할까?

위의 이슈를 처리하기 위해 여러분은 작은 작업을 해줘야한다.

작은 작업이란 서버 또는 콘솔에서 전달되는 데이터에 'Notification'키로 설정되는 데이터가 없거나, 'Notification'키 내에 Intent 필터를 걸어줄 수 있는 액션을 함께 내려주면, 사용자는 Push를 통해 전달되는 데이터 처리가 가능하다.


Notification 키가 포함되어 내려오는 경우

Notification 키가 있는 푸시 데이터
{
  "registration_ids" : ["단말 토큰 키"],
    "notification" : { // 해당 키에 처리할 데이터를 넘겨준다.
      "title" "타이틀"
      "body" "바디"
    },
    "data" : {
        "timestamp":1539936478695
    }
}


Notification 키가 없이 내려오는 경우

Notification 키가 없는 푸시 데이터
{
  // Notification 필드가 없으면 data를 정상적으로 넘겨준다.
  "registration_ids" : ["단말 토큰 키"],
  "data" : {       
        "title" "타이틀"
        "body" "바디"
        "timestamp":1539936478695
    }
}



Intent 처리 방법


Intent 처리 방법의 경우, Notification 내 click_action필드를 함께 주어서, Push 클릭 시 진입되는 Activity에서 데이터를 꺼내쓰는 방법이다.


Intent 필터 처리 방법
{
  "registration_ids" : ["단말 토큰 키"],
    "notification" : {
      "title" "타이틀"
      "body" "바디"
      "click_action" ".MainActivity"
    },
    "data" : {
        "timestamp":1539936478695
    }
}


<activity android:name=".MainActivity">
<intent-filter>
<action android:name=".MainActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>



public class MainActivity {

@Override
protected void init() {
initView();
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//get notification data info
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
//bundle must contain all info sent in "data" field of the notification
}
}

private void initView() {
}
}



이번 포스팅에서는 Push 처리 시 Background 상태에서 발생되는 이슈와 그 대응방법에 대해 기술하였다. 본 블로그를 방문하는 모든 분들이 많은 도움이 되었길 바라며 본 포스팅을 마친다.



반응형

+ Recent posts