Android 개발가이드
Morpheus Push는 스마트폰 OS에서 지원하는 PNS(Push Notification Server)를 기반으로 한 메시지 전송 플랫폼이다. Android Client 에서는 UPMC WAS 에서 제공하는 Push API 를 각각 버전 규격에 맞춰 연동하여 원활하게 Push Service 를 운영하기 위한 라이브러리를 제공한다.
Android 개발 샘플은 https://total-msg-hub.github.io/push-android-sample/ 를 참조하시기 바랍니다.
FCM
- Firebase Cloud Messaging 의 줄임말
- Firebase Cloud Messaging 은 무료로 메시지를 안정적으로 전송할 수 있는 교차 플랫폼 메시징 솔루션
- https://firebase.google.com/docs/cloud-messaging/?hl=ko
UPMC
- Uracle Push Message Center 의 줄임말
- WAS(Web Application Server)에 배포되며, HTTP 또는 XMPP 프로토콜을 이용하여 Android FCM 서버와 Server 대 Server 로 연계하여 구동하는 서버 애플리케이션
- Receiver 라고도 불림
Service 등록
- FCM으로부터 Token 을 할당 받고, UPMC로 Push 서비스를 사용하겠다고 등록하는 절차
Service 해제
- UPMC 로 Push 서비스를 사용하지 않겠다고 등록을 삭제하는 절차
User 등록
- UPMC 로 Push 서비스에 대한 사용자를 등록 또는 변경하는 절차
ServiceAndUser 등록
- UPMC 로 Push 서비스 등록 및 사용자를 등록을 동시에 진행하는 절차
수신 확인
- 통계를 위해 메시지를 수신 후 UPMC 로 ack를 주는 절차
읽음 확인
- 통계를 위해, 사용자가 App에서 메시지를 읽었을 때 UPMC 로 ack를 주는 절차
Project ID
- Push 서비스 이용을 위해 Console에서 발급받은 ID
Client ID
- 사용자로 등록 할 Client 의 고유한 ID (CUID 라고도 함)
- 제약은 없으며, 일반적으로 Email, User ID, Phone Number 또는 Device-UUID 등을 CUID 로 사용함
Client Name
- 사용자로 등록할 Client 의 이름 (CNAME 라고도 함)
- 사용자의 이름이나 Nickname 또는 Device Name 을 CNAME 으로 사용
PSID
- Push Service ID 의 줄임말
- Push 서비스에 대한 고유 ID
- FCM에서 할당 받은 Device Token을 사용
Package Name
- Google play에서 안드로이드 앱을 구별하기 위한 unique 값으로, AndoridManifest.xml 에 선언한다.
Firebase Console 접속
섹션 제목: “Firebase Console 접속”https://console.firebase.google.com/ 을 입력하거나, Go to Console 을 클릭한다.

프로젝트 추가
섹션 제목: “프로젝트 추가”프로젝트 추가 메뉴를 클릭한다.

프로젝트 이름 지정
섹션 제목: “프로젝트 이름 지정”- 새로운 프로젝트 생성을 하려면 1번 프로젝트 이름 입력 부분을 클릭하여, 프로젝트 이름을 입력한다.
- 기존에 구성된 프로젝트를 이용하려면, 2번 리스트에 나타나는 프로젝트를 선택한다.

프로젝트 만들기
섹션 제목: “프로젝트 만들기”- 프로젝트명을 입력하고, 계속을 클릭한다.
- 이미지상 프로젝트명은 예시이므로, 사용하고자 하는 프로젝트명을 입력한다.

유의 사항 확인
섹션 제목: “유의 사항 확인”- Firebase를 추가할 때 유의할 사항들에 대해 검토한 후, 계속을 클릭한다.

애널리틱스 사용 여부
섹션 제목: “애널리틱스 사용 여부”- 애널리틱스 사용여부에 대해 설정 후, 계속을 클릭한다.
- 애널리틱스는 무료로 이용할 수 있다.

애널리틱스 구성
섹션 제목: “애널리틱스 구성”- 3.6. 애널리틱스 사용을 선택한 경우 나타나는 화면이며, 애널리틱스 계정을 선택하거나 만든 후, Firebase 추가를 클릭한다.

프로젝트 생성 중
섹션 제목: “프로젝트 생성 중”- 3.7 에서 Firebase 추가 시 나타나는 화면이며, “새 프로젝트가 준비되었습니다.” 라는 문구가 표시될 때까지 대기한다.

