모든 문서(일반 문서, 분류 문서, 파일(이미지, 사운드 등) 문서) 분류가 달려 있어야 합니다.

--Administrator (토론)

Push 모듈 적용 가이드 (Android)

컴투스위키
이동: 둘러보기, 찾기
Com2uS 공통모듈 >> Push >> Push 모듈 적용 가이드 (iOS)

Push 모듈 적용 가이드 (Android)

Push 모듈 적용 가이드 (Unity)

>> Push 모듈 레퍼런스 가이드 (iOS)

Push 모듈 레퍼런스 가이드 (Android)

>> Queuing Single Push API

Android Push (GCM) Data Protocol

>> Push 샘플 가이드 (iOS)

Push 샘플 가이드 (Android)

>> Push FAQ

모듈 적용 전, Push 모듈 UI 및 기능 (Android) 문서 및 Push/기획 문서를 통해 Push 모듈의 동작 전반에 대한 이해가 필요하다.

(두 문서는 현재 리뉴얼 중입니다. 빠른 시일 내에 리뉴얼을 완료하도록 하겠습니다. --강주상 (토론) 2015년 3월 26일 (목) 16:46 (KST) )

목차

역사

<작성법 참고>
Version Date SVN Revision 담당자 변경 사항
3.6.4 2020-06-16 - 김현석
  • 백업으로 데이터가 복구되면서 기존 푸시 토큰 만료 전까지 신규 토큰을 획득하지 못하는 오류 수정
3.6.3 2020-03-12 - 김현석
  • AndroidX와 호환되도록 라이브러리를 변경 가이드
  • Firebase 라이브러리 버전 업데이트
    • Firebase : v15.0.1 -> v20.0.0
  • Google Play Services 라이브러리 버전 업데이트
    • Google Play Services : v15.0.1 -> v17.0.0
3.6.2 2020-01-23 - 김현석
  • 더이상 사용하지 않는 기능과 코드를 제거
3.6.1 2019-12-18 - 최지수
  • Android 10에서 잠금 화면 상태 시 푸쉬 메시지가 수신되지 않는 이슈 수정
3.6.0 2019-10-16 - 최지수
  • Google API 키를 암호화하여 사용하도록 개선
  • Push 내부 로직 개선
    • 유저 식별 중심의 ‘공지/야간공지’ 정의 시스템이 Push 토큰 중심 ‘공지/야간공지’ 로 정의되도록 개선되었습니다.
    • 내부적으로 토큰 정보 전달 프로토콜이 변경되었고 호출 시점이 변경되었습니다
  • 코드 상의 네트워크 통신을 위한 Url 문자열을 변조 처리

}

3.5.2 2019-06-25 - 최지수
  • 모듈 내부 네트워크 통신 시 mac 정보를 보내지 않도록 수정
  • C 플러그인 로직의 Android 64비트 시스템 대응
    • .c, .h 파일이 업데이트 되었습니다.
    • .a 라이브러리 파일이 5가지(arm64-v8a, armeabi, areabi-v7a, x86, x86_64)로 빌드 업데이트 되었습니다.
    • 적용 시 별도의 인터페이스 수정은 없습니다. 다만 내부 로직이 변경되었으니 업데이트 후 동작 확인을 부탁드립니다.

[라이브러리 및 리소스 배포 변경사항]

  • Android Studio 라이브러리 적용 [studio 설정 가이드]
    • .aar 파일을 적용하여 사용이 가능합니다.
    • 이클립스 프로젝트 환경의 라이브러리를 더이상 지원하지 않습니다.
  • 통합 리소스
    • 배포된 패키지에 있는 '/res_통합' 경로의 모든 리소스 파일을 프로젝트가 추가 바랍니다. [가이드 확인하기]
    • 배포된 패키지에 있는 '/res_수정설정' 경로의 모든 리소스 파일을 적용하는 프로젝트 성격에 맞게 내용을 수정하여 추가 바랍니다. [가이드 확인하기]

}

3.5.0 2019-03-14 2859 최지수

}

3.4.0edit 2018-11-02 2846 최지수
  • Push 모듈 변경사항 없음
  • 포함된 Firebase 11.2.0 라이브러리의 AndroidManifest.xml 내용 수정 [페이지 이동]

}

3.4.0 2018-08-31 2844 최지수
3.3.9 2018-05-02 2838 최지수
  • Android OS 2627 이상에서 BuildTarget 2627 이상 설정 시 Android Support v4 라이브러리의 NotificationCompat.Builder 생성자 형태 변경으로 초기화 시 크래시 이슈 수정 [라이브러리 설정 참고]
  • 특정 단말에서 Push 초기화 시 PackageManager의 queryIntentActivities 호출 시 간헐적으로 exception 발생하는 현상 예외 처리
