푸시 알림 데이터 이용

푸시 알림 메시지가 수신되거나 사용자에 의해 탭될 때 호출되는 메쏘드와 해당 상황에서 데이터를 추출하여 이용하는 방법에 대해 안내합니다.

앱이 포그라운드 상태일 때 화면에 알림 메시지가 보여지도록 구현하지 않은 이상 화면에 배너 형태로 알림 메시지가 보이지 않습니다.

앱이 포그라운드 상태인데 화면에 배너 형태로 알림 메시지가 보인다면 이미 고객님께서 알림 메시지가 보여지도록 구현한 것입니다. 이 경우, 해당 구현부분 상단에 아래의 내용을 참조하여 수정해주셔야 합니다.

알림 메시지가 보이지 않거나 Delegation 메쏘드가 구현되지 않은 경우에는 아래 내용 참고하셔서 해당 메쏘드를 추가하여 데이터를 추출할 수 있습니다.

딥링크 데이터 이용시 주의사항

딥링크 데이터를 이용할 때 아래와 같은 점에 유의해주세요.

  1. 앱이 Foreground상태일 때 딥링크 URL로 화면이 바로 이동하면 이용자가 당황스러울 수 있습니다. 이에 대해 기획단계부터 어떻게 할 것인지 고민해주세요. 보통은 로컬 노티피케이션을 한 번 더 띄우기도 합니다.

  2. 앱의 세 가지 상태 (Foreground, Background, Killed)에 따라 작동 매카니즘이 다릅니다. 간혹, 저희가 제시하는 메쏘드 호출이 되지 않는 경우에는 MainActivity의 onNewIntent() 메쏘드 구현부로 호출될 수 있습니다.

위에서 딥링크와 관련해서 안내드렸는데요, 푸시를 통해 전달되는 데이터를 이용하는 것에 모두 해당되는 내용입니다.

앱이 포그라운드 상태일 때

FirebaseMessagingService를 상속받아 구현한 FcmService 의 "onMessageReceived" 메쏘드가 호출됩니다.

// FirebaseMessagingService를 상속받아 구현한 FcmService
public class FcmService extends FirebaseMessagingService {
    // =======================================================
    // Start : Push 토큰 수집
    // =======================================================
    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        // call Wisetracker API
        DOT.setPushToken(token);
    }
    // =======================================================
    // End : Push 토큰 수집
    // =======================================================
    
    // =======================================================
    // Start : Push 메시지 수신
    // =======================================================
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {    
        super.onMessageReceived(remoteMessage);    
        // call Wisetracker API    
        DOT.setPushClick(getApplicationContext(), remoteMessage.toIntent());
        
        // =======================================================
        // Start : 필요한 데이터 추출하기 <-- 새로 추가된 부분
        // =======================================================
        Map<String, String> rootDict = remoteMessage.getData();
        String jsonDict = rootDict.get("RW_push_payload_WP");
        Log.d("PUSH", "jsonDict : " + jsonDict);
        // =================
        // intent 로부터 와이즈트래커를 통해 발송된 푸시 알림 메시지내부의 데이터를
        // 추출하는 방법을 예시로 들었습니다.
        // 여기서는 Gson 라이브러리를 사용했는데요,
        // 고객님이 사용하시는 JSON 라이브러리를 사용하시면 됩니다.
        // =================
        Map dict = new Gson().fromJson(bundle.getString("RW_push_payload_WP"), Map.class);
        if (dict != null) {
          String title = (String) dict.get("RW_push_payload_TT");
          String body = (String) dict.get("RW_push_payload_BD");
          String deepLink = (String) dict.get("RW_push_payload_deeplink");
          // =================
          // 여기에서 필요한 데이터를 추출했습니다.
          // 필요한 용도에 맞게 사용하시면 됩니다.
          // ex: deepLink 데이터를 이용하여 화면전환을 하실 수 있어요.
          // =================
          Log.d("PUSH", "title: " + title + ", body: " + body + ", deepLink: " + deepLink);
        } else {
          Log.d("PUSH", "dictionary was NULL, intent.getData(): " + intent.getData() + ", intent.getExtras(): " + intent.getExtras());
        }
        // =======================================================
        // End : 필요한 데이터 추출하기
        // =======================================================
    }
    // =======================================================
    // End : Push 메시지 수신
    // =======================================================
}

jsonDict 에 포함된 데이터 Key/Value

jsonDict 는 일반 문자열입니다. 해당 문자열은 JSON 형식으로 되어있으니 사용하시는 JSON Parser를 이용하여 JSON 객체로 전환하여 사용해주세요.

  • 최상위 객체의 구조

최상위 Payload 키Payload 값필수여부

RW_push_payload_WP

Sub객체 (아래 Sub객체 참조)

필수

  • Sub객체의 구조

Payload 키Payload 값필수여부

RW_push_payload_TT

메시지 타이틀

필수

RW_push_payload_BD

메시지 내용