프로젝트 생성 완료
섹션 제목: “프로젝트 생성 완료”- 프로젝트 생성 완료 화면이며, 계속을 클릭한다.

앱에 Firebase 추가
섹션 제목: “앱에 Firebase 추가”- 안드로이드 앱에 FCM 을 연동하기 위해, 안드로이드 아이콘을 클릭한다.

앱에 Firebase 추가를 위한 정보 입력
섹션 제목: “앱에 Firebase 추가를 위한 정보 입력”- 1번 항목에 패키지 명을 입력한다.
- 화면에 나타나는 정보는 예시이며, 서비스 하고자 하는 앱의 page name 을 입력한다.
- 2번 항목에 앱에 대한 nick name 을 입력한다.
- nick name 은 Firebase console 에서 서비스 중인 앱의 명칭을 쉽게 확인 하기 위한 용도이다.

google-service.json 다운로드
섹션 제목: “google-service.json 다운로드”- 앱 등록이 완료되면, google-service.json 파일이 생성된다.
- google-service.json 파일은 FCM 연동시 필요하므로, 다운로드 받아 저장해 놓는다.
- 참고로, google-service.json 파일은 다른 화면에서도 다운로드가 가능하다.

build.gradle (프로젝트 수준) SDK 설정 정보
섹션 제목: “build.gradle (프로젝트 수준) SDK 설정 정보”- 프로젝트 수준의 build.gradle 에 포함해야 할 정보로, 복사하기 버튼을 클릭하여 복사한다.
- 추후, 일괄 처리를 위해, NotePad 와 같은 프로그램을 이용하여, 복사한 정보를 저장해 놓는다.

build.gradle (앱 수준) SDK 설정 정보
섹션 제목: “build.gradle (앱 수준) SDK 설정 정보”- 앱 모듈 수준의 build.gradle 에 포함해야 할 정보로, 복사하기 버튼을 클릭하여 복사한다.
- 1, 2 번 모두 복사하여, 저장해 놓는다.

앱 설치 확인
섹션 제목: “앱 설치 확인”- 앱을 실행하여, 정상적인 적용 상태를 확인하는 화면으로, 앱이 구성되지 않았으므로 이 단계 건너뛰기를 클릭하여 다음 화면으로 이동한다.

설정 메뉴 이동
섹션 제목: “설정 메뉴 이동”- 설정 정보를 확인하기 위해, 앱 (안드로이드 아이콘)이나 더 보기 아이콘 등을 선택한다.

설정 메뉴 클릭
섹션 제목: “설정 메뉴 클릭”- 설정 정보를 확인하기 위해, 설정 아이콘을 선택한다.

설정 화면
섹션 제목: “설정 화면”-
Firebase Cloud Messaging API(V1) 사용 설정이 되어 있는지 확인하기 위해 클라우드 메시징 탭을 클릭한다.

-
사용 중지됨일 경우
더보기(⋮)메뉴를 통해 API 콘솔에 접속하여사용으로 상태를 변경한다
프로젝트 설정 > 서비스 계정으로 이동하여 새 비공개 키 생성

정상적으로 발급이 완료되었다면 아래와 같은 형식의 JSON 파일이 다운로드 된다.

FCM HTTP v1 프로토콜 변경 상세 가이드 문서: https://wiki.uracle.co.kr/push/server/fcm/httpv1-guide
안드로이드 프로젝트 생성 따라하기
섹션 제목: “안드로이드 프로젝트 생성 따라하기”안드로이드 프로젝트를 생성하는 가이드로, ‘4.1. 생성 ~ 4.3. package name / 프로젝트명 입력’으로 구성된다.
- Start a new Android Studio

템플릿 선택
섹션 제목: “템플릿 선택”- 사용하고자 하는 템플릿을 선택한다.

package name / 프로젝트명 입력
섹션 제목: “package name / 프로젝트명 입력”- 1번: 프로젝트 명을 입력한다.
- 2번: 사용하고자 하는 page name 입력한다. (domain 형식, 소문자)
- 3번: 프로젝트 저장 위치를 지정한다.
- 4번: 프로젝트 생성을 완료 한다.