3.3.8 2017-12-08 2828 최지수
  • HTTPS 프로토콜을 모든 기능에서 사용하도록 변경
3.3.6 2017-09-20 2820 최지수
  • Android OS 8.0 이상에서 백그라운드 서비스 제한을 하지 않도록 대응
  • Android OS 8.0 이상에서 Notification이 정상 표시될 수 있게 NotificationChannel을 사용하도록 대응
3.3.6 2017-09-20 2820 최지수
  • Android OS 8.0 이상에서 백그라운드 서비스 제한을 하지 않도록 대응
  • Android OS 8.0 이상에서 Notification이 정상 표시될 수 있게 NotificationChannel을 사용하도록 대응
3.3.5 2017-08-28 2816 최지수
  • 모듈 내부 서버통신 데이터에 통합 식별자 추가
3.3.4 2017-01-26 2803 정다운
  • 데이터 요청에 대한 네트워크 타임아웃 로직 추가
3.3.3 2016-11-21 2795 정다운
  • setUseThirdPartyPush(isUseThirdPartyPush = false) 를 호출하거나 setUseThirdPartyPush를 호출하지 않은 경우 setVID 메소드에서 ThirdPartyPush 관련 설정 로직을 우회하도록 수정
  • AmazonPush를 적용한 앱에서 VID 값이 수집되지 않는 버그 수정
  • GCM에서 senderId가 없을때 발생하는 exception을 catch할 수 있도록 상위 exception으로 수정
3.3.2 2016-05-26 2774 정다운
  • 야간, 공지 동의 널포인터 exception 처리
3.3.1 2016-04-12 2769 김규진
3.3.0 2016-03-17 2753 김규진
  • 광고성 Push 및 야간 Push에 대한 설정 기능 추가

(C2SPush.h 참고)

typedef enum {
    //... (중략)    
    USER_NOTICE  = 0x04,  //추가됨
    USER_NIGHT   = 0x08   //추가됨
    //... (중략)
   } Push_UserSetting;
3.2.3 2016-01-26 2749 김규진
  • 내부 로직 중 개별 서버 세팅값이 반영 되도록 수정
3.2.1 2016-01-04 2738 김규진
  • 로컬푸시 등록시 Action 값이 추가되어 로컬푸시 해제가 안되는 현상이 수정되었습니다.
  • 샌드박스 설정 기능이 추가 되었습니다.
이 부분은 ActiveUser 의 서버세팅을 따라가게 됩니다.
3.0.7 2015-08-26 2714 김규진
3.0.6 2015-08-20 2712 김규진
3.0.5 2015-08-10 2707 김규진
  • 이하 내부 로직 수정
    • vid 값을 저장하는 로직 수정
    • modulemanager 의 data 에 접근하는 방식 수정
    • main thread 에서 네트워크 호출이 일어날 수 있는 경우 수정
    • DID 요청시 synchronous 로 얻어오도록 수정
    • DeviceID 값을 얻어오지 못할 경우에 대한 예외처리 추가
3.0.3 2015-08-06 2706 김규진
  • 내부 코드 중 언어 코드 변환에 예외처리 추가
3.0.2 2015-06-23 2692 김규진
  • offline 모드에서 register 를 재시도 할 경우 크래시 나는 현상 수정

- GCMIntentService 에서 senderId 세팅 override 추가

  • non-ordered broadcast 에 대한 응답인 setResult 부분 주석 처리
3.0.1 2015-06-22 2691 박가진
  • setExtendsSenderIDs 를 사용할 경우,
- unique sender id 판별 중 array 비교 부분에서 항상 새로운 sender 로 판단하는 버그 수정
  • GCM code updated
  • 간헐적으로 앱 종료시 (destroy) forced closed 현상 수정
  • 새로 추가된 GCM APIs 에 해당하는 onRefreshToken 신호 예외처리 추가
- from = google.com/iid
  • ThirdPartyPush (Amazon, jPush) 를 사용할 경우,
- MCC 없는 단말에 대한 예외 처리 추가
3.0.0 2015-05-13 2666 김규진
  • ModuleManager 2.0.0 반영
  • AmazonPush(ADM) 통합
- amazon-device-messaging-1.0.1.jar 추가
- http://wiki.com2us.com/index.php/Push/Amazon_Push_통합
  • jPush (China) 통합
- external libs 추가
- http://wiki.com2us.com/index.php/Push/JPush_통합
  • ModuleManager 2.0.0 반영


  • API 변경 관련
  • Push 생성자를 singleTon 방식으로 변경
