노블의 개발이야기

[Android] Google Cloud Messaging (GCM): Set up a GCM Client App on Android 본문

Android

[Android] Google Cloud Messaging (GCM): Set up a GCM Client App on Android

더플러스 2018. 4. 25. 02:03

Google Cloud Messasing (GCM) Android 클라이언트는 Android 기기에서 실행되는 클라이언트 앱입니다. 클라이언트 코드를 작성하려면 GoogleCloudMessaging API 및 Android Studio with Gradle을 사용하는 것이 좋습니다.

GCM Android 클라이언트를 실행하기 위한 요구 사항은 다음과 같습니다.

  • GCM을 사용하려면 Google Play Store 앱이 설치된 Android 2.2 이상을 실행하는 기기 또는 Google API가 있는 Android 2.2를 실행하는 에뮬레이터가 필요합니다. Google Play Store를 통해 Android 애플리케이션을 배포하는 경우에만 국한되지 않습니다.
  • 하지만 Google Play Service를 통해 배포되는 새로운 GCM 기능을 계속 사용하려면 기기가 2.3 이상을 실행 중이어야하며 Google API가 있는 Android 2.3을 실행하는 에뮬레이터를 사용해야합니다.
  • Android 기기에서 GCM은 Google 서비스에 대한 기존 연결을 사용합니다. 3.0 이전 버전 기기의 경우 사용자가 휴대 기기에 Google 계정을 설정해야합니다. Android 4.0.4 이상을 실행하는 기기에서는 Google 계정이 필요 없습니다.

앱 개발에서 Android 8.0 (API Level 26) 이상을 타켓으로 하는 경우 Firebase Cloud Messaging (FCM)을 사용하십시오. 그렇지 않으면 IntentService 대신 JobIntentService 클래스를 사용하여 토큰 새로 고침을 처리하십시오.

전체 GCM 구현에는 클라이언트 구현 및 서버 구현이 모두 필요합니다. 서버 측 구현에 대한 자세한 내용은 GCM 연결 서버 정보를 참조하십시오.

다음 섹션에서는 Android에서 GCM 클라이언트 애플리케이션을 작성하는 단계에 대해 설명합니다. 최소한 GCM 클라이언트 애플리케이션에는 등록 코드 (등록 토큰 가져 오기) 코드와 GCM에서 보낸 메시지를 수신하는 수산자(Receiver)가 있어야합니다.


WakefulBroadcastReceiver를 확장하는 기존 앱의 경우 GCMReceiver 및 GcmListenerService로 마이그레이션하는 것이 좋습니다.

마이그레이션 하는 방법

  • 앱 매니페스트에서 GcmBroadcastReceiver를 'com.google.android.gms.GcmReciever'로 바꾸고 IntentService를 확장하는 현재 서비스 선언을 새 GcmListenerService로 바꿉니다.
  • 클라이언트 코드에서 BroadcastReceiver 구현을 제거합니다.
  • GcmListenerService를 사용하도록 현재 IntentService 서비스 구현을 리펙토링합니다.

Create an API project

새로운 Cloud Messaging 프로젝트는 Firebase 콘솔에 Firebase 프로젝트를 생성해야합니다. 이 프로세스에서는 프로젝트의 구성 파일과 자격 증명을 생성합니다.

  1. Firebase 프로젝트를 아직 가지고 있지 않은 경우 Firebase 콘솔에 Firebase 프로젝트를 생성하십시오. 모바일 앱과 연결된 기존 Google 프로젝트가 있는 경우 Google 프로젝트 가져오기를 클릭합니다. 그렇지 않으면 새 프로젝트 만들기를 클릭합니다.
  2. Android 앱에 Firebase 추가를 클릭하고 설정 단계를 따르십시오. 기존 Google 프로젝트를 가져오는 경우 이 작업은 자동으로 수행될 수 있으며 설정 파일을 다운로드 할 수 있습니다.
  3. 메시지가 표시되면 앱의 패키지 이름을 입력하십시오. 앱이 사용하는 패키지 이름을 입력하는 것이 중요합니다. 이 설정은 Firebase 프로젝트에 앱을 추가 할 때만 설정할 수 있습니다.
  4. 마지막으로 google-services.json 파일을 다운로드합니다. 이 파일은 언제든지 다시 다운로드 할 수 있습니다.
  5. 설정 파일을 프로젝트의 모듈 폴더 (일반적으로 app/)에 복사하십시오.