FCM 라이브러리 설정 따라하기
섹션 제목: “FCM 라이브러리 설정 따라하기”FCM 사용을 위한 라이브러리 및 gradle 환경설정에 대한 가이드로, ‘5.1. google-service.json 적용 ~ 5.7. 프로젝트 동기화 상태 확인’으로 구성된다.
google-sevice.json 적용
섹션 제목: “google-sevice.json 적용”-
Firebase console 을 통해, 다운로드 받은 google-service.json 파일위치로 이동

-
생성한 안드로이드 프로젝트의 app module 에 google-service.json 파일을 복사
View 를 Project 로 변환
섹션 제목: “View 를 Project 로 변환”- ProjectViews 에서 Group Tab 을 클릭하여, Project 선택

google-service.json 적용 상태 체크
섹션 제목: “google-service.json 적용 상태 체크”- app module 하위에 google-service.json 파일이 적용되어 있는지 확인

프로젝트 단위 build.gradle 적용
섹션 제목: “프로젝트 단위 build.gradle 적용”- 1번: 프로젝트 단위의 build.gradle 파일을 연다.
- 2번: buildscript 에 dependencies 부분에, classpath 적용
classpath 'com.google.gms:google-services:4.3.3'
- Sample
buildscript { repositories { google() jcenter() } dependencies { classpath "com.android.tools.build:gradle:4.0.1" classpath 'com.google.gms:google-services:4.3.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}
allprojects { repositories { google() jcenter() }}
task clean(type: Delete) { delete rootProject.buildDir}app module 단위 build.gradle 적용
섹션 제목: “app module 단위 build.gradle 적용”- 1번: app module 단위의 build.gradle 파일을 연다.
- 2번: dependencies에 라이브러리를 적용한다.
// Add the SDK for Firebase Cloud Messagingimplementation 'com.google.firebase:firebase-messaging:20.2.1'
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'implementation 'com.google.code.gson:gson:2.8.5'implementation 'com.firebase:firebase-jobdispatcher:0.8.5'- 3번: google-services plugin 적용
apply plugin: 'com.google.gms.google-services'
- Sample
apply plugin: 'com.android.application'
android { compileSdkVersion 29 buildToolsVersion "29.0.3"
defaultConfig { applicationId "com.push.cloud" minSdkVersion 16 targetSdkVersion 29 versionCode 1 versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }}
dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.navigation:navigation-fragment:2.1.0' implementation 'androidx.navigation:navigation-ui:2.1.0'
// Add the SDK for Firebase Cloud Messaging implementation 'com.google.firebase:firebase-messaging:20.2.1'
//샘플 프로젝트를 위한 image loader libray implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.firebase:firebase-jobdispatcher:0.8.5'
testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
apply plugin: 'com.google.gms.google-services'gradle sync
섹션 제목: “gradle sync”- build.gradle 파일을 수정하면, 항상 동기화 작업을 진행해야 한다.
- 1번: 메뉴바에 있는 Sync Project With Gragle File 아이콘을 통해 동기화 할 수 있다.
- 2번: 또는 gradle 파일이 수정되면 나타나는 ‘Sync Now’ 기능을 통해 동기화 할 수 있다.
- 1 또는 2번을 이용하여, 동기화를 진행한다.

프로젝트 동기화 상태 확인
섹션 제목: “프로젝트 동기화 상태 확인”- 아래 3 가지 정보가 일치해야, 셋팅이 정상적으로 된 것으로 판단할 수 있다.
- 1번: build.gradle 파일 위치 점검
- 2번: Run ‘app’ 버튼이 활성화
- 3번: Build console 에서, ‘CONFIGURE SUCCESSFUL’ 문구 확인

PUSH SDK 및 Manifest.xml 설정
섹션 제목: “PUSH SDK 및 Manifest.xml 설정”라이브러리 적용
섹션 제목: “라이브러리 적용”- app > libs 폴더에 아래 라이브러리를 적용한다.
가. morpheus_push_library_fcm_xxx.jar나. mqtt-android-push_xxx.jar
assets 폴더 및 Manifest.xml 파일 생성
섹션 제목: “assets 폴더 및 Manifest.xml 파일 생성”-
assets 폴더를 생성한다.
-
assets 폴더는 app > src > main > assets 위치한다.

-
Manifest.xml 파일은 app > src > main > assets > res > Manifest.xml 에 위치 한다.

Manifest.xml 설정
섹션 제목: “Manifest.xml 설정”- PUSH SDK에서 사용하기 위한 Manifest.xml을 생성한다. (AndroidManfiest.xml 과는 다른 파일임)
- 3.19. Sender ID 확인 을 통해, 획득한 sender id 확인한다.
- PROJECT ID 를 확인하다.
- 적용 순서
가. Cloud Console 에서 발급받은 app id를 `<app-id> </app-id>`에 입력나. 접속할 서버 정보를 `<server> </server>` 에 입력다. Firebase Console 에서 획득한 발신자 id (sender id) 를 `<fcm-sender-id> </fcm-sender-id>` 에 입력한다.라. log 와 file log 는 필요시 수정한다.- Manifest.xml 예시
<?xml version="1.0" encoding="UTF-8"?><settings> <push> <receiver>
<app-id>123456589</app-id> <log>y</log> <file-loy>y</file-loy>
<!-- UPMC 서버 버전 5.0--> <version>5.0</version>
<!--UPMC 서버 URL : 아래 도메인 정보 fixed --> <server>https://upmc.msghub.uplus.co.kr/upmc</server>
<!-- 타임아웃 시간 --> <timeout>20000</timeout>
<!-- firebase console 에서 획득한 발신자 id -->
<fcm-sender-id>123456789101</fcm-sender-id>
<!-- fixed --> <android-push-type>FCM</android-push-type>
<!-- 브로드캐스트 리시버에서 퍼미션 사용 여부를 설정 (Y) : fixed --> <use-permission>Y</use-permission> </receiver> </push></settings>app-id 는MsgHub Console 에서 발급받은 PROJECT ID 를 통해, 확인 할 수 있다.
file log를 활성화 하는 경우 파일 위치: 메인저장소 > Android > data > [page name] > log > pushlog.log
- settings.push.receiver 에 대한 설정값
| Key | Type | Description |
|---|---|---|
| app-id | String | MsgHub console에서 생성한 앱 식별자 |
| log | String | Push Service 에 대한 Debugging 로그 출력 여부 ( y / n ) |
| file-log | String | 파일로 로그 출력 여부 ( y / n ) |
| version | String | UPMC Version (5.0 – 고정 값) |
| server | String | UPMC WAS 서버 URL (고장 값) |
| fcm-sender-id | String | Firebase console에서 획득한 발송자 id |
| android-push-type | String | FCM (고정 값) |
| use-permission | String | Broadcast 퍼미션 사용 여주 (Y – 고정 값. 필수) |
receiver package 생성
섹션 제목: “receiver package 생성”- 푸시 수신을 위한 receiver 용 package를 생성한다.

MessageArrivedReceiver.java class 생성
섹션 제목: “MessageArrivedReceiver.java class 생성”- 푸시를 받을 MessageArrivedReceiver class를 생성한다.


-
MessageArrivedReceiver 는 BroadcastReceiver를 상속받아 생성한다.

-
MessageArrivedReceiver 예시
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import com.uracle.push.test.helper.PushNotifyHelper;import org.json.JSONObject;import m.client.push.library.common.Logger;import m.client.push.library.common.PushConstants;
public class MessageArrivedReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(context.getPackageName() + PushConstants.ACTION_GCM_MESSAGE_ARRIVED)) { try {
// 수신된 payload data 는 아래 3가지 방식으로 획득 할 수 있다. String data = intent.getExtras().getString(PushConstants.KEY_JSON); String rawData = intent.getExtras().getString(PushConstants.KEY_ORIGINAL_PAYLOAD_STRING); byte[] rawDataBytes = intent.getExtras().getByteArray(PushConstants.KEY_ORIGINAL_PAYLOAD_BYTES);
Logger.i(new JSONObject(data).toString(2)); Logger.i("received raw data : " + rawData); Logger.i("received bytes data : " + new String(rawDataBytes, "utf-8")); // 노티피케이션 생성 PushNotifyHelper.showNotification(context, new JSONObject(data));
} catch (Exception e) { e.printStackTrace(); } } }}AndroidManifest.xml 설정
섹션 제목: “AndroidManifest.xml 설정”- 푸시를 위한 서비스 등록 및 메시지 수신을 위한 설정을 한다.
가. service 등록 : FCMIntentService나. receiver 등록 : MessageArrivedReceiver, FcmActionReceiver다. permission 등록 : ${applicationId}.permission.MPUSH_PERMISSION라. uses-permission 등록 : ${applicationId}.permission.MPUSH_PERMISSION, android.permission.WAKE_LOCK
- AndroidManifest.xml 예시
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.push.cloud">
<application android:requestLegacyExternalStorage="true" android:allowBackup="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true"> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
<!-- =================== PUSH SERVICE SETTINGS START============= --> <!-- FirebaseMessagingService 를 상속받아 구현 됨 --> <service android:name="m.client.push.library.service.FCMIntentService" android:exported="false" tools:ignore="Instantiatable"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
<!-- 푸시 payload data 수신 class --> <receiver android:name=".receiver.MessageArrivedReceiver"> <intent-filter> <action android:name="${applicationId}.GCM_MESSAGE_ARRIVED" /> </intent-filter> </receiver>
<!-- UPMC 서비스 등록 / 해제 등을 위한 class --> <receiver android:name="m.client.push.library.receiver.FcmActionReceiver"> <intent-filter> <action android:name="${applicationId}.ACTION_GCM" /> </intent-filter> </receiver> </application>
<!-- 푸시 BroadCast 수신 권한 용 Permission --> <permission android:name="${applicationId}.permission.MPUSH_PERMISSION" android:protectionLevel="signature" /> <uses-permission android:name="${applicationId}.permission.MPUSH_PERMISSION" />
<!-- 푸시 수신 후, screen on 을 위한 permission--> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- =================== PUSH SERVICE SETTINGS END ============= -->
</manifest>- 디바이스 개발자 옵션 활성화 를 진행한다.
- PC와 디바이스를 USB로 연결한다.
- 빌드할 디바이스를 선택하고, 활성화된 Run 버튼을 이용하여, Build 를 실행한다.