- 이로인해 과거 생성자들 모두 deprecated.
- getInstance() 사용
  • 객체 생성시 동작이 시작되는 부분을 분리하여, 모듈 동작이 시작되는 start() 추가
- setUseThirdPartyPush(boolean isUseThirdPartyPush),
setExtendsSenderIDs(String... senderIDs),
setUseTestServer(boolean useTestServer) 먼저 호출 후 사용
  • onActivityResumed(), onActivityPaused() 추가 (호출 필요)
  • 외부 sender id 지원을 위해 setExtendsSenderIDs() 추가
  • jPush, ADM 사용 flag 함수인 setUseThirdPartyPush() 추가
- ThirdPartyPush 종류 입력받지 않고, 클래스명 확인을 통해 사용 여부 결정하도록 수정
  • Lollipop 이상 단말에서 icon 세팅이 없을 경우에 small icon 으로 세팅 될 때, icon background color 세팅을 할 수 있는 기능 추가
- Local Push 는 jsonString, JSONObject, Bundle 타입만 지원
  • Lollipop 이상에서 Notification Icon 영역의 Background Color 세팅 프로토콜
- key : "icon_color"
- value : [string] jsonString
sub key1 : "r"
sub key2 : "g"
sub key3 : "b"
value : [number] 0~255 사이의 정수
  • 기타 버그 픽스


모든 버전의 역사 보기

공통 유의 사항

내용 없음.

Android 유의 사항

<작성법 참고>

AndroidManifest.xml 적용 시

총 4곳의 your-package-name 이라는 부분이 있으며, 이부분은 실제 project 의 packageName 으로 넣어주어야 한다. 사내에서 발급하는 appid 를 넣으면 안된다.
특히 modulemanager 에서 지정해준 appid 를 이곳에 넣으면 안된다.
가끔 .permission을 package-name 뒷부분에 빠뜨릴 수 있으니 주의!
<작성법 참고>

테스트 서버는 사용하지 않음

2가지의 생성자 중 Push(Activity activity, boolean useTestServer, boolean useCLibrary) 를 사용하여 2번째 boolean 값으로 설정이 가능한데, 내부 테스트용 및 특별한 상황에서 디버그용으로만 사용됨
<작성법 참고>

LocalPush 를 쓰지않는 등, C 쪽 함수를 쓰지 않아 C Library 를 제외 시켜야 할 경우

MainActivity.java 의 modulemanager 에서 수정.
ex) mModuleManager.setConfig(ModuleConfig.Push.NOT_USE_CLIBRARY);
ex) mModuleManager.setConfig(ModuleConfig.Push.USE_TEST_SERVER | ModuleConfig.Push.NOT_USE_CLIBRARY);
ModuleManager 참조.
<작성법 참고>

Log on / off 설정 방법

MainActivity.java 의 modulemanager 에서 수정.
mModuleManager.setLogged(boolean b);
mModuleManager.setConfig는 load 전에 호출되어야 합니다.
<작성법 참고>

Push v3.4.0 이상 사용 시 FCM 설정 방법

FCM 설정 시 크게 3가지 요소를 설정해야 합니다. (AndroidManifest.xml / fcm_settings.xml / Firebase프로젝트 참조)
아래 'Android 적용 방법' 내용을 꼭 확인바랍니다.
<작성법 참고>

Push v3.5.0 이상 사용 시 Push v4 에 대해

Push v3.5.0 부터는 기존의 Push 시스템(Push v1, AS-IS)이 아닌 새 Push 시스템(Push v4, TO-BE)를 제공합니다.
기존의 Push v1은 리모트 푸시를 사용 시 단말 식별자인 DID를 통해서 메시지 타겟팅을 하였다면, Push v4 는 유저 식별자인 UID를 통하여 메시지 타겟팅이 가능합니다.

Push v4 변경사항 그림설명.png

Push v4를 적용하기 위해 클라이언트 로직은 크게 수정할 필요 없습니다.
다만, Push v4를 사용하기 위해선 ActiveUser 모듈과 초기화 시점을 조정하고, 유저 식별자인 UID를 서버로 전송하는 새 API를 호출해야 합니다.
관련 내용은 아래 '파트 4''Android 적용 방법'에서 Push v3.5.0 적용 특이사항을 다루며 설명하도록 하겠습니다.

Android 적용 방법