필수

RW_push_payload_IM

이미지 URL

X

RW_push_payload_MV

유튜브 동영상 URL

X

RW_push_payload_deeplink

딥링크 URL

X

앱이 백그라운드 상태일 때

앱이 백그라운드이거나 Killed 된 상태인 경우, 위의 메쏘드가 호출되지 않습니다.

알림 메시지는 앱이 백그라운드 상태에서 알림 표시줄에 배너 형태 등으로 표시됩니다. 해당 알림 메시지를 탭하면 아래와 같은 메쏘드가 호출됩니다. 해당 메쏘드에서 데이터를 추출하여 사용합니다.

"AndroidManifest.xml" 에 아래와 같이 "" 설정된 activity의 "onCreate()" 가 실행됩니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.support.wisetracker">

  <application
      ...>
    ...
    <activity
        android:name=".MainActivity"
        android:exported="true"
        android:screenOrientation="fullSensor"
        android:theme="@style/Theme.SdkSample.NoActionBar">
      <!--
        // =======================================================
        // 아래와 같은 "intent-filter"가 적용된 activity가 Main입니다.
        // =======================================================
      -->
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    ...
  </application>

</manifest>

주로 "MainActivity.java" 가 될 것입니다.

public class MainActivity extends AppCompatActivity {
  ...
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    // =======================================================
    // 이 내용은 Wisetracker 기본 SDK가 이미 적용된 경우에는 새로 적용할
    // 필요가 없습니다.  메시징 서비스만 이용하는 경우 참조해주세요.
    // =======================================================
    // SDK 호출
    DOT.initialization(this);

    // =======================================================
    // Start : Push 메시지 수신을 위한 설정
    // =======================================================
    FirebaseMessaging.getInstance().getToken()
        .addOnCompleteListener(new OnCompleteListener<String>() {
          @Override
          public void onComplete(@NonNull Task<String> task) {
            if (!task.isSuccessful()) {
              Log.w("FCM", "Fetching FCM registration token failed", task.getException());
              return;
            }
            // Get new FCM registration token
            String token = task.getResult();
            // 푸시 토큰 서버 전송
            DOT.setPushToken(token);
          }
        });
    // =======================================================
    // End : Push 메시지 수신을 위한 설정
    // =======================================================

    // =======================================================
    // Start : Push 메시지 클릭 처리
    // =======================================================
    DOT.setPushClick(this, getIntent());
    // =======================================================
    // End : Push 메시지 클릭 처리
    // =======================================================
   
    // =======================================================
    // Start : Push 메시지 데이터 추출 및 이용 <-- 새로 추가된 부분
    // =======================================================
    Intent intent = getIntent();
    if (intent != null) {
      Bundle bundle = intent.getExtras();
      if (bundle != null) {
        // =================
        // intent 로부터 와이즈트래커를 통해 발송된 푸시 알림 메시지내부의 데이터를
        // 추출하는 방법을 예시로 들었습니다.
        // 여기서는 Gson 라이브러리를 사용했는데요,
        // 고객님이 사용하시는 JSON 라이브러리를 사용하시면 됩니다.
        // =================
        Map dict = new Gson().fromJson(bundle.getString("RW_push_payload_WP"), Map.class);
        if (dict != null) {
          String title = (String) dict.get("RW_push_payload_TT");
          String body = (String) dict.get("RW_push_payload_BD");
          String deepLink = (String) dict.get("RW_push_payload_deeplink");
          // =================
          // 여기에서 필요한 데이터를 추출했습니다.
          // 필요한 용도에 맞게 사용하시면 됩니다.
          // ex: deepLink 데이터를 이용하여 화면전환을 하실 수 있어요.
          // =================
          Log.d("PUSH", "title: " + title + ", body: " + body + ", deepLink: " + deepLink);
        } else {
          Log.d("PUSH", "dictionary was NULL, intent.getData(): " + intent.getData() + ", intent.getExtras(): " + intent.getExtras());
        }
      } else {
        Log.d("PUSH", "bundle was NULL");
      }
    } else {
      Log.d("PUSH", "intent was NULL");
    }
    // =======================================================
    // End : Push 메시지 데이터 추출 및 이용
    // =======================================================
    ...
  }
  ...
  
  // =======================================================
  // Start : Push 메시지 클릭 처리
  // =======================================================
  @Override
  protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // 푸시 메시지를 클릭할 때의 처리
    DOT.setPushClick(this, intent);
    ...
  }
  // =======================================================
  // End : Push 메시지 클릭 처리
  // =======================================================
  ...
}

앱을 구현하는 과정에서 설정/구현상의 이유로 위의 onNewIntent() 메쏘드에서 푸시 데이터를 꺼내야 할 수도 있습니다. 이는 테스트를 통해 onCreate() 메쏘드에서 처리해야 할지 아니면 onNewIntent() 메쏘드에서 처리해야 할지 판단해야 합니다.

Last updated