로그 보기
섹션 제목: “로그 보기”- Android Studio 하단에 Logcat 탭을 선택한다.
- Manifest.xml 의 log 를 y로 설정한다.
- 빌드를 통해, 앱을 실행한다.
- 1번: 로그를 보고자 하는 Device, package name 을 선택하고, log level 을 설정한다.
- 2번: Show only selected applicatoin 을 선택하면, 선택한 package name 에 해당하는 앱의 로그만 볼 수 있다.
- 3번: 디바이스에서 출력하는 로그를 확인 할 수 있다.

API 적용
섹션 제목: “API 적용”앱에서 푸시 메시지를 수신하기 위해서는 먼저 앱에서 푸시를 수신한 사용자 정보를 등록해야 한다. 이렇게 푸시 사용자로 등록되면 푸시 메시지 수신이 가능하며, 앱에서는 수신된 메시지가 적절하게 처리될 수 있도록 구현 작업이 필요하다.
Push APIs
섹션 제목: “Push APIs”- Register Service and User
PushManager.getInstance().registerServiceAndUser(Context context, String cuid, String cname);- Client ID 와 Client Name 으로 User 등록
- 사용자 등록이 성공한 이후 푸시 메시지 수신이 가능하다.
- tkdyd
Parameters
- context (Context) – 현재 Context
- cuid (String) – Client ID 값 (사용가능 문자: 알파벳, 숫자)
- cname (String) – Client Name 값
Result
- Receiver 를 통해 처리 결과 통보
PushManager.getInstance().registerServiceAndUser(Context context, JSONObject params);- Client ID 와 Client Name 으로 User 등록
- 사용자 등록이 성공한 이후 푸시 메시지 수신이 가능하다.
- Device ID를 custom 등록 시 사용 가능
Parameters
- context (Context) – 현재 Context
- params (JSONObject) – 아래 표 참조
<JSONObject key 값에 대한 설명>
| Key | Type | Necessary | Description |
|---|---|---|---|
| PushConstants.KEY_CUID | String | 필수 | Client ID |
| PushConstants.KEY_CNAME | String | 필수 | Client Name |
| PushConstants.KEY_DEVICE_ID | String | 선택 | Device ID |
Result
- Receiver 를 통해 처리 결과 통보
- Unregister Service
PushManager.getInstance().unregisterPushService(Context context);- 푸시 서비스를 해제한다.
- 푸시 서비스가 해제되면 푸시 메시지 수신이 불가능하다.
Parameters
- context (Context) – 현재 Context
Result
- Receiver 를 통해 처리 결과 통보
- Receive Push Message
PushManager.getInstance().pushMessageReceiveConfirm(Context context, String notification);- 통계를 위한 API
- 푸시 메시지 수신 시 수신이 확인된 상태임을 서버에 전송한다.
Parameters
- context (Context) – 현재 Context
- notification (String) – 수신한 push message(JSONObject의 string값)
- Read Push Message
PushManager.getInstance().pushMessageReadConfirm (Context context, String notification);- 통계를 위한 API
- 사용자가 푸시 메시지를 읽은 경우, 메시지를 읽은 상태임을 서버에 전송한다.
Parameters
- context (Context) – 현재 Context
- notification (String) – 수신한 push message(JSONObject의 string값)
Push APIs 키값 정의
섹션 제목: “Push APIs 키값 정의”- API 호출에 따른 결과값 (BroadCastReceiver bundle key)
| Key | Description (결과값) |
|---|---|
| PushConstantsEx.COMPLETE_BUNDLE.REG_USER | 사용자 등록 |
| PushConstantsEx.COMPLETE_BUNDLE.UNREG_USER | 사용자 해제 |
| PushConstantsEx.COMPLETE_BUNDLE.UPDATE_PUSHSERVICE_DATE | push service 갱신 |
| PushConstantsEx.COMPLETE_BUNDLE.REG_PUSHSERVICE | 푸시 서비스 등록 |
| PushConstantsEx.COMPLETE_BUNDLE.UNREG_PUSHSERVICE | 푸시 서비스 해제 |
| PushConstantsEx.COMPLETE_BUNDLE.READ_CONFIRM | 읽음 ack |
| PushConstantsEx.COMPLETE_BUNDLE.RECEIVE_CONFIRM | 수신 ack |
| PushConstantsEx.COMPLETE_BUNDLE.IS_REGISTERED_SERVICE | 서비스 등록 여부 (register service 호출 시, 수신 될 수 있음) |
- BroadCastReceiver bundle key return 값 (STATUS CODE – 통신관련)
| Key | Description (결과값) |
|---|---|
| PushConstants.RESULTCODE_OK | 정상 |
| PushConstants.RESULTCODE_HTTP_ERR | 통신 오류 – connection 관련 error |
| PushConstants.RESULTCODE_AUTHKEY_ERR | 인증키 획득 오류 |
| PushConstants.RESULTCODE_RESPONSE_ERR | 응답 오류 – 오류코드를 수신한 경우 |
| PushConstants.RESULTCODE_INTERNAL_ERR | 정의되지 않은 예기치 못한 오류가 발생한 경우 |
| PushConstants.RESULTCODE_AUTHKEY_ERR2 | 인증키 획득 오류 |
- BroadCastReceiver Intent 관련 키값 (처리 결과 )
| Key | Description (결과값) |
|---|---|
| PushConstants.KEY_RESULT | ACTION_COMPLETED에 Extras용 전체 호출 값 |
| PushConstants.KEY_BUNDLE | 번들용 KEY |
| PushConstants.KEY_ISREGISTER | 서비스 등록 여부에 대한 결과값 |
| PushConstants.KEY_RESULT_CODE | 결과 코드 (정상: 200) |
| PushConstants.KEY_RESULT_MSG | 푸시 서버 통신 이후 수신된 메시지 |
BroadcastReceiver 등록 방법 (예시)
섹션 제목: “BroadcastReceiver 등록 방법 (예시)”receiver 등록
섹션 제목: “receiver 등록”private BroadcastReceiver mLoginBroadcastReceiver;
public void registerReceiver() { if (mLoginBroadcastReceiver != null) { return; }
IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(LoginActivity.this.getPackageName() + PushConstantsEx.ACTION_COMPLETED);
mLoginBroadcastReceiver = new BroadcastReceiver() {
@Override public void onReceive(Context context, Intent intent) {
if(!PushUtils.checkValidationOfCompleted(intent, context)){ return; }
//intent 정보가 정상적인지 판단 String result = intent.getExtras().getString(PushConstants.KEY_RESULT); String bundle = intent.getExtras().getString(PushConstantsEx.KEY_BUNDLE);
JSONObject result_obj = null; String resultCode = ""; String resultMsg = ""; try { result_obj = new JSONObject(result); resultCode = result_obj.getString(PushConstants.KEY_RESULT_CODE); resultMsg = result_obj.getString(PushConstants.KEY_RESULT_MSG); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); }
//Action에 따라 분기 (이미 서비스 등록이 된 경우 다음 process 이동) if(bundle.equals(PushConstantsEx.COMPLETE_BUNDLE.REG_USER)) { if (resultCode.equals(PushConstants.SUCCESS_RESULT_CODE)) { Toast.makeText(context, "로그인 성공!", Toast.LENGTH_SHORT).show(); setSendTest(); }else { Toast.makeText(context, "[LoginActivity] error code: " + resultCode + " msg: " + resultMsg, Toast.LENGTH_SHORT).show(); } }else if (bundle.equals(PushConstantsEx.COMPLETE_BUNDLE.UNREG_PUSHSERVICE)) {
if (resultCode.equals(PushConstants.SUCCESS_RESULT_CODE)) { Toast.makeText(context, "해제 성공!", Toast.LENGTH_SHORT).show(); }else {
Toast.makeText(context, "[LoginActivity] error code: " + resultCode + " msg: " + resultMsg, Toast.LENGTH_SHORT).show(); } }else if (bundle.equals(PushConstantsEx.COMPLETE_BUNDLE.REG_SERVICE_AND_USER)) {
if (resultCode.equals(PushConstants.SUCCESS_RESULT_CODE)) { Toast.makeText(context, "로그인 성공!", Toast.LENGTH_SHORT).show(); setSendTest(); }else { Toast.makeText(context, "[LoginActivity] error code: " + resultCode + " msg: " + resultMsg, Toast.LENGTH_SHORT).show(); } }else if(bundle.equals(PushConstantsEx.COMPLETE_BUNDLE.IS_REGISTERED_SERVICE)){ String isRegister = ""; try { isRegister = result_obj.getString(PushConstants.KEY_ISREGISTER); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); }
if(isRegister.equals("C")){ Toast.makeText(context, "CHECK ON [ 사용자 재등록 필요 !! ]", Toast.LENGTH_LONG ).show(); }else if(isRegister.equals("N")){ Toast.makeText(context, "CHECK ON [ 서비스 재등록 필요 !! ]", Toast.LENGTH_LONG).show(); }else{ Logger.i("서비스 정상 등록 상태 "); } } } };
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(mLoginBroadcastReceiver, intentFilter);}receiver 해제
섹션 제목: “receiver 해제”public void unregisterReceiver() { if (mLoginBroadcastReceiver != null) { LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(mLoginBroadcastReceiver); mLoginBroadcastReceiver = null; }}Push Payload
섹션 제목: “Push Payload”Payload 항목
섹션 제목: “Payload 항목”- JSONObject key 값에 대한 설명 [key가 소문자임]
| Key | 활용방법 |
|---|---|
| alert | 푸시 메시지 제목(옵션)과 메시지 내용이 JSON 형식으로 전달됨 |
| ext | 푸시 메시지 외에 추가적인 세부 정보를 전달 |
| pushkey | public push의 토큰 유효성을 위해 관리되는 키 (서버관점) |
| seqno | Push message의 고유 키값 |
| appid | Push 서비스가 관리되는 앱 ID ( Application ID) |
| sender | 발송자 코드 (서버관점) |
| senddate | 발송된 시간 (서버관점) |
Payload 예시
섹션 제목: “Payload 예시”- 일반(text) push 메시지 예시
{ "aps":{ "badge":"0", "sound":"alert.aif", "alert":"{\"title\":\"메시지 테스트\",\"body\":\"일반 메시지 테스트입니다.\"}" }, "mps":{ "appid":"LGU-SAMPLEAPP-00001", "ext":"{}", "seqno":"LtFCtmX1PI.6cJtPW", "sender":"LGUR_cm-push-provider-ad-1_AD|E", "senddate":"2022-06-13 09:52:28", "db_in":"N", "pushkey":"2427efdf1b62cd9dbdf174bbdff048f8051461e1" }}- 이미지 push 메시지 예시
{ "aps":{ "badge":"17", "sound":"alert.aif", "alert":"{\"title\":\"이미지 테스트\",\"body\":\"이미지를 포함한 메시지 테스트입니다.\"}" }, "mps":{ "appid":" LGU-SAMPLEAPP-00001", "ext":"{\"imageUrl\":\"https:\/\/df25hb5tuwkue.cloudfront.net\/push\/abc"}", "seqno":"4YslPTW9Lv.6cJtPY", "sender":" LGUR_cm-push-provider-ad-1_AD|E ", "senddate":"2022-06-13 09:54:01", "db_in":"N", "pushkey":"2427efdf1b62cd9dbdf174bbdff048f805146132" }}