Push가 필요로하는 외부 라이브러리 설정 (v3.3.9 이후부터)

  • Push v3.3.9부터 Android Support v4 라이브러리(27.1.0 버전)을 필요로 합니다.
    • Android 8.1.0 이상 버전 대응으로 Support v4 라이브러리의 NotificationCompat.Builder 클래스를 사용하게 되는데 26.x.x 버전에서 해당 클래스의 생성자 형태가 변경되어 AndroidManifest.xml에서 BuildTarget이 26 이상일 경우 ActiveUser.start 메서드 이후 크래시가 발생할 수 있습니다. (Push v3.3.9 이하에서 발생, BuildTarget이 26 미만일 경우 특이사항 없음)
    • BuildTarget 26 이상을 지원하기 위해 프로젝트에 포함된 Android Support v4 라이브러리(버전 27.1.0)를 참조 부탁드립니다.
    • Peppermint v2.6.7 이상을 사용하는 경우
      • Peppermint v2.6.7에 포함된 Facebook 4.18 라이브러리에는 동일한 Android Support v4 라이브러리가 포함되어 있습니다.
      • 중복 사용되어 빌드 시 에러가 나지 않도록 Facebook 4.18에 포함된 Android Support v4만 사용 부탁드립니다.
    • Push v3.3.9부터 참조하고 있는 Support v4 라이브러리 목록

push 3 3 9 libs.png

  • Push v3.4.0부터 GCM 서비스가 아닌 FCM을 사용하여 푸시를 작동합니다.
FCM을 사용하기 위해서는 서클 패키지에 포함된 3개의 Firebase 라이브러리와 3개의 빨간색으로 표시된 Google Play Services 라이브러리를 메인 프로젝트의 참조 프로젝트로 추가합니다. (만약 게임 프로젝트에서 PGS 기능이나 Google Plus등의 기능을 사용하고 있다면 아래의 Google Play Services 라이브러리 9개 모두를 추가해야 합니다.)

[Firebase]

Firebase-common v11.2.0
Firebase-iid v11.2.0
Firebase-messaging v11.2.0

[Google Play Services]

Play-services-base-11.2.0 (FCM 사용을 위해서는 필수)
Play-services-basement-11.2.0 (FCM 사용을 위해서는 필수)
Play-services-tasks-11.2.0 (FCM 사용을 위해서는 필수)
Play-services-auth-11.2.0
Play-services-auth-api-phone-11.2.0
Play-services-auth-base-11.2.0
Play-services-drive-11.2.0
Play-services-games-11.2.0
Play-services-plus-11.2.0

firebase v11 2 0 설정.png

각 라이브러리는 필수로 참조해야하는 하위 라이브러리가 존재합니다. 아래의 하위 라이브러리 참조 상태(Properties)를 확인하여 동일하게 설정합니다. (Firebase-common, Firebase-iid, Firebase-messaging)

firebase common v11 2 0 설정.png firebase iid v11 2 0 설정.png firebase messaging v11 2 0 설정.png

Google Play Services v11.2.0 라이브러리 설정 방법은 Android Peppermint 설정 페이지의 Google Play Services v11.2.0 설정 부분을 확인바랍니다.

  • Firebase v11.2.0 라이브러리 적용 시 firebase-common, firebase-iid 라이브러리의 AndroidManifest.xml 내에 applicationId 항목을 설정해야 합니다.
이클립스에서 빌드하는 경우 firebase-common, firebase-iid에 포함된 AndroidManifest.xml의 ${applicationId} 구문이 빌드되지 않습니다. 해당 위치에 packageName을 직접넣어 설정합니다.
Android Studio에서 빌드하는 경우${applicationId} 구문에 packageName이 자동으로 대체 됩니다.

firebase manifest applicationId입력필요부분.png

Jar 파일 추가

