Note
최신 샘플 및 라이브러리는 아래 링크를 통해, 다운로드 받을 수 있습니다.
Note 최소 지원 버전 : 안드로이드 5.0 (minSdk 21)
Morpheus Push 는 스마트폰 OS에서 지원하는 PNS(Push Notification Server)를 기반으로 한 메세지 전송 플랫폼이다. Android Client 에서는 UPMC WAS 에서 제공하는 Push API 를 각각 버전 규격에 맞춰 연동하여 원할하게 Push Service 를 운영하기 위한 라이브러리를 제공한다.
UPMC 4.x 이상 버전
Service 등록 및 사용자 등록 를 통해, 서비스 등록 및 사용자 등록이 동시에 이뤄짐
Android 용 SDK 파일
MPushLibrary
mcore.mobile.lic
– Push 라이센스 정보가 담긴 Push 라이센스 파일
Manifest.xml
– Push 구동을 위한 설정 파일
SDK 적용 방법
Android Project 의 libs 폴더에 Library 파일에 추가
Android Project의 assets/res 폴더에 라이선스 및 설정 파일 추가
플러그인 적용 방법
mcore.mobile.lic
#Tue Feb 17 09:53:27 KST 2015
application_id=xxx.xxx.xxxx.xxxx
expiration_date=xxxx-xx-xx
mpsn=hZK................X
sn=AhA....E....
프로젝트 생성
라이선스 반영
fcm console 이동 : sender id 발급 / google-service.json 파일 다운로드
Manifest.xml 설정
AndroidManifest.xml 설정
dummy 용 png 파일 적용
Gradle 설정
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<push>
<option>
</option>
<receiver> <!-- UPMC 설정 정보 -->
<!-- console log -->
<log>y</log>
<!-- file log -->
<file-log>n<file-log>
<!-- key 교환 방식 암호화 : 라이선스 발급시 요청 (hexa코드 16자리) -->
<security-indexes>0x??? 0x??? 0x??? </security-indexes>
<!-- 서버 버전 5.0-->
<version>5.0</version>
<!-- receiver server url(필수 설정) -->
<server>http://pushxx.morpheus.co.kr:18080/</server>
<timeout>20000</timeout>
<!-- FCM 설정 -->
<!-- FCM sender-id (push-type이 FCM일경우 필수설정, sender id는 1개만 등록 가능) -->
<fcm-sender-id>xxxxxxxxxxxx</fcm-sender-id>
<!-- 푸쉬타입(필수설정)
FCM:구글GCM / FCM(Public Push) : FCM 이용시도 하위 호환성을 위해, GCM으로 표기함
UPNS:유라클UPNS(Private Push)
ALL : doze mode 대응 (gcm : dummy data, upns : real data)
-->
<android-push-type>ALL</android-push-type>
<!-- 서비스 정책 ,
user : one user multidevice,
device : one user one device,
default : user -->
<policy>device</policy>
<!-- stb(셋탑)/mobile(모바일)/mobile_old(디바이스 아이디 이전 버전) -->
<device-type>mobile</device-type>
<!-- upmc 연동시 휴대폰 번호 사용 여부 -->
<use-phone_number>n</use-phone_number>
<!-- 안드로이드 8.0이상 필수, 브로드캐스트 리시버에서 퍼미션 사용 여부를 설정 (Y/N) -->
<use-permission>Y</use-permission>
</receiver>
<upns>
<!-- agent, inapp -->
<agent-service-type>inapp</agent-service-type>
<!-- assets 안에 agent apk 파일이 있는 경우 -->
<!-- <agent-apk-name></agent-apk-name>
<agent-classpath></agent-classpath>
<agent-package-name></agent-package-name> -->
<!-- UPNS RESTART ALARM INTERVAL (초단위) : JobScheduler 이벤트 시간-->
<agent-restart-interval>120</agent-restart-interval>
<!-- auto/manual -->
<agent-receive-confirm>auto</agent-receive-confirm>
<!-- reconnect interval (초단위) - 최소 10초 이상(서버에 대한 부하 고려하여 설정 - 기본값 10초) -->
<reconnect-interval>10</reconnect-interval>
<!-- reconnect interval (초단위) - 최소 10초 이상 (재접속 카운트에 따라 설정, 3회 이후 다시 최초 설정 간격으로 반복)-->
<reconnect-interval>10,20,30</reconnect-interval>
<!-- reallocate interval (v4.1 이상 - 다른 버전 무시) - 최소 10 이상 -->
<!-- 단위: , 1~reallocate-interval 사이의 랜덤한 시간간격으로 호출 요청 (60 이상 권장, 재할당 카운트에 따라 설정, 3회 이후 다시 최초 설정 간격으로 반복) -->
<reallocate-interval>10,30,50</reallocate-interval>
<!-- 사용자 등록 시 재시도 여부 auto / 횟수 (integer) -->
<retry-regist-count>auto</retry-regist-count>
</upns>
</push>
</settings>
Key | Type | Description |
---|---|---|
log | String | Push Service 에 대한 Debugging 로그 출력 여부 ( y / n ) |
version | String | UPMC Version ( 3.0, 3.5, 3.6, 3.7, 3.8, 4.0, 5.0 ) |
server | String | UPMC WAS 서버 URL |
device-type | String | 서비스 디바이스에 대한 성정 (빈값 : mobile, mobile : mobile용, stb : 셋탑용) |
agent-service-type | String | UPNS 서비스 방식 (inapp : 라이브러리형, agent : 별도의 Agent 앱 구현시) |
agent-restart-interval | String | 앱이 살아 있는지 체크를 위한 시간 설정 (단위 : sec) |
agent-receive-confirm | String | upns 메시지 수신 결과에 대한 ack 전송 방법 (auto : 자동 (default), manual : 수동, 직접 구현) |
reconnect-interval | String | 재연결 요청 간격 (기본값: 10초) : 서버의 부하를 고려하여 설정 (반대로 너무 길 경우 재연결이 오래 걸리므로 주의) |
reallocate-interval | String | 서버 4.1 이상 이용 시 연결 실패에 따른 서버 재할당 간격 (기본값: 600ms) : 서버의 부하를 고려하여 설정 |
retry-regist-count | String | 사용자 등록 시 재시도 여부 auto / 횟수 (integer) |
Note
파일로그 위치 : 스토리지 > Android > data > [package name] > log > pushlog.log
morpheus_push_library_5.1.2.11 version 이상의 라이브러리를 사용하는 경우, 퍼미션 외 아래의 예시로 제공하는 AndroidManifest.xml 설정이 필요하지 않으며, 별도로 커스텀 notification 으로 사용되는 경우 별도의 "receiver"로 정의해주어야 합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="[패키지명]"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- 안드로이드 8.0 이상 필수, 라이브러리 버전 4.1.0.7 이상부터 추가된 리시버 등록 시 권한 등록위해 선언 (없으면 앱 디폴트 권한) -->
<permission android:name="${applicationId}.permission.MPUSH_PERMISSION" android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.MPUSH_PERMISSION" />
<!-- 안드로이드 9.0 이상 필수 : targetSdkVersion = 28 이상인 경우 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- 안드로이드 14 이하 필수 : targetSdkVersion = 34 이하인 경우 data_sync 적용, 그 외 제외 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<!-- 안드로이드 15 이상 필수 : targetSdkVersion = 35 이상인 경우 special_use 적용, 그 외 제외-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<application>
<!-- push service&receiver -->
<!-- 5.1.x 버전 추가 : JobScheduler 를 이용한 서비스 Start-->
<service
android:name="m.client.push.library.service.UPNSJobService"
android:exported="false">
<intent-filter>
<action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE" />
</intent-filter>
</service>
<service android:name="m.client.push.library.service.UPNSConnectService"
android:exported="false"
android:foregroundServiceType="dataSync 또는 specialUse">
<!--targetSdk 35 이상 선언 시 property 적용-->
<!--<property
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="push_server_message_data_sync"
/>-->
</service>
<!-- 5.1.x 버전 추가 : JobScheduler 를 이용한 서비스 End-->
<receiver android:name="m.client.push.library.receiver.ServiceHandleReceiver" android:exported="true">
<intent-filter>
<action android:name="${applicationId}.START_PUSHSERVICE" />
<action android:name="${applicationId}.STOP_PUSHSERVICE" />
<action android:name="${applicationId}.RESTART_PUSHSERVICE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.SCREEN_OFF" />
<action android:name="android.intent.action.SCREEN_ON" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
<receiver android:name="m.client.push.library.receiver.UpnsActionReceiver" android:exported="false">
<intent-filter>
<action android:name="${applicationId}.ACTION_UPNS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<!-- FCM setting start -->
<!-- push service&receiver -->
<service android:name="m.client.push.library.service.FCMIntentService" android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<!-- FCM setting End -->
<receiver android:name="[패키지명].receiver.MessageArrivedReceiver" android:exported="false">
<intent-filter>
<action android:name="${applicationId}.GCM_MESSAGE_ARRIVED" />
<action android:name="${applicationId}.UPNS_MESSAGE_ARRIVED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<receiver android:name="[패키지명].receiver.PushActionReceiver" android:exported="false">
<intent-filter>
<action android:name="${applicationId}.ACTION_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<receiver android:name="m.client.push.library.receiver.GcmActionReceiver" android:exported="false">
<intent-filter>
<action android:name="${applicationId}.ACTION_GCM" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
</manifest>
<receiver android:name="[패키지명].receiver.MessageArrivedReceiver" android:exported="false" >
<intent-filter>
<action android:name="${applicationId}.GCM_MESSAGE_ARRIVED" />
<action android:name="${applicationId}.UPNS_MESSAGE_ARRIVED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
//android 14(targetSdk 34) 이하 버전 사용 시
classpath 'com.android.tools.build:gradle:7.2.2'
//android 15(targetSdk 35) 이상 버전 사용 시
classpath 'com.android.tools.build:gradle:8.1.1'
classpath 'com.google.gms:google-services:4.3.15'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
implementation 'com.google.code.gson:gson:2.10.1'
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation 'androidx.appcompat:appcompat:1.3.1'//프로젝트 환경별 상이
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation ('com.google.firebase:firebase-messaging:23.1.2')
implementation ('com.google.firebase:firebase-iid:21.1.0')
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.android.application'
repositories {
maven { url 'https://maven.google.com' }
}
android {
compileSdkVersion 34
defaultConfig {
applicationId "kr.co.pushdemo"
minSdkVersion 21
targetSdkVersion 34
multiDexEnabled true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
implementation 'com.google.code.gson:gson:2.10.1'
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.firebase:firebase-messaging:23.1.2'
implementation 'com.google.firebase:firebase-iid:21.1.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
//universal-image-loader jar 파일이 존재하지 않는경우
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
}
apply plugin: 'com.google.gms.google-services'
Public Push 로 제공되는 안드로이드 FCM 에 대한 설정은 기본적으로 안드로이드에서 제공되는 설정 가이드와 다르지 않으며, 패키지 명 선언에 주의하여 설정해야 한다.
-- UPNSJobService: UPNS 푸시를 수신하기 위한 중요한 역할을 하므로 반드시 추가되어야 한다. -- ServiceHandleReceiver: 라이브러리 내에 존재하는 리시버로 서비스의 생명 주기를 담당하는 리시버이다. -- MessageArrivedReceiver: 서버로부터 메시지를 수신하는 리시버로 데이터 수신 시 화면에 보여줄 방법을 정의하여 사용한다. -- UPNSActionReceiver: 라이브러리 내에 존재하는 리시버로 UPNS 기능에 대한 요청을 받아서 처리한다
기존 프로젝트를 Gradle 환경으로 변경한다.
Case #1. Push service 등록
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//앱 실행시마다 호출 (4.0이상)
PushManager.getInstance().registerServiceAndUser(getApplicationContext(), cuid, cname);
...
}
-- Push 플러그인 : http://docs.morpheus.co.kr/client/api/plugin-push.html
Note
푸시 초기화(InitPushService method)는 custom data 를 이용할 경우에만 진행한다. Application class 에서는 Manifest.xml parsing 과정에서, 오류가 발생할 수 있으므로 Activity 에서 호출
Arguments
Arguments
Key | Type | Description |
---|---|---|
PushConstants.KEY_CNAME | String | 사용자 닉네임 |
PushConstants.KEY_STB_ID | String | 셋탑 아이디 |
PushConstants.KEY_DEVICE_ID | String | 디바이스id |
PushConstants.KEY_CUSTOM_RECEIVER_SERVER_URL | String | UPMC url |
PushConstants.KEY_CUSTOM_UPNS_SERVER_URL | String | UPNS url |
- 예시 :
JSONObject params = new JSONObject();
// http://xxx.xxx.x.xx:xxxx 연결할 리시버 서버 url
params.put(PushConstants.KEY_CUSTOM_RECEIVER_SERVER_URL, "http://xxx.xxx.x.xx:xxxx");
// tcp://xxx.xxx.x.xx:xxxx 연결할 UPNS 서버 url
params.put(PushConstants.KEY_CUSTOM_UPNS_SERVER_URL, "tcp://xxx.xxx.x.xx:xxxx");
Note
deprecated api이고, Register Service and User 를 이용한다.
Arguments
Arguments
Key | Type | Description |
---|---|---|
PushConstants.KEY_DEVICE_ID | String | 디바이스id |
PushConstants.KEY_CUSTOM_RECEIVER_SERVER_URL | String | UPMC url |
PushConstants.KEY_CUSTOM_UPNS_SERVER_URL | String | UPNS url |
- 예시 :
JSONObject params = new JSONObject();
params.put(PushConstants.KEY_STB_ID, "{A73E9E2E-9C6B-11E4-AFAE-C55006B96D3C}");
params.put(PushConstants.KEY_DEVICE_ID, "DEVICE-A73E9E2E9C6B11E4AFAEC55006B96D3C"/*생성하여 추가 요망*/);
params.put(PushConstants.KEY_CNAME, "GUEST-A73E9E2E9C6B11E4AFAEC55006B96D3C");
Note
deprecated api이고, Register Service and User 를 이용한다.
Arguments
-결과값 : Reciver 를 통해, 처리 결과 통보
Arguments
Key | Type | Necessary | Description |
---|---|---|---|
PushConstants.KEY_CUID | String | 필수 | Client ID |
PushConstants.KEY_CNAME | String | 필수 | Client Name |
PushConstants.KEY_STB_ID | String | 선택 | STB ID |
PushConstants.KEY_DEVICE_ID | String | 선택 | Device ID |
-결과값 : Reciver 를 통해, 처리 결과 통보
Arguments
-결과값 : Reciver 를 통해, 처리 결과 통보
Arguments
Key | Type | Necessary | Description |
---|---|---|---|
PushConstants.KEY_CUID | String | 필수 | Client ID |
PushConstants.KEY_CNAME | String | 필수 | Client Name |
PushConstants.KEY_STB_ID | String | 선택 | STB ID |
PushConstants.KEY_CUSTOM_RECEIVER_SERVER_URL | String | 선택 | UPMC URL |
PushConstants.KEY_DEVICE_ID | String | 선택 | Device ID |
-결과값 : Reciver 를 통해, 처리 결과 통보
Arguments
Key | Type | Necessary | Description |
---|---|---|---|
PushConstants.KEY_EDIT_PUSH_TYPE | String | 필수 | Push Type |
-결과값 : Reciver 를 통해, 처리 결과 통보
- 예시 :
JSONObject params = new JSONObject();
params.put(PushConstants.KEY_EDIT_PUSH_TYPE, PushConstants.STR_UPNS_PUSH_TYPE);
Arguments
-결과값 : Reciver 를 통해, 처리 결과 통보
Arguments
Key | Type | Necessary | Description |
---|---|---|---|
PushConstants.KEY_CUID | String | 필수 | Client ID |
PushConstants.KEY_CNAME | String | 필수 | Client Name |
-결과값 : Reciver 를 통해, 처리 결과 통보
Arguments
-결과값 : Reciver 를 통해, 처리 결과 통보
Arguments
Key | Type | Necessary | Description |
---|---|---|---|
PushConstants.KEY_CNAME | String | 선택 | Client Name |
PushConstants.KEY_STB_ID | String | 선택 | STB ID |
PushConstants.KEY_DEVICE_ID | String | 선택 | Device ID |
- 예시 :
JSONObject params = new JSONObject();
params.put(PushConstants.KEY_STB_ID, "{A73E9E2E-9C6B-11E4-AFAE-C55006B96D3C}");
params.put(PushConstants.KEY_DEVICE_ID, "DEVICE-A73E9E2E9C6B11E4AFAEC55006B96D3C");
Arguments
New in version 4.0 UPMC
Arguments
:param int badgeCountType
Key | Type | Description |
---|---|---|
PushConstants.BADGE_TYPE_KEEP | String | 1개 읽음 처리, 다음 메시지 수신시, 동일한 값 유지(Default, -1 후 +1 이 됨) |
PushConstants.BADGE_TYPE_RESET | String | 입력 값으로 초기화, 다음 수신된 값은 입력값 +1로 처리됨 |
PushConstants.BADGE_TYPE_UPDATE | String | 카운트에 따라 업데이트 됨 (읽음여부에 상관없이, push 수신 ++) |
Arguments
Arguments
Arguments
Arguments
Arguments
Arguments
Arguments
Arguments
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 (fcm only) |
PushConstantsEx.COMPLETE_BUNDLE.IS_REGISTERED_SERVICE | 서비스 등록 여부 (register service 호출 시, 수신 될 수 있음) |
PushConstantsEx.COMPLETE_BUNDLE.INITBADGENO | 뱃지 넘버 초기화 |
PushConstantsEx.COMPLETE_BUNDLE.REG_GROUP | 그룹 등록 |
PushConstantsEx.COMPLETE_BUNDLE.UNREG_GROUP | 그릅 해제 |
Key | Description (결과값) |
---|---|
PushConstants.RESULTCODE_OK | 정상 |
PushConstants.RESULTCODE_HTTP_ERR | 통신 오류 - UPMC서버에 접속할 수 없을때 - connection 관련 error |
PushConstants.RESULTCODE_AUTHKEY_ERR | 인증키 획득 오류 |
PushConstants.RESULTCODE_RESPONSE_ERR | 응답 오류 - 오류코드를 수신한 경우 |
PushConstants.RESULTCODE_INTERNAL_ERR | 정의되지 않은 예기치 못한 오류가 발생한 경우 |
PushConstants.RESULTCODE_AUTHKEY_ERR2 | 인증키 획득 오류 |
Key | Description (결과값) |
---|---|
PushConstants.KEY_RESULT | ACTION_COMPLETED에 Extras용 전체 호출값 |
PushConstants.KEY_BUNDLE | 번들용 KEY |
PushConstants.KEY_ISREGISTER | 서비스 등록 여부에 대한 결과값 |
PushConstants.KEY_RESULT_CODE | 결과 코드 (정상 : 200) |
PushConstants.KEY_RESULT_MSG | upmc 통신 이후, 수신된 메시지 |
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_GROUP)) {
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.UNREG_GROUP)) {
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.INITBADGENO)) {
if (resultCode.equals(PushConstants.SUCCESS_RESULT_CODE)) {
Toast.makeText(context, "Badge Number 초기화 성공 !", Toast.LENGTH_SHORT).show();
PushManager.getInstance().setDeviceBadgeCount(getApplicationContext(), "11");
}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);
}
public void unregisterReceiver() {
if (mLoginBroadcastReceiver != null) {
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(mLoginBroadcastReceiver);
mLoginBroadcastReceiver = null;
}
}
아래 기술된 메시지는 샘플에 대한 예시이며, 프로젝트에서 표현하고자 하는 방식에 따라, Interface 정의서에 의해, 변경이 가능함.
JSONObject key 값에 대한 설명
Key | 활용방법 |
---|---|
MESSAGE | 메시지 타이틀로 이용 |
EXT | 일반 메시지인 경우, 메시지로 이용가능하며, Rich 메시지인 경우, 세부 정보를 추가로 획득하여, 표현 |
SEQNO | Push message의 고유 키값 |
PSID | Push 서비스에 대한 고유 ID( PSID) |
APPID | Push 서비스가 관리되는 앱 ID( Application ID) |
CUID | 사용자 ID( Client ID) |
PUBLIC | Public 망을 이용하는 push 여부 |
SENDERCODE | 발송자 코드 (서버관점) |
SENDDATE | 발송된 시간 (서버관점) |
DB_IN | DB에 저장 여부 (서버 관점) |
BADGENO | 뱃지값 |
{
"BODY":{
"MESSAGE":"일반 알림",
"EXT":"메세지 테스트",
"SEQNO":"304",
"PSID":"9ca385ad63c4cbd5eeda33c2e7a7a024ea83c2d4",
"APPID":"com.uracle.push.test",
"CUID":"test1",
"PUBLIC":"N",
"SENDERCODE":"device-android",
"SENDDATE":"2016041410",
"DB_IN":"Y",
"BADGENO":"9"
}
}
{
"BODY":{
"MESSAGE":"Web 알림",
"EXT":"1|웹페이지|http://lab.morpheus.kr/push/sample/image|http://lab.morpheus.kr/push/sample/webpage",
"SEQNO":"305",
"PSID":"9ca385ad63c4cbd5eeda33c2e7a7a024ea83c2d4",
"APPID":"com.uracle.push.test",
"CUID":"test1",
"PUBLIC":"N",
"SENDERCODE":"device-android",
"SENDDATE":"2016041410",
"DB_IN":"Y",
"BADGENO":"10"
}
}
{
"BODY":{
"MESSAGE":"이미지 알림",
"EXT":"1|웹페이지|http://lab.morpheus.kr/push/sample/image",
"SEQNO":"307",
"PSID":"9ca385ad63c4cbd5eeda33c2e7a7a024ea83c2d4",
"APPID":"com.uracle.push.test",
"CUID":"test1",
"PUBLIC":"N",
"SENDERCODE":"device-android",
"SENDDATE":"2016041410",
"DB_IN":"Y",
"BADGENO":"12"
}
}
fcm.googleapis.com 443,5228,5229,5230
- FCM 포트 및 방화벽:
조직에 인터넷 트래픽 송수신을 제한하는 방화벽이 있으면 모바일 기기의 FCM 연결을 허용하도록 구성해야 네트워크의 기기에서 메시지를 수신할 수 있습니다. FCM은 대개 포트 5228을 사용하지만 5229 및 5230을 사용하는 경우도 있습니다. 발신 연결의 경우 Google IP 범위가 매우 자주 변경되며 개발자의 방화벽 규칙이 오래되면 사용자 경험에 영향을 줄 수 있으므로 FCM에서 특정 IP를 제공하지 않습니다. IP 제한 없이 포트 5228~5230을 허용하는 것이 가장 좋습니다. 하지만 IP 제한이 있어야 한다면 Google ASN 15169에 나와 있는 IPv4 및 IPv6 블록의 모든 IP 주소를 허용해야 합니다. 목록의 크기가 크며 규칙을 매월 업데이트하도록 계획을 세워야 합니다. 방화벽 IP 제한으로 인해 발생하는 문제는 보통 간헐적이며 진단하기 어렵습니다.
5228
5229
5230
다음 중 하나(1번 옵션 권장):
- IP 제한 없음
- Google ASN 15169 에 나와 있는 IP 블록에 포함된 모든 IP 주소: 한 달에 한 번 이상 업데이트해야 합니다.