Note: 새 프로젝트의 Project settings > Cloud Messaging 에서 서버 키를 사용할 수 있습니다. 이 키를 응용프로그램 서버에 안전하게 저장하십시오. 다운 스트림 메시지를 클라이언트 응용프로그램에 보내려면 이 키가 필요합니다.

Add the configuration file to your project

Gradle 용 Google Service Plugin은 google-services.json 파일의 구성 정보를 구문 분석합니다. 다음과 같이 최상위 build.gradle 및 앱 레벨 build.gradle 파일을 업데이트하여 클러그인을 프로젝트에 추가하십시오.

프로젝트-레벨의 build.gradle에 dependency를 추가합니다.

classpath 'com.google.gms:google-services:3.1.0'


Google Service Plugin 3.2.0 이상에서는 Firebase Console > GROW > Cloud Messaging으로 전송되는 메시지는 수신하지 않습니다.


앱-레벨의 build.gradle에 플러그인을 추가합니다.

apply plugin: 'com.google.gms.google-services'

Set Up Google Play Services

클라이언트 앱을 작성하려면 GoogleCloudMessaging API를 사용하십시오. 이 API를 사용하려면 Google Play Service SDK 설정에 설명 된대로 Google Play Service SDK를 사용하도록 프로젝트를 설정해야합니다.

GCM Play Services 라이브러리를 프로젝트에 추가할 때 Google Play Service SDK 설정에 설명 된 대로 리소스를 추가해야합니다. 요점은 라이브러리를 참조해야한다는 것입니다. 단순히 .jar 파일을 프로젝트에 추가하면 작동하지 않습니다. Android Studio를 사용하는 경우 애플리케이션의 build.gradle 파일의 종속성 섹션에 추가할 문자열입니다.

dependencies {
  compile "com.google.android.gms:play-services-gcm:15.0.0"
}

이 예는 GCM 앱 개발을 지원하는데 필요한 유일한 라이브러리인 GCM 관련 라이브러리를 참조하는 방법을 보여줍니다. 전체 Play Services 라이브러리 대신 이것을 사용하고 최신 버전을 참조하고 있는지 확인하십시오.

Edit Your Application's Manifest

응용프로그램의 매니페스트에 다음을 추가합니다.

  • GcmReceiver 선언 : GCM에서 애플리케이션으로 보낸 메시지를 처리합니다. 이 서비스는 GCM에서 메일을 수신 할 수 있는 권한이 필요하므로 Receiver에 com.google.android.c2dm.permission.SEND를 추가합니다.
  • GcmListenerService 선언 : 다양한 다운 스트림 메시지 유형 감지, 업스트림 보내기 상태 확인, 앱을 대신하여 간단한 알림 표시 등 다양한 방식으로 메시지를 처리할 수 있습니다.
  • InstanceIDListenerService를 확장하는 서비스 : 등록 토큰의 생성, 회전 및 업데이트를 처리합니다.
  • 응용프로그램에서 메시지를 수신하는 동안 프로세서가 깨어 있어야하는 경우 android.permission.WAKE_LOCK 권한을 사용하도록 선택할 수 있습니다.
  • GCM 기능이 Anrdoid 애플리케이션 기능에 중요한 경우 매니페스트에서 android:minSdkVersion="8" 이상으로 설정해야합니다. 이렇게 하면 Android 응용프로그램을 제대로 동작하지 않는 환경에는 설치할 수 없습니다.

다음은 GCM을 지원하는 매니페스트의 예입니다.

<manifest package="com.example.gcm" ...>

    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/>
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application ...>
        <receiver
            android:name="com.google.android.gms.gcm.GcmReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.example.gcm" />
            </intent-filter>
        </receiver>
        <service
            android:name="com.example.MyGcmListenerService"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>
        <service
            android:name="com.example.MyInstanceIDListenerService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.android.gms.iid.InstanceID" />
            </intent-filter>
        </service>
        <service
            android:name="gcm.play.android.samples.com.gcmquickstart.RegistrationIntentService"
            android:exported="false">
        </service>
    </application>

</manifest>

4.4 Kitkat 이전 장치를 지원하려면 Receiver의 intent filter 선언에 다음 action을 추가하십시오.

<action android:name="com.google.android.c2dm.intent.REGISTRATION" />

Check for Google Play Services APK

Google Play Service 기능을 사용하기 전에 Play Service SDK를 사용하는 앱은 기기에서 호환되는 Google Play Service API를 항상 확인해야합니다. 이 작업은 Main Activity의 onCreate() 메서드와 onResume() 메서드의 두 위치에서 수행하는 것이 좋습니다. onCreate()에서 확인하는 것은 앱이 성공적으로 확인되지 않으면 사용할 수 없음을 보증합니다. onResume()에서 확인하는 것은 사용자가 뒤로 가기 버튼 등의 다른 방법을 통해 실행 중인 앱으로 돌아 가면 검사가 여전히 수행됨을 보장합니다. 기기에 호환되는 Google Play Service APK가 없는 경우 앱에서 GooglePlayServiceUtil.getErrorDialog()를 호출하여 사용자가 Google Play Store에서 APK를 다운로드하거나 기기의 시스템 설정에서 사용하도록 허용할 수 있습니다. 코드 예는 Google Play Service SDK 설정을 참조하세요.

Obtain a registration token

Android 애플리케이션은 메시지를 받기 전에 GCM 연결 서버에 등록해야합니다. 응용프로그램이 등록되면 등록 토큰을 수신하여 응용프로그램 서버로 전송합니다. 클라이언트 응용프로그램에는 등록 토큰이 서버로 전송되었는지 여부를 나타내는 Boolean 값을 저장해야합니다.

Google은 등록 토큰 생성 및 업데이트를 처리할 수 있는 Instance ID API를 제공합니다. 이 API를 사용하려면 매니페스트에 InstanceIDListenerService를 포함시킵니다.

<service android:name="[.MyInstanceIDService]" android:exported="false">
  <intent-filter>
         <action android:name="com.google.android.gms.iid.InstanceID"/>
  </intent-filter>
</service>

토큰을 얻으려면 instanceID.getToken을 호출하고 앱 서버의 sender ID를 제공하고 범위(scope)를 GoogleCloudMessaging.INSTANCE_ID_SCOPE로 설정합니다. 메인 스레드에서 이 메소드를 호출하지 말고 다음과 같이 IntentService를 확장하는 서비스를 사용하십시오.

public class RegistrationIntentService extends IntentService {
    // ...

    @Override
    public void onHandleIntent(Intent intent) {
        // ...
        InstanceID instanceID = InstanceID.getInstance(this);
        String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
RegistrationIntentService.java

        // ...
    }

    // ...
}

등록 토큰을 받으면 서버로 보내십시오. GCM 등록 토큰이 새로 고쳐지면 listener service의 onTokenRefresh 메소드가 호출되어야 합니다.

@Override
public void onTokenRefresh() {
    // Fetch updated Instance ID token and notify our app's server of any changes (if applicable).
    Intent intent = new Intent(this, RegistrationIntentService.class);
    startService(intent);
}

onTokenRefresh가 호출되면 InstanceID.getToken()을 사용하여 새 등록 토큰을 얻은 다음 새 토큰을 응용프로그램 서버로 보냅니다. 이 API에 대한 자세한 내용은 인스턴스 ID API 참조하십시오.

GCM register()는 deprecated 되었습니다. InstanceID를 사용하여 일반적인 GCM 등록 관리를 수행하십시오.

Next steps

클라이언트 응용프로그램이 연결되면 다운스트림 메시지를 수신하고 업스트림 메시지를 보낼 준비가 된 것입니다. GCM 옵션에 대한 자세한 내용은 Topic MessagingDevice Group Messaging, 클라이언트 및 서버 API 정보를 참조하십시오.

참고 사이트


Comments