PushLibrary.jar (svn://devbackup.com2us.com/Wrapper_redist/program/templates/AndroidTemplate/Com2uSAndroid/module/Push/libs/)
modulemanager.jar (svn://devbackup.com2us.com/Wrapper_redist/program/templates/AndroidTemplate/Com2uSAndroid/module/ModuleManager/libs/)
PushUnityPlugin.jar(Unity3D) (svn://devbackup.com2us.com/Wrapper_redist/program/module/unity/Push/)

MainActivity.java

import com.com2us.module.push.Push;
import com.com2us.module.push.PushCallback;

public class MainActivity extends Activity implements PushCallback
{
        Push push = null;
        @Override
        public void onCreate(Bundle savedInstanceState) {
                //push = new Push(this); //deprecated in v3.0.0

                push = Push.getInstance(this);
                /** optional
                push.setLogged(false);
                push.setUseTestServer(false);
                push.setExtendsSenderIDs("1234567");
                push.setUseThirdPartyPush(false);
                */

                push.start();
        }

        @Override
        protected void onDestroy() {
                push.destroy();
        }

        @Override
        protected void onResume() {
                super.onResume();
                push.onActivityResumed();       // 3rdPartyPush가 통합되며 필요해진 부분
        }

        @Override
        protected void onPause() {
                push.onActivityPaused();        // 3rdPartyPush가 통합되며 필요해진 부분
                super.onPause();
        }
}

AndroidManifest.xml

  • targetSdkVersion의 값이 28 이상인 경우
    • application 태그에 usesCleartextTraffic 설정을 추가해야 합니다. (http:// 관련 통신이 가능하도록)
      <application
         .. (기타 설정) ..
         android:usesCleartextTraffic="true" />
  • Android Push v3.4.0 미만 버전에서 GCM 사용시
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="23" />

<permission android:name="your-package-name.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="your-package-name.permission.C2D_MESSAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

<application>
        <!-- Push begin -->
        <activity
           android:name="com.com2us.module.push.ShowMsgActivity"
           android:launchMode="singleInstance"
           android:theme="@android:style/Theme.Translucent" />
        <activity
           android:name="com.com2us.module.push.NotificationMessage"
           android:launchMode="singleInstance"
           android:theme="@android:style/Theme.Translucent" />
        <activity
           android:name="com.com2us.module.push.PushWakeLock"
           android:launchMode="singleInstance"
           android:theme="@android:style/Theme.Translucent" />

        <receiver
           android:name="com.com2us.module.push.LocalPushReceiver"
           android:process=":remote" />
        <receiver android:name="com.com2us.module.push.DeviceStatusReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.TIME_SET" />
                <category android:name="your-package-name" />
            </intent-filter>
        </receiver>
        <!-- GCM setting start -->
        <receiver
           android:name="com.google.android.gcm.GCMBroadcastReceiver"
           android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="your-package-name" />
            </intent-filter>
        </receiver>
        <service android:name="com.com2us.module.push.GCMIntentService" />
        <!-- GCM setting end -->
  <!-- Push end -->
</application>

Amazon Push, JPush 등의 3rd Party Push를 사용하는 경우, 여기를 참고하여 Permission 사용에 대한 설정을 한다. |Android.mk =

  • Android Push v3.4.0 이상 버전에서 FCM 사용시
Android P에서 GCM 서비스 기능을 더 이상 사용할 수 없어 FCM(Firebase Cloud Messaging) 기능을 사용합니다. (FCM setting 안에 packageName 설정 부분이 2군데 있습니다. 주의해주세요!)
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="23" />

<permission android:name="your-package-name.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="your-package-name.permission.C2D_MESSAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

<application>
        <!-- Push begin -->
        <activity
           android:name="com.com2us.module.push.ShowMsgActivity"
           android:launchMode="singleInstance"
           android:theme="@android:style/Theme.Translucent" />
        <activity
           android:name="com.com2us.module.push.NotificationMessage"
           android:launchMode="singleInstance"
           android:theme="@android:style/Theme.Translucent" />
        <activity
           android:name="com.com2us.module.push.PushWakeLock"
           android:launchMode="singleInstance"
           android:theme="@android:style/Theme.Translucent" />

        <receiver
           android:name="com.com2us.module.push.LocalPushReceiver"
           android:process=":remote" />
        <receiver android:name="com.com2us.module.push.DeviceStatusReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.TIME_SET" />
                <category android:name="your-package-name" />
            </intent-filter>
        </receiver>
        <!-- 기존의 GCM 설정 기능은 제거합니다. -->
        <!-- GCM setting start -->
        <!--<receiver
           android:name="com.google.android.gcm.GCMBroadcastReceiver"
           android:permission="com.google.android.c2dm.permission.SEND" >
           <intent-filter>
               <action android:name="com.google.android.c2dm.intent.RECEIVE" />
               <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
               <category android:name="your-package-name" />
           </intent-filter>
       </receiver>
       <service android:name="com.com2us.module.push.GCMIntentService" />-->
        <!-- GCM setting end -->
        <!-- FCM setting start -->
        <service android:name="com.com2us.module.fcm.MessagingService">
          <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
          </intent-filter>
        </service>
   
        <service
          android:name="com.google.firebase.iid.FirebaseInstanceIdService"
          android:exported="true" >
          <intent-filter android:priority="-500" >
                      <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
          </intent-filter>
        </service>
        <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                       <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
                       <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
                       <category android:name="com.com2us.hivesdk.normal.freefull.google.global.android.common"/> <!-- appid 설정 -->
            </intent-filter>
        </receiver>
     
        <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
             android:exported="false" >
             <intent-filter android:priority="-500">
                         <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
             </intent-filter>
        </receiver>
   
  <provider
           android:authorities="com.com2us.hivesdk.normal.freefull.google.global.android.common.firebaseinitprovider"
           android:name="com.google.firebase.provider.FirebaseInitProvider"
           android:exported="false"
           android:initOrder="100" /> <!-- authorities에 appid 설정 -->
        <!-- FCM setting end -->
  <!-- Push end -->
</application>

Resource

FCM 설정 파일(fcm_settings.xml)을 제외한 Resource 추가는 선택 사항임.
Android Push v3.4.0 이상 적용시 fcm_settings.xml은 필수입니다. 하단에 'fcm_settings.xml 설정' 내용을 확인해주세요!!
Push_모듈_UI_및_기능_(Android)#Custom_Popup 참고


fcm_settings.xml 설정
FCM 설정을 위해선 Firebase 콘솔 페이지(https://console.firebase.google.com)에 로그인하여 프로젝트를 등록합니다.
그 다음, 프로젝트 설정 항목에서 google-service.json 파일을 다운로드 합니다. (google-service.json 파일 다운로드 방법 : https://support.google.com/firebase/answer/7015592?hl=ko)
이후, 프로젝트의 /res/values 경로에 fcm_settings.xml 파일을 생성하고, google-service.json 파일을 열어 내용에 포함된 주요 키 값을 아래와 같이 설정합니다.
(gcm_defaultSenderId는 424963100196를 항상 사용하도록 설정 부탁드립니다.)
<!-- google-service.json 에서 fcm_settings.xml로의 키 매칭 -->
<!-- google-service.json 경로 : fcm_settings.xml 키 -->
<!-- (1) client > oauth_client > client_id : default_web_client_id -->
<!-- (2) project_info > firebase_url : firebase_database_url -->
<!-- (3) project_info > project_number : gcm_defaultSenderId (424963100196 고정)-->
<!-- (4) client > api_key > current_key : google_api_key -->
<!-- (5) client > client_info > mobilesdk_app_id : google_app_id -->
<!-- (6) project_info > storage_bucket : google_storage_bucket -->

<!-- fcm_settings.xml 설정 내용 -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="default_web_client_id" translatable="false">123456789101-a12bcd34e5fghijk67abcdefghi8abde.apps.googleusercontent.com</string>
   <string name="firebase_database_url" translatable="false">https://hive-sdk-1234567.firebaseio.com</string>
   <string name="gcm_defaultSenderId" translatable="false">424963100196</string>
   <string name="google_api_key" translatable="false">AbcdEfGHIjk0LMnopQRsTUv2Wx3YzabcD45eFGh</string>
   <string name="google_app_id" translatable="false">1:123456789101:android:1a234bd567ef8g9h</string>
   <string name="google_storage_bucket" translatable="false">hive-sdk-1234567.appspot.com</string>
</resources>
Customizing Dialog & Toast

Example Source ( push_dialog.xml )

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/pushdialog_root"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical"
   android:padding="10dp"
   android:background="#a0000000"
   >

    <TextView
       android:id="@+id/pushdialog_title"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:textColor="#FFF" />

    <LinearLayout
       android:id="@+id/pushdialog_body"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:orientation="horizontal"
       android:padding="10dp" >

        <ImageView
           android:id="@+id/pushdialog_icon"
          android:layout_width="wrap_content"
           android:layout_height="fill_parent"
           android:layout_marginRight="10dp" />

        <TextView
           android:id="@+id/pushdialog_msg"
          android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:textColor="#FFF" />
       
    </LinearLayout>
</LinearLayout>

xml 내용은 기획에 따라 변경 하고, 파일 이름과 아래에 해당하는 ID 값은 변경하면 안된다.

Customize Dialog

File Name : push_dialog.xml
Root Layout ID : pushdialog_root
(TextView) Title ID : pushdialog_title
(ImageView) Icon ID : pushdialog_icon
(TextView) Msg ID : pushdialog_msg


Customize Toast

File Name : push_toast.xml
Root Layout ID : pushtoast_root
(TextView) Title ID : pushtoast_title
(ImageView) Icon ID : pushtoast_icon
(TextView) Msg ID : pushtoast_msg


Customize Dialog의 경우, Dialog를 터치하면 해당 Push가 실행되고 Back버튼이나 Dialog 바깥을 터치하면 닫기가 된다. (Show, Close 버튼을 영역 터치로 대체)


Customizing Notification

Example Source ( push_notification.xml )

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content" >

    <!-- Icon/Photo -->
    <ImageView
       android:id="@+id/pushnotification_icon"
       android:layout_width="64dp"
       android:layout_height="64dp"
       android:layout_marginRight="8dp"
       android:scaleType="centerCrop" />
        <!--
       android:padding="8dp"
       android:background="#1E3740"
       -->
   
    <!-- Timestamp -->
  <TextView
       android:id="@+id/pushnotification_timestamp"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentRight="true"
       android:layout_marginTop="8dp"
       android:layout_marginLeft="4dp"
       android:layout_marginRight="8dp"
       android:textSize="12sp" />
 
    <!-- Title/Name -->
    <TextView
       android:id="@+id/pushnotification_title"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentTop="true"
       android:layout_toRightOf="@id/pushnotification_icon"
       android:layout_toLeftOf="@id/pushnotification_timestamp"
       android:layout_marginRight="4dp"
       android:ellipsize="end"
       android:maxLines="1"
       android:textColor="#FFFFFF"
       android:textSize="18sp"
       android:textStyle="bold" />
   
    <!-- SmallIcon -->
    <ImageView
       android:id="@+id/pushnotification_smallicon"
       android:layout_width="16dp"
       android:layout_height="16dp"
       android:layout_alignParentRight="true"
       android:layout_below="@id/pushnotification_timestamp"
       android:layout_marginLeft="4dp"
       android:layout_marginTop="8dp"
       android:layout_marginRight="8dp"
       android:layout_marginBottom="8dp"
       android:scaleType="centerCrop" />
   
    <!-- ContentInfo -->
    <TextView
       android:id="@+id/pushnotification_contentinfo"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_below="@id/pushnotification_timestamp"
       android:layout_toLeftOf="@id/pushnotification_smallicon"
       android:layout_marginTop="8dp"
       android:layout_marginBottom="8dp"
       android:text=""
       android:textSize="12sp" />

  <!-- Message -->
    <TextView
       android:id="@+id/pushnotification_msg"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_alignParentBottom="true"
       android:layout_toRightOf="@id/pushnotification_icon"
       android:layout_toLeftOf="@id/pushnotification_contentinfo"
       android:layout_below="@id/pushnotification_title"
       android:layout_marginRight="4dp"
       android:gravity="center_vertical"
       android:ellipsize="end"
       android:maxLines="2"
       android:textSize="14sp" />
   
    <!-- BigTextMessage -->
    <!--
   <TextView
       android:id="@+id/pushnotification_bigmsg"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_alignParentBottom="true"
       android:layout_toRightOf="@id/pushnotification_icon"
       android:layout_toLeftOf="@id/pushnotification_contentinfo"
       android:layout_below="@id/pushnotification_title"
       android:layout_marginRight="4dp"
       android:gravity="center_vertical"
       android:ellipsize="end"
       android:maxLines="2"
       android:textSize="14sp" />
   -->
   
</RelativeLayout>

xml 내용은 기획에 따라 변경 하고, 파일 이름과 아래에 해당하는 ID 값은 변경하면 안된다.

Customize Notification

File Name : push_notification.xml
(ImageView) Icon ID : pushnotification_icon
(TextView) Title ID : pushnotification_title
(TextView) Msg ID : pushnotification_msg
(TextView) BigMsg ID : pushnotification_bigmsg
(TextView) TimeStamp ID : pushnotification_timestamp
(TextView) Info ID : pushnotification_contentinfo
(ImageView) SmallIcon ID : pushnotification_smallicon

|main.xml = |string.xml =

게임 소스 (C, C++)

...
// 기본적으로 로컬푸시를 사용하지 않으면 아무 설정을 하지 않아도 된다.
// 나머지 함수들은 함수 설명 참조.
...

Push v3.5.0 이상 적용 시 필수사항 (Push v4)

Push v3.5.0 이상부터 Push v4가 적용된 로직을 따르며 이로 인해 몇 가지 지켜야할 필수 사항이 있습니다.

(1) ActiveUser 초기화가 먼저 완료된 후 Push 초기화를 진행

ActiveUser에서 약관 동의 시 'Push 공지 / Push 야간 공지' 동의 여부에 대한 정보를 Push 모듈이 수집할 수 있게 ActiveUser 초기화 완료 후 Push 모듈을 초기화 합니다.
(ActiveUser의 CS_ActiveUserStartEx() API 완료 후 Push의 CS_PushStartEx() API를 호출)
Push v3.5.0 이상부터 CS_PushStartEx() API가 새로 구성되었습니다. 기존의 CS_PushStart() API와 동일한 역할을 하나 호출 시점이 중요하니 꼭 확인바랍니다.
(CS_PushStartEx() API는 Unity 플러그인과 C 플러그인으로도 제공)

(2) 유저 식별자를 서버에 전달하는 API 호출

Push v3.5.0 이상부터 Push 고도화 시스템이 적용된 로직을 따르며 유저 식별 메시지 타겟팅을 위해 Push 서버로 UID를 전송해야할 필요가 있습니다.
UID 전송을 위해선 Push v3.5.0에서 새로 구성된 setUID(String uid)를 호출해야하며 호출 시점은 Peppermint 모듈을 통해 게스트 혹은 HIVE 로그인이 이루어진 후(Peppermint 로그인 성공 콜백은 받은 뒤) UID를 획득 한 후 입니다.

(3) HIVE 로그아웃 시 유저 식별자 정보를 초기화 할 수 있도록 API 호출

HIVE 유저가 로그아웃 시 Push v4 모듈과 서버가 로그아웃 상태임을 인지할 수 있도록 유저 식별자 정보를 초기화 해야할 필요가 있습니다.
HIVE 유저가 로그아웃 시 (2) 항목에서 호출하였던 setUID(String uid) API에 파라미터를 String uid = "" 혹은 String uid = null로 입력하여 호출해야 합니다.
(게스트 유저는 로그아웃이 없으므로 호출할 필요가 없습니다.)

(1), (2), (3) 에 해당하는 시점을 아래 플로우에서 확인할 수 있습니다.

  • 주의사항! CS_pushSetUid를 호출하여 UID에 푸시 관련 정보가 매칭된 후, CS_pushGetAgreeNotice/CS_pushGetAgreeNight를 호출하여 앱에서 푸신 여부 UI를 생성에 사용해주세요.
    • CS_pushSetUid 이전에 agree/night 값을 get하려는 경우 올바른 정보가 반환되지 않을 수 있습니다.

Push v4 주요API 호출시점.png

Android Studio 적용하기 (190625 배포 이후)

1) .aar 라이브러리 추가하기

  • 배포된 패키지에 있는 Push-x.x.x.aar 라이브러리를 프로젝트가 추가합니다.
    • build.gradle 설정에서 해당 .aar 파일을 implementation하여 빌드되도록 설정합니다.

2) 통합 리소스 및 수정설정 리소스 추가하기

  • 리소스 가이드에 있는 통합 리소스와 수정설정 리소스를 프로젝트에 추가합니다. [리소스 추가하기]

3) Push 라이브러리가 필요로하는 외부 라이브러리를 추가하기

  • Push 라이브러리는 Android Support 라이브러리 등 외부 라이브러리를 필요로 합니다. 아래 라이브러리를 build.gradle의 dependencies 항목에 추가하여 같이 사용하도록 합니다.
  • 또한 Android Push는 Firebase Cloud Messaging 서비스를 사용합니다. FCM은 구글 라이브러리를 추가로 필요로 합니다. 아래 라이브러리를 build.gradle의 dependencies 항목에 추가하여 같이 사용하도록 합니다.
//... (생략)...
dependencies {
  // ...(생략)...
  // Android Support 라이브러리
  implementation 'androidx.appcompat:appcompat:1.0.0'
  implementation 'androidx.legacy:legacy-support-v4:1.0.0'

  // FCM 라이브러리
  implementation 'com.google.firebase:firebase-iid:20.0.0'  // Push v3.6.3+
  implementation 'com.google.firebase:firebase-messaging:20.0.0'  // Push v3.6.3+
  // Google Play Services 라이브러리
  implementation 'com.google.android.gms:play-services-auth:17.0.0'  // Push v3.6.3+
  implementation 'com.google.android.gms:play-services-ads-identifier:17.0.0'  // Push v3.6.3+
}
//...(생략)...


4) gradle.properties 파일 내 androidX 사용 설정

  • gradle.properties 파일 내 아래의 코드를 추가하세요. gradle.properties 파일이 존재하지 않는 경우 신규 생성 후 아래의 코드를 추가하세요.
android.useAndroidX=true
android.enableJetifier=true

Debug

  • Push
Push의 기본적인 로그가 찍히는 Tag


Known Bugs

  • 게임이 Recent 항목에 남아있을 때 화면이 잠겨진 상태에서 web을 띄우는 Popup이 노출되어 확인을 눌러 web을 띄웠을 때, Recent 항목에서 게임이 사라지고 WebBrowser만 남는 현상. (게임은 그대로 Pause 상태 유지)
  • 정상종료시엔 남아있지만, 강제종료 시 등록된 LocalPush 가 사라집니다. 단말 재부팅이나 어플실행시 다시 등록됩니다.



Com2uS 공통모듈 >> Push >> Push 모듈 적용 가이드 (iOS)

Push 모듈 적용 가이드 (Android)

Push 모듈 적용 가이드 (Unity)

>> Push 모듈 레퍼런스 가이드 (iOS)

Push 모듈 레퍼런스 가이드 (Android)

>> Queuing Single Push API

Android Push (GCM) Data Protocol

>> Push 샘플 가이드 (iOS)

Push 샘플 가이드 (Android)

>> Push FAQ
개인 도구
이름공간

변수
행위
둘러보기
도구모음
인쇄/내보내기