================================================ Push for UPNS + FCM (doze mode) : deprecated ================================================ .. warning:: 이 방식은 안드로이드 8.0이상 부터, BACKGROUND SERVICE 제약으로, 더 이상 지원이 불가능하니다. 아래 링크를 참고해서, 새로운 버전으로 적용하시기 바랍니다. - `버전 별 푸시 가이드 `_ - `최신버전 푸시 적용 가이드 `_ 1. 개요 ========= Morpheus Push 는 스마트폰 OS에서 지원하는 PNS(Push Notification Server)를 기반으로 한 메세지 전송 플랫폼이다. Android Client 에서는 UPMC WAS 에서 제공하는 Push API 를 각각 버전 규격에 맞춰 연동하여 원할하게 Push Service 를 운영하기 위한 라이브러리를 제공한다. 2. 용어 ========= .. _UPNS: UPNS -------- - Uracle Push Notification System 의 줄임말. - UPNS는 MQTT Protocol 기반으로 Android 애플리케이션으로 테이터를 전송하게 해주는 private 서비스이다. - 서버에서 가져와야할 새로운 데이터가 있음을 Android 애플리케이션에 알리는 적은 용량의 메시지이거나, 최대 256Mbyte를 지원하나, 4k를 권고한다. - Android application은 message를 받기 위해 background service가 실행되고 있음. - UPNS는 단순히 원시 data를 android 단말로 보내며, 이 data를 통해 application에서 제어함. - Android 2.2 이상을 지원. .. _UPMC: UPMC -------- - Uracle Push Message Center 의 줄임말. - Android GCM 서버와 HTTP 프로토콜을 이용하여, Server 대 Server 로 연계하여 구동하는 WAS(Web Application Server) 이다. - Receiver 라고도 불림 .. _RegisterService: Service 등록 ------------------ - :ref:`UPNS` 로 부터 PSID 를 할당 받고 :ref:`UPMC` 로 Push 서비스를 사용하겠다고 등록하는 절차 .. _UnregisterService: Service 해제 ------------------ - :ref:`UPMC` 로 Push 서비스를 사용하지 않겠다고 등록을 삭제하는 절차 .. _RegisterUser: User 등록 ------------- - :ref:`UPMC` 로 Push 서비스에 대한 사용자를 등록 또는 변경하는 절차 .. _receiveMessage: 수신 확인 ------------- - 메시지를 수신 후 :ref:`UPNS` 로 Ack를 주는 절차 - MQTT 프로토콜 규약을 따르며, 라이브러리 내부적으로 처리한다. .. _ReadMessage: 읽음 확인 ------------- - App에서 메세지를 읽었을때 :ref:`UPMC` 로 Ack를 주는 절차 .. _ApplicationID: Application ID ---------------- - AppID라고도 함 - App의 lic 파일에 포함된 application_id 값으로 앱을 구분하기 위한 코드값. .. _GCMsenderid: GCM Sender ID ---------------- – GCM 서비스 등록을 위한 ID .. _CUID: Client ID ---------- - 사용자로 등록할 Client 의 고유한 ID (CUID 라고도 함) - Email, UserID, Phone Number 또는 Device-UUID 등을 CUID 로 사용 .. _CNAME: Client Name ------------ - 사용자로 등록할 Client 의 이름 (CNAME 라고도 함) - 사용자의 이름이나 Nickname 또는 Device Name 을 CNAME 으로 사용 .. _GROUPSEQ: GROUPSEQ ------------- - Group Sequence Number 의 준말로 User Group의 고유한 Sequence Number .. _PSID: PSID ------ - Push Service ID 의 줄임말 - Push 서비스에 대한 고유 ID - UPNS에서 할당 받은 Device Token을 사용 .. _CHECKONSERVICE: CHECK ON SERVICE ------------------ - 단말이 Push 서비스에 등록되어 있는지를 확인함 - 4.0 이상 지원 .. _PNSID Push Notification System ID ------------------------------ - PNSID라고 함. - GCM, UPNS, APNS등이 여기에 속함 .. _AppAlive App Alive ------------ - 앱의 설치여부를 24시간 주기로 체크 할 수 있도록 함 - 체크 방식 : 앱 구동 후 Push Resister method를 사용시(내부적으로 작동) .. _4.0 4.0 ------ - 대용량 Push(100만 이상)를 위해 설계된 push 시스템 .. _packagename Packge Name ------------ - google play에서 안드로이드 앱을 구별하기 위한 unique 값으로, AndoridManifest.xml 에 선언한다. 3. Push 서비스 절차 ==================== 버전별 서비스 순서 --------------- :ref:`UPMC` 3.6 이상 버전 initPushService => :ref:`RegisterService` (자동으로 PSID 요청) => :ref:`RegisterUser` => 메시지 수신 DataFlow Diagram ------------------- .. figure:: ../_static/push/android/upns/upns-dataflow.png Sequence Diagram ------------------- .. figure:: ../_static/push/android/upns/upns-sequence.png Service Register Sequence Diagram ------------------- .. figure:: ../_static/push/android/service-register.png User Register Sequence Diagram ------------------- .. figure:: ../_static/push/android/user-register.png Read Message Sequence Diagram ------------------- .. figure:: ../_static/push/android/read-message.png RegisterService & User Sequence Diagram (SUCCESS) ------------------- .. figure:: ../_static/push/android/registerandservice.png RegisterService & User Sequence Diagram (FAIL) ------------------- .. figure:: ../_static/push/android/regserviceanduser_fail.png 4. 라이브러리 및 설정 파일 ==================== 4.1. 라이브러리 ------------- - PushLibrary.jar – UPNS/GCM Push 를 활용할 수 있는 라이브러리 4.2. iOS 용 라이브러리 ----------------- - MPushLibrary.framework – APNS Push 를 활용할 수 있는 라이브러리가 담긴 framework 파일 - MPushLibrary.bundle – framework 을 사용함에 있어 필요한 resource가 담긴 bundle 파일 4.3. 공통 설정 파일 --------------- - mcore.mobile.lic – Push 라이센스 정보가 담긴 Push 라이센스 파일 - Manifest.xml – Push 구동을 위한 설정 파일 5. SDK 및 설정 파일 ======================= SDK 버전 -------------- - Android 용 SDK 파일 - MPushLibrary - GCM / UPNS Push를 활용할 수 있는 라이브러리 - mcore.mobile.lic – Push 라이센스 정보가 담긴 Push 라이센스 파일 - Manifest.xml – Push 구동을 위한 설정 파일 - SDK 적용 방법 - Android Project 의 libs 폴더에 Library 파일에 추가 - Push Library.jar - mqtt-android-push.jar .. figure:: ../_static/push/android/upns/push-libs-upns.png :width: 40% - Android Project의 assets/res 폴더에 라이선스 및 설정 파일 추가 - Manifest.xml - mcore.mobile.lic .. figure:: ../_static/push/android/push-lib-setting.png :width: 40% 플러그인 버전 -------------- - MPush 플러그인 파일 - MPush.framework - MPushLibrary 기반으로 구현된 Morpheus Push Plugin - MPush.bundle - MPush.framework 을 사용함에 있어 필요한 resource가 담긴 bundle 파일 - 플러그인 적용 방법 - IDE 에서 MPush Plugin 을 업데이트 후 적용 공통 설정 파일 -------------- - mcore.mobile.lic - Push 라이센스 정보가 담긴 Push 라이센스 파일 - application_id 값을 :ref:`ApplicationID` 로 사용 .. code-block:: text #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.... .. versionadded:: 3.8.1 Library - 라이센스 파일을 바탕으로 생성한 Security Indexes 값으로 Push 서비스를 운용하는 중에 생성되는 사용자 또는 단말기의 식별 가능한 데이타를 암호화 하여 저장 .. _Manifest.xml 설정: Manifest.xml 설정 ---------------------------------------------- - 해당 기능은 서버 버전 4.0 이상부터 지원하는 기능이므로 서버 버전을 확인해야 함. - fcm dummy 를 수신하기 위한 서버 설정이 필요하며 Manifest.xml에 gcm 등록을 위한 gcm-sender-id 추가 및 푸시 타입을 'ALL'로 변경해야함. .. code-block:: xml y 5.0 0x??? 0x??? 0x??? http://pushxx.morpheus.co.kr:18080/ 20000 xxxxxxxxxxxx,bbbbbbbbbbb ALL device mobile n Y inapp 60 auto 10 10,20,30 10,30,50 auto .. _AndroidManifest.xml 설정: AndroidManifest.xml 설정 ---------------------------------------------- - Push ALL 설정에 대한 UPNS/GCM 파일 추가 - 푸시 라이브러리 외에도 반드시 google-play-gcm.jar 가 포함되어 있어야 함. .. code-block:: xml .. _gcm dummy 알림을 위한 리소스 추가: fcm dummy 알림을 위한 리소스 추가 ---------------------------------------------- - fcm dummy를 수신하여 화면 깨움 처리를 위해 다음 경로의 'doze.png.zip'을 다운로드 받은 후 압축 해제하여 doze.png 파일을 프로젝트의 res > drawable 폴더에 반드시 복사해야함. :download:`doze 리소스 다운로드 <../_static/push/android/upns/doze.png.zip>`. UPNS 구현시 주의 사항 ---------------- .. warning:: - UPNSService: UPNS 푸시를 수신하기 위한 중요한 역할을 하므로 반드시 추가되어야 한다. - ServiceHandleReceiver: 라이브러리 내에 존재하는 리시버로 서비스의 생명 주기를 담당하는 리시버이다. - MessageArrivedReceiver: 서버로부터 메시지를 수신하는 리시버로 데이터 수신 시 화면에 보여줄 방법을 정의하여 사용한다. - UPNSActionReceiver: 라이브러리 내에 존재하는 리시버로 UPNS 기능에 대한 요청을 받아서 처리한다 FCM 구현시 주의 사항 -------------------------------- .. warning:: - Public Push 로 제공되는 안드로이드 FCM 에 대한 설정은 기본적으로 안드로이드에서 제공되는 설정 가이드와 다르지 않으며 다만 패키지 명을 주의하여 설정해야 한다. Gradle Settings [Project] ----------------------------- - Sample .. code-block:: javascript buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' classpath 'com.google.gms:google-services:3.1.0' // 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 } Gradle Settings [Module] ---------------------------------------------- - google-service.json 파일 다운로드 및 적용 google-service.json 다운로드 : https://support.google.com/firebase/answer/7015592 https://console.firebase.google.com/u/0/ .. figure:: ../_static/push/android/fcm/google-service.json.png :width: 80% - dependencies [버전은 프로젝트 상황에 맞게 변경] implementation ('com.google.firebase:firebase-messaging:15.0.2') - apply (build.gradle 맨 하단에 적용) apply plugin: 'com.google.gms.google-services' - Sample .. code-block:: javascript apply plugin: 'com.android.application' repositories { maven { url 'https://maven.google.com' } } android { compileSdkVersion 23 buildToolsVersion "26.0.2" defaultConfig { applicationId "kr.co.pushdemo" minSdkVersion 14 targetSdkVersion 23 multiDexEnabled true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { implementation files('libs/*.jar') implementation ('com.google.firebase:firebase-messaging:15.0.2') //jar 버전이 포함되지 않은 경우 implementation 'com.google.code.gson:gson:1.7.1' } apply plugin: 'com.google.gms.google-services' Gradle Build시 주의 사항 ------------------------------ .. warning:: 아래와 같이 Error가 발생하는 경우, dependencies 속성이 Gradle 버전과 맞지 않기 때문이므로, implementation 을 compile 로 변경한다. Error : A problem occurred evaluating project ':app'. > Could not find method implementation() for arguments 6. Push Service 연동 ======================= 라이브러리 버전 ----------------- -- Push service 등록 .. code-block:: java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //앱 실행시마다 호출 (4.0이상) PushManager.getInstance().registerServiceAndUser(Context context, String cuid, String cname); ... } 플러그인 버전 ----------------- -- Push 플러그인 : http://docs.morpheus.co.kr/client/api/plugin-push.html 7. Push APIs ======================= Initialize Push Server --------------------------- .. c:function:: PushManager.getInstance().initPushServer(Context context); - Manifest.xml 설정 파일에서 라이브러리를 초기화하기 위한 정보를 가져온다. :param Context context: 현재 Context .. c:function:: PushManager.getInstance().initPushServer(Context context, JSONObject params); - Manifest.xml 설정 파일에서 라이브러리를 초기화하기 위한 정보를 가져온다 :param Context context: 현재 Context :param JSONObject params: 정보셋팅 - JSONObject key 값에 대한 설명 ============================================= ========== ============= 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 ============================================= ========== ============= .. code-block:: java - 예시 : 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"); Register Service -------------------- .. c:function:: PushManager.getInstance().registerPushService(Context context); - GCM 및 UPNS에 푸시 서비스를 등록 한다. :param Context context: 현재 context .. c:function:: PushManager.getInstance().registerPushService(Context context, JSONObject params); - GCM / UPNS 에 푸시 서비스를 등록한다. :param Context context: 현재 Context :param JSONObject params: 정보셋팅 - JSONObject key 값에 대한 설명 ============================================= ========== ============= 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 ============================================= ========== ============= .. code-block:: java - 예시 : 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"); Register User --------------- .. c:function:: PushManager.getInstance().registerPushUser(Context context, String cuid, String cname); - :ref:`CUID` 와 :ref:`CNAME` 으로 User 등록 - 푸시 서비스를 이용할 사용자를 등록한다. 서비스 등록이 성공한 이후 사용자 등록이 가능하다. :param Context context: 현재 Context :param String cuid: :ref:`CUID` 값 :param String cname: :ref:`CNAME` 값 -결과값 : Reciver 를 통해, 처리 결과 통보 .. c:function:: PushManager.getInstance().registerPushUser (Context context, JSONObject params); - :ref:`CUID` 와 :ref:`CNAME` 으로 User 등록 - 푸시 서비스를 이용할 사용자를 등록한다. 서비스 등록이 성공한 이후 사용자 등록이 가능하다. :param Context context: 현재 Context :param JSONObject params: 정보셋팅 - JSONObject key 값에 대한 설명 ============================ ========== ============ ============= Key Type Necessary Description ============================ ========== ============ ============= PushConstants.KEY_CUID String 필수 :ref:`CUID` PushConstants.KEY_CNAME String 필수 :ref:`CNAME` PushConstants.KEY_STB_ID String 선택 STB ID PushConstants.KEY_DEVICE_ID String 선택 Device ID ============================ ========== ============ ============= -결과값 : Reciver 를 통해, 처리 결과 통보 Register Service and User ------------------------- .. c:function:: PushManager.getInstance().registerServiceAndUser(Context context, String cuid, String cname); - :ref:`CUID` 와 :ref:`CNAME` 으로 User 등록 - GCM or UPNS에 푸시 서비스와 사용자을 동시에 처리 함. - 지원버전 : 서버 UPMC 3.7.2.9 이상, client 3.8.0.4 이상 :param Context context: 현재 Context :param String cuid: :ref:`CUID` 값 :param String cname: :ref:`CNAME` 값 -결과값 : Reciver 를 통해, 처리 결과 통보 .. c:function:: PushManager.getInstance().registerServiceAndUser (Context context, JSONObject params); - :ref:`CUID` 와 :ref:`CNAME` 으로 User 등록 - GCM or UPNS에 푸시 서비스와 사용자을 동시에 처리 함. :param Context context: 현재 Context :param JSONObject params: 정보셋팅 - JSONObject key 값에 대한 설명 ============================ ========== ============ ============= Key Type Necessary Description ============================ ========== ============ ============= PushConstants.KEY_CUID String 필수 :ref:`CUID` PushConstants.KEY_CNAME String 필수 :ref:`CNAME` PushConstants.KEY_STB_ID String 선택 STB ID PushConstants.KEY_DEVICE_ID String 선택 Device ID ============================ ========== ============ ============= -결과값 : Reciver 를 통해, 처리 결과 통보 Change Service ------------------------- .. c:function:: PushManager.getInstance().changePushService (Context context, JSONObject params); - Manifest 푸시 타입에 따라 최초 등록 이후, 서비스 타입을 동적으로 변경한다. :param Context context: 현재 Context :param JSONObject params: 정보셋팅 - JSONObject key 값에 대한 설명 ================================= ========== ============ ============= Key Type Necessary Description ================================= ========== ============ ============= PushConstants.KEY_EDIT_PUSH_TYPE String 필수 Push Type ================================= ========== ============ ============= -결과값 : Reciver 를 통해, 처리 결과 통보 .. code-block:: java - 예시 : JSONObject params = new JSONObject(); params.put(PushConstants.KEY_EDIT_PUSH_TYPE, PushConstants.STR_UPNS_PUSH_TYPE); UnRegister User --------------- .. c:function:: PushManager.getInstance().unregisterPushUser(Context context, String cuid, String cname); - :ref:`CUID` 와 :ref:`CNAME` 으로 User 등록해제 - GCM or UPNS에 푸시 서비스를 이용할 사용자를 등록헤재 한다 :param Context context: 현재 Context :param String cuid: :ref:`CUID` 값 :param String cname: :ref:`CNAME` 값 -결과값 : Reciver 를 통해, 처리 결과 통보 .. c:function:: PushManager.getInstance().unregisterPushUser (Context context, JSONObject params); - :ref:`CUID` 와 :ref:`CNAME` 으로 User 등록 해제 - GCM or UPNS에 푸시 서비스를 이용할 사용자를 등록해제 한다. :param Context context: 현재 Context :param JSONObject params: 정보셋팅 - JSONObject key 값에 대한 설명 ============================ ========== ============ ============= Key Type Necessary Description ============================ ========== ============ ============= PushConstants.KEY_CUID String 필수 :ref:`CUID` PushConstants.KEY_CNAME String 필수 :ref:`CNAME` ============================ ========== ============ ============= -결과값 : Reciver 를 통해, 처리 결과 통보 Unregister Service -------------------- .. c:function:: PushManager.getInstance().unregisterPushService(Context context); - GCM 및 UPNS에 푸시 서비스를 해제 한다. :param Context context: 현재 context -결과값 : Reciver 를 통해, 처리 결과 통보 .. c:function:: PushManager.getInstance().unregisterPushService(Context context, JSONObject params); - GCM / UPNS 에 푸시 서비스를 해제 한다. :param Context context: 현재 Context :param JSONObject params: 정보셋팅 - JSONObject key 값에 대한 설명 ============================ ========== ============ ============= Key Type Necessary Description ============================ ========== ============ ============= PushConstants.KEY_CNAME String 선택 :ref:`CNAME` PushConstants.KEY_STB_ID String 선택 STB ID PushConstants.KEY_DEVICE_ID String 선택 Device ID ============================ ========== ============ ============= .. code-block:: java - 예시 : JSONObject params = new JSONObject(); params.put(PushConstants.KEY_STB_ID, "{A73E9E2E-9C6B-11E4-AFAE-C55006B96D3C}"); params.put(PushConstants.KEY_DEVICE_ID, "DEVICE-A73E9E2E9C6B11E4AFAEC55006B96D3C"); Read Push Message --------------------- .. c:function:: PushManager.getInstance().pushMessageReadConfirm (Context context, String notification); - 사용자가 메시지를 확인 하는 경우, 메시지 확인 전문을 전송한다. :param Context context: 현재 context :param String notification: 수신한 push message(JSONObject의 string값) .. c:function:: PushManager.getInstance().pushMessageReadConfirm (Context context, String notification, int badgeCountType); - 사용자가 메시지를 확인 하는 경우, 메시지 확인 전문을 전송하며, 서버와 badge count를 동기화 한다. .. versionadded:: 4.0 UPMC :param Context context: 현재 context :param String notification: 수신한 push message(JSONObject의 string값) :param int badgeCountType - badgeCountType key 값에 대한 설명 ================================ ========== =============================================================== Key Type Description ================================ ========== =============================================================== PushConstants.BADGE_TYPE_KEEP String 1개 읽음 처리, 다음 메시지 수신시, 동일한 값 유지(Default, -1 후 +1 이 됨) PushConstants.BADGE_TYPE_RESET String 입력 값으로 초기화, 다음 수신된 값은 입력값 +1로 처리됨 PushConstants.BADGE_TYPE_UPDATE String 카운트에 따라 업데이트 됨 (읽음여부에 상관없이, push 수신 ++) ================================ ========== =============================================================== Receive Push Message ------------------------ .. c:function:: PushManager.getInstance().pushMessageReceiveConfirm (Context context, String notification); - GCM Only - 메시지 수신 시 메시지 수신 전문을 전송한다. :param Context context: 현재 context :param String notification: 수신한 push message(JSONObject의 string값) .. c:function:: PushManager.getInstance().upnsMessageReceiveConfirm (Context context, String msgID); - UPNS Only - mqtt를 통해 수신한 메시지에 대한 응답 (Manifest.xml 에서 값이 "manual"인 경우 작동한다) :param Context context: 현재 context :param String msgID: 수신된 푸시 인텐트로부터 받은 MESSAGEID UPNS Subscribe -------------------- .. c:function:: PushManager.getInstance().upnsSubscribe(Context context); - UPNS Only - UPNS 서버에 subscribe 요청을 다시한다. (요청 시 오프라인 메시지 수신 [서버로 부터 발송이 실패되어 저장중인 메시지] – 부하가 될 수 있으므로 주의 사용) :param Context context: 현재 context Register Group -------------------- .. c:function:: PushManager.getInstance().registerUserGroup (Context context, String groupSeq); - 사용자 그룹에 등록한다. :param Context context: 현재 context :param String groupSeq: 등록하고자 하는 그룹의 sequence number UnRegister Group -------------------- .. c:function:: PushManager.getInstance().unregisterUserGroup (Context context, String groupSeq); - 사용자 그룹에서 등록을 해제 한다. :param Context context: 현재 context :param String groupSeq: 해제하고자 하는 그룹의 sequence number Init Badge Number -------------------------- .. c:function:: PushManager.getInstance().initBadgeNo (Context context, String badgeNo); - 서버의 Badge NO를 강제 셋팅 또는 초기화 - Badge NO 최소값 : 0 - Badge NO 최대값 : 1000 :param Context context: 현재 context :param String badgeNo: 서버에서 관리되는 뱃지 count에 대한 초기값 (0을 셋팅하는 경우, push수신시 1로 셋팅됨) Set DeviceBadge Count -------------------------- .. c:function:: PushManager.getInstance().setDeviceBadgeCount (Context context, String badgeNo); - 폰의 Badge NO를 표기함 - 폰의 설치된 런처에 따라, 작동하지 않을 수 있음 - Badge NO 최소값 : 0 - Badge NO 최대값 : 1000 :param Context context: 현재 context :param String badgeNo: 서버에서 관리되는 뱃지 count에 대한 초기값 (0을 셋팅하는 경우, push수신시 1로 셋팅됨) Get Reg Status -------------------------- .. c:function:: PushManager.getInstance().getPushRegStatus (Context context); - retry-regist-count 재시도 옵션이 auto 혹은 임의의 수일 경우 현재 등록 태스트의 상태 반환 - PushConstants.PushRegistStatus.REGISTER_RUNNING : 등록 수행중 상태 - PushConstants.PushRegistStatus.ALREADY_REGISTERED : 등록 완료 상태 - PushConstants.PushRegistStatus.NOT_REGISTERED : 미등록 상태 :param Context context: 현재 context 8. Push APIs 키값 정의 =================== ver 4.0 이상 ------------------- .. _BUNDLEKEY * 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 (gcm only) PushConstantsEx.COMPLETE_BUNDLE.IS_REGISTERED_SERVICE 서비스 등록 여부 (register service 호출 시, 수신 될 수 있음) PushConstantsEx.COMPLETE_BUNDLE.INITBADGENO 뱃지 넘버 초기화 PushConstantsEx.COMPLETE_BUNDLE.REG_GROUP 그룹 등록 PushConstantsEx.COMPLETE_BUNDLE.UNREG_GROUP 그릅 해제 ======================================================= =============================================================== .. _STATUSCODE: * BroadCastReceiver bundle key return 값 (STATUS CODE - 통신관련) ======================================================= =============================================================== 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 인증키 획득 오류 ======================================================= =============================================================== .. _BROADCASTINTENT: * 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 upmc 통신 이후, 수신된 메시지 ======================================================= =============================================================== 9. UPMC용 BroadcastReceiver 등록 방법 (예시) ======================================== receiver 등록 ------------- .. code-block:: java 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("서비스 정상 등록 상태 "); } } } }; // use-permission 설정에 따라 리시버 등록 API를 구분한다. PushConfigInfo config = PushManager.getInstance().getPushConfigInfo(this); if (config.usePermission()) { // 리시버 권한 사용 시 this.registerReceiver(mLoginBroadcastReceiver, intentFilter, this.getPackageName()+PushConstants.PERMISSION_PUSHSERVICE, null); } else { // 리시버 권한 미사용 시 this.registerReceiver(mLoginBroadcastReceiver, intentFilter); } } receiver 해제 --------- .. code-block:: java public void unregisterReceiver() { if (mLoginBroadcastReceiver != null) { this.unregisterReceiver(mLoginBroadcastReceiver); mLoginBroadcastReceiver = null; } } 10. UPNS Push Payload [ :ref:`UPNS` ] ============================ - 아래 기술된 메시지는 샘플에 대한 예시이며, 프로젝트에서 표현하고자 하는 방식에 따라, Interface 정의서에 의해, 변경이 가능함. - JSONObject key 값에 대한 설명 ================ =========================================================================== Key 활용방법 ================ =========================================================================== MESSAGE 메시지 타이틀로 이용 EXT 일반 메시지인 경우, 메시지로 이용가능하며, Rich 메시지인 경우, 세부 정보를 추가로 획득하여, 표현 SEQNO Push message의 고유 키값 PSID Push 서비스에 대한 고유 ID( :ref:`PSID`) APPID Push 서비스가 관리되는 앱 ID( :ref:`ApplicationID`) CUID 사용자 ID( :ref:`CUID`) PUBLIC Public 망을 이용하는 push 여부 SENDERCODE 발송자 코드 (서버관점) SENDDATE 발송된 시간 (서버관점) DB_IN DB에 저장 여부 (서버 관점) BADGENO 뱃지값 ================ =========================================================================== 일반(text) push 메시지 예시 -------------------------- { "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" } } 웹 브라우저 호출 push 메시지 예시 -------------------------- { "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" } } 이미지 push 메시지 예시 -------------------------- { "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" } } 11. UPNS Reallocate ============================ - 푸시 서버 버전 4.1이상에서 서버 장애 시 UPNS 재연결에 대한 동작 추가 (이하 버전에서는 해당 시나리오 동작안함.) - 재연결 3회 실패 시 랜덤한 시간 간격으로 UPMC에 새로운 UPNS IP/PORT를 요청 후 응답 정보를 이용하여 재연결 요청 Sequence Diagram ------------------- .. figure:: ../_static/push/android/upns/upns-reallocate.png 12. DOZE MODE 대응 ============================ - 안드로이드 6.0 에서 추가된 도즈 모드는 사용자가 화면을 끄고 일정 시간이 지나면 진입하게 되며, 이 상태에서는 네트워크 및 CPU 자원을 사용하지 못하도록 제한함. - 현재 공식적인(구글에서 제공된) 예외는 존재하지 않으므로, 도즈 모드에서 UPNS를 이용하기 위해 다음과 같은 설정이 필요함. - 필수 적용 사항 1. :ref:`Manifest.xml 설정` 2. :ref:`AndroidManifest.xml 설정` 3. :ref:`gcm dummy 알림을 위한 리소스 추가` 13. 방화벽 OPEN [for Client] ============================ - GCM:: android.googleapis.com 443,5228,5229,5230 - FCM:: fcm.googleapis.com 443,5228,5229,5230 - `FCM 참고 문서 `_ - 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번 옵션 권장): 1. IP 제한 없음 2. Google ASN 15169 에 나와 있는 IP 블록에 포함된 모든 IP 주소: 한 달에 한 번 이상 업데이트해야 합니다. - `Google ASN 15169 문서 `_