Skip to content
Sangyong Gwak edited this page Feb 22, 2015 · 27 revisions

본 가이드는 안드로이드 개발자를 위한 페이지이며 SDK를 Import하여 앱을 쉽게 개발하기 위한 가이드입니다.

가이드를 보실 때에 Startup Project소스와 비교하시면 쉽게 이해가 될 것입니다.

baas.io Android SDK 는 오픈소스로 제공되고 있습니다. SDK 코드의 수정이나 개선된 내용은 pull request 를 요청하세요. android 개발자 여러분의 참여를 환영합니다.

※ 시작하기 전에 알아두기

  • baas.io에 가입이 필요합니다. baas.io 가입 페이지에서 가입하실 수 있습니다.
  • Android ADT 및 SDK를 항상 최신으로 유지하는 것을 권장합니다. 개발툴은 "Get the Android SDK"를 확인하시기 바랍니다.
  • Text file encoding 방법이 UTF-8 기준으로 개발되어 있습니다. 사용하시는 개발툴의 Text file encoding 설정이 UTF-8로 되어 있는지 확인합니다.
  • 처음 개발하실 때에는 baas.io Startup Project를 다운받아 사용하실 것을 권장합니다.

새로운 프로젝트 생성하기

baas.io를 이용하여 개발할 App의 프로젝트를 생성합니다.

  1. "New-Android Application Project"를 선택하여 새로운 Project를 생성합니다.

<New android application project>

  1. "New Android Application"에서 필요한 정보를 넣어 주고 "Finish"를 눌러 프로젝트를 생성합니다.

<New android application 다이얼로그>


baas.io Android SDK와 연동하기

앞에서 생성한 프로젝트와 baas.io Android SDK를 연동합니다. Import하는 방법은 jar 라이브러리로 Import하는 방법과 Project로 Import하는 방법이 있습니다.

Jar 라이브러리로 Import하면 쉽게 개발 환경을 구성할 수 있는 장점이 있습니다. 반면, Project로 Import하시면 디버깅하실 때에, SDK 소스까지 함께 디버깅할 수 있고, 로그 정보도 쉽게 확인할 수 있다는 장점이 있습니다. 따라서, Project로 Import하는 방법은 Android 개발에 익숙하신 분들께 권해드립니다.

※ Project로 Import하실 경우 주의점

  • Project로 Import하실때 주의하실 점은 빌드할 때 생성되는 BuildConfig.java의 DEBUG 값이 true로 기본설정 됩니다.
  • DEBUG가 true로 설정되어 있으면, baas.io와 통신하는 모든 로그 정보가 Logcat으로 표시되니, 출시전에는 꼭 DEBUG를 false로 수정하시기 바랍니다.

Eclipse 개발환경

Eclipse를 개발도구로 사용하시는 분들은 이 가이드를 따르시면 됩니다.

Import하는 방법은 jar 라이브러리로 연동하는 방법과 Project로 연동하는 방법 두 가지가 있습니다.

1. Jar 라이브러리로 연동하기

jar 라이브러리를 Import하는 방법은 ADT 버전 22에서는 추가적으로 Build Path를 설정해 주어야 합니다. 이전 버전은 "Step 3. Build path 설정"을 하지 않아도 됩니다.

Step 1. 라이브러리 파일 다운로드
  1. 라이브러리 최신 버전은 이 링크에서 다운로드 할 수 있습니다.
  2. 다운로드 받은 zip파일을 원하는 위치에 압축해제합니다.
Step 2. 라이브러리 파일들을 프로젝트로 복사
  1. 생성된 프로젝트에 libs 폴더를 생성하고 다운로드 받은 jar파일을 복사합니다.
  2. Eclipse ADT에서 libs폴더가 보이지 않으면 프로젝트를 선택하여 F5를 눌러 refresh합니다.
Step 3. Build path 설정(ADT 22)
  1. Package Explorer 화면에서 생성된 프로젝트를 선택하고 Properties를 선택합니다.

  2. Properties에서 Java Build Path를 선택합니다.

  3. Order에서 Android Private Libraries 항목이 체크가 안되어 있다면 체크하고 확인을 선택합니다.

    <Java Build Path 설정>

Step 4. 완료

연동을 위한 설정이 완료되었습니다. 하지만 baas.io를 이용하기 위해서는 기본설정이 필요합니다.

아래 링크를 눌러 기본설정을 해보겠습니다.

※ 라이브러리 파일

다운로드 받은 라이브러리 파일들은 아래와 같습니다.

  • baasioandroid.jar - baas.io의 Core 라이브러리 입니다.
  • gcm.jar - Push 서비스를 위한 Google Cloud Messaging 라이브러리입니다.
  • jackson-core.asl-1.9.1.jar, jackson-mapper-asl-1.9.1.jar - JSON 파서로 Jackson을 사용하고 있습니다.
  • spring-android-core-1.0.1.RELEASE.jar, spring-android-rest-template-1.0.1.RELEASE.jar - 서버 통신 모듈은 Spring for android를 사용하고 있습니다.
  • slf4j-android-1.6.1-RC1.jar - 로그를 위한 모듈입니다.

2. Project로 연동하기

Project로 Import합니다. baas.io Android SDK의 소스코드를 직접 연동하여 디버깅을 할 수 있습니다.

Step 1. 소스 다운로드하기
  • 방법1: git clone

    baas.io android SDK 는 오픈 소스로 제공됩니다. clone을 받으시거나 fork를 하셔서 자유롭게 이용하실 수 있습니다.

      git clone https://github.com/baasio/baas.io-sdk-android.git
    
  • 방법2: 압축(Zip) 파일 다운로드

    아래의 링크에서 zip파일을 다운로드 받아 원하는 위치에 압축해제 합니다.

      https://github.com/baasio/baas.io-sdk-android/archive/master.zip
    
Step 2. SDK 프로젝트 Import
  1. "File-Import" 를 선택합니다.

    <Import>

  2. Import 다이얼로그에서 "General-Existing Projects into Workspace"를 선택하고 "Next"버튼을 선택합니다.

    <Existing Projects into Workspace>

  3. 다음 Import 다이얼로그 화면에서 "Select root directory"의 "Browse"버튼을 눌러 다운로드 받은 SDK 폴더를 선택하고, "Projects:"에서 BaasioAndroid 프로젝트를 선택하고 "Finish"를 선택합니다.

    <Import BaasioAndroid project>

  4. "Project-Clean..."하여 Clean Build하면 bin 폴더에 baasioandroid.jar 파일이 생성됩니다.

Step 3. 생성한 프로젝트와 연동
  1. 생성된 프로젝트에서 오른쪽 마우스를 클릭하여 Properties를 선택합니다.

    <Properties 다이얼로그>

  2. Properties 다이얼로그에서 Android를 선택하고 아래에 있는 Library에서 Add버튼을 선택합니다.

    <Import>

  3. Projection Selection 다이얼로그에서 BaasioAndroid 프로젝트를 선택하고, "OK"를 선택합니다.

    <Import>

  4. BaasioAndroid 프로젝트의 libs 폴더에서 jar 파일들을 복사하여, 새로 생성한 프로젝트의 libs 폴더에 복사합니다.

    <Copy>

    jar 파일들을 복사

    <Paste>

    복사한 jar 파일들을 붙여넣기

Step 4. 완료

연동을 위한 설정이 완료되었습니다. 하지만 baas.io를 이용하기 위해서는 기본설정이 필요합니다.

아래 링크를 눌러 기본설정을 해보겠습니다.


Android Studio, Intellij 개발환경

Eclipse를 개발도구로 사용하시는 분들은 이 가이드를 따르시면 됩니다.

Import하는 방법은 jar 라이브러리로 연동하는 방법과 Project로 연동하는 방법 두 가지가 있습니다.

1. Jar 라이브러리로 연동하기

Step 1. 라이브러리 파일 다운로드
  1. 라이브러리 최신 버전은 이 링크에서 다운로드 할 수 있습니다.
  2. 다운로드 받은 zip파일을 원하는 위치에 압축해제합니다.
Step 2. 라이브러리 파일들을 프로젝트로 복사
  1. 생성된 프로젝트에 libs 폴더를 생성하고 다운로드 받은 jar파일을 복사합니다.

    <Android Studio library copy>

Step 3. Project Structure 설정
  1. 아래의 그림과 같이 Project Structure를 클릭합니다.

    <Android Studio Step3>

  2. Modules > Dependencies 탭 > "+"버튼 클릭 > Jars or directories…를 선택합니다.

    <Android Studio Step4>

  3. libs 폴더의 모든 jar를 선택하여 추가되도록 설정합니다.

    <Android Studio Step5>

  4. OK를 선택하여 완료합니다.

    <Android Studio finish>

Step 4. 완료

연동을 위한 설정이 완료되었습니다. 하지만 baas.io를 이용하기 위해서는 기본설정이 필요합니다.

아래 링크를 눌러 기본설정을 해보겠습니다.


Project로 연동하기

Project로 Import합니다. baas.io Android SDK의 소스코드를 직접 연동하여 디버깅을 할 수 있습니다.

Step 1. 소스 다운로드하기
  • 방법1: git clone

baas.io android SDK 는 오픈 소스로 제공됩니다. clone을 받으시거나 fork를 하셔서 자유롭게 이용하실 수 있습니다.

git clone https://github.com/baasio/baas.io-sdk-android.git
  • 방법2: 압축(Zip) 파일 다운로드

아래의 링크에서 zip파일을 다운로드 받아 원하는 위치에 압축해제 합니다.

https://github.com/baasio/baas.io-sdk-android/archive/master.zip
Step 2. Project Structure의 Import Module
  1. 아래의 그림과 같이 Project Structure를 클릭합니다.

    <Android Studio Project Import Step2>

  2. Modules > "+"버튼을 클릭하여 Import Module을 선택합니다.

    <Android Studio Project Import Step3>

  3. Select File or Directory to Import 다이얼로그에서 다운로드 받은 BaasioAndroid 프로젝트를 선택합니다.

    <Android Studio Project Import Step4>

  4. Import Module 다이얼로그에서 "Create module from existing sources"를 선택하여 Next를 선택합니다.

    <Android Studio Project Import Step5-1>

  5. 다음 화면에서 아래 그림과 같이 Next를 선택합니다.

    <Android Studio Project Import Step5-2>

    <Android Studio Project Import Step5-3>

    <Android Studio Project Import Step5-4>

  6. 마지막 화면에서 Finish를 클릭하여 완료합니다.

    <Android Studio Project Import Step5-5>

Step 3. Project Structure의 Module Dependency
  1. 내가 생성했던 프로젝트를 선택하고 Module Dependency를 선택합니다.

    <Android Studio Project Import Step6>

  2. Step 2를 통해 Import한 BaasioAndroid를 선택합니다.

    <Android Studio Project Import Step7>

  3. OK버튼을 눌러 설정을 완료합니다.

    <Android Studio Project Import Step7>

Step 4. 완료

연동을 위한 설정이 완료되었습니다. 하지만 baas.io를 이용하기 위해서는 기본설정이 필요합니다.

아래 링크를 눌러 기본설정을 해보겠습니다.


기본 설정

baas.io Android SDK를 이용하기 위해서는 간단한 기본 설정이 필요합니다.

기본적인 baas.io의 기본적인 데이터 서비스를 사용하기 위해서는 Android 앱의 전역 클래스인 Application를 상속받아 baas.io().init()을 호출하여 초기화해 줘야합니다. 또한, baas.io의 Push기능을 사용하기 위해서는 baas.io().setGcmEnabled()을 호출해줘야합니다.

다만, Push를 이용하기 위해서는 GCM관련 모듈을 추가 구현해야합니다. Startup Project 또는 Sample Project에는 기본적인 GCM(Google Cloud Messaging)관련 모듈이 최적화되어 적용되어 있으니, 참고하여 개발하실 것을 권장합니다.

GCM에 대한 기타 자세한 내용은 Android 개발자 사이트의 Google Cloud Messaging for Android를 참고하시기 바랍니다.

Step 1. BaasioConfig.java 생성

원하시는 위치에 BaasioConfig.java를 생성합니다. (Android 개발에 익숙하지 않으신 분들은 앱의 기본 패키지 경로에 생성하시길 권해드립니다.)

BaasioConfig.java에는 baas.io를 이용하기 위한 기본 값들을 설정합니다. 아래 코드를 참고하시고, 복사하여 붙여넣기하여 사용하실 때에는 {package명}를 개발하시는 앱의 package명으로 수정하시기 바랍니다.

package {package명};

public class BaasioConfig {
    public static final String BAASIO_URL = "https://api.baas.io";

    // baas.io member ID
    public static final String BAASIO_ID = "PUT_YOUR_BAASIO_MEMBER_ID";

    // baas.io application ID
    public static final String APPLICATION_ID = "PUT_YOUR_APPLICATION_ID";

    // GCM(google cloud messaging service) sender ID
    public static final String GCM_SENDER_ID = null;

}

PUT_YOUR_BAASIO_MEMBER_ID 부분을 baas.io ID로 바꿉니다. 아래 화면의 baas.io ID에 표시된 UUID 형태의 값을 넣어주시면 됩니다.(email 주소가 아닙니다.)

PUT_YOUR_APPLICATION_ID 부분을 baas.io에 생성한 백엔드앱의 아이디로 바꿉니다. 아래 화면의 Appliation ID에 표시된 UUID 형태의 값을 넣어주시면 됩니다.

<ID수정>

Step 2. BaasioApplication.java 생성

원하시는 위치에 BaasioApplication.java를 생성합니다. (Android에 익숙하지 않으신 분들은 앱의 기본 패키지 경로에 생성하시길 권해드립니다.)

BaasioApplication은 android.app.Application 클래스를 상속받습니다. 앱이 완전히 종료되었다가 실행될때 onCreate()의 코드가 수행되며, 완전히 종료될때는 onTerminate()의 코드가 수행됩니다.

1. 초기화 및 종료 처리

onCreate()에서 Baas.io().init()을 호출하여 baas.io 계정과 애플리케이션 ID를 설정하여 baas.io기본 데이터 서비스를 이용할 수 있도록 설정합니다.

앱이 종료되는 시점인 Application.onDestroy()에서는 Baas.io().uninit()을 호출하여 정상 종료될 수 있도록 설정합니다.

아래 코드를 복사하여 사용하실 때에는 {package명}를 개발하시는 앱의 package명으로 수정하시기 바랍니다.

package {package명};

import com.kth.baasio.Baas;
import com.kth.baasio.callback.BaasioDeviceCallback;
import com.kth.baasio.entity.push.BaasioDevice;
import com.kth.baasio.exception.BaasioException;
import com.kth.common.utils.LogUtils;

import android.app.Application;
import android.os.AsyncTask;

public class BaasioApplication extends Application {
	...

	@Override
	public void onCreate() {
		super.onCreate();

		...
		Baas.io().init(						//baas.io 초기화
				this	
				, BaasioConfig.BAASIO_URL		//baas.io의 api서버 주소 
				, BaasioConfig.BAASIO_ID				//baas.io에 가입한 id
				, BaasioConfig.APPLICATION_ID			//baas.io에 생성한 애플리케이션 id
			);
		...
	}

	...

	@Override
	public void onTerminate() {
		...
        Baas.io().uninit(this);					//baas.io 종료			
		...
        super.onTerminate();
    }

	...		
}

2. AndroidManifest.xml 수정

AndroidManifest.xml파일은 앱이 실행되는데 꼭 필요한 정보를 담고있는 파일입니다.

자세한 내용은 AndroidManifest.xml페이지를 참고하시기 바랍니다.

먼저, 생성된 BaasioApplication 클래스를 AndroidManifest.xml의 태그에 등록합니다.

그리고, 인터넷을 사용하기위해 퍼미션을 등록합니다. 아래 코드를 복사하여 사용하실 때에는 {package명}를 개발하시는 앱의 package명으로 수정하시기 바랍니다.

퍼미션에 대한 자세한 내용은 Permissions을 참고하시기 바랍니다.

<uses-permission android:name="android.permission.INTERNET" />

<!--  전역 클래스 등록 -->
<application
    android:name="{package명}.BaasioApplication"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">
	
	...

</application>

Step 3. Push 기능 활성화

Push 기능을 이용하시지 않으시면 이 부분은 건너뛰셔도 됩니다.

앞서 설명한 바와 같이 baas.io의 Push 기능을 이용하기 위해서는 GCM을 사용할 수 있도록 기본적인 작업이 되어 있어야 합니다.

또한, Google API Key, Sender ID가 필요하며 발급 받는 방법은 아래 링크에 쉽게 설명되어 있으니 꼭 확인 바랍니다. 이 과정에서는 Google API Key와 Sender ID를 알고 계시는 것을 가정하겠습니다.

1. 백엔드앱의 설정에 Google API Key 등록

baas.io이동 > My page > 백엔드앱을 선택 > 설정 > 푸쉬인증서 관리에 Google API Key를 등록합니다.

<Google API Key 등록>

2. BaasioConfig.java 수정

BaasioConfig.java에 GCM_SENDER_ID를 Google API Key를 발급받을 때 받은 Sender ID(Project ID)로 설정합니다.

아래 코드를 복사하여 사용하실 때에는 {package명}를 개발하시는 앱의 package명으로 수정하시기 바랍니다.

package {package명};

public class BaasioConfig {
    public static final String BAASIO_URL = "https://api.baas.io";

    // baas.io member ID
    public static final String BAASIO_ID = "PUT_YOUR_BAASIO_MEMBER_ID";

    // baas.io application ID
    public static final String APPLICATION_ID = "PUT_YOUR_APPLICATION_ID";

    // GCM(google cloud messaging service) sender ID
    public static final String GCM_SENDER_ID = "PUT_YOUR_GCM_SENDER_ID";

}

3. BaasioApplication.java 수정

BaasioApplication의 onCreate()에서 Baas.io().init()을 호출해 준 후에 Baas.io().setGCMEnabled()를 호출합니다. 이때, 리턴되는 AsyncTask는 앱이 종료될때 정상 종료될 수 있도록 onTerminate()에서 cancel()을 호출하여 줍니다.

baas.io().setGcmEnabled()를 호출하면 Main UI Thread가 아닌 background에서 단말 등록을 시도합니다. 이때 결과는 BaasioDeviceCallback으로 전달됩니다.

아래 코드를 복사하여 사용하실 때에는 {package명}를 개발하시는 앱의 package명으로 수정하시기 바랍니다.

※ 최초 실행시에는 setGcmEnabled()가 null을 리턴합니다.

최초 실행할때는 setGcmEnabled()가 호출되면 null을 리턴하며, 이는 정상 동작입니다. 이때 Sender ID를 GCM 서버에 등록하는 과정이 이루어지며, 등록이 완료되면 자동으로 GCM이 활성화 됩니다.

	package {package명};

	import com.kth.baasio.Baas;
	import com.kth.baasio.callback.BaasioDeviceCallback;
	import com.kth.baasio.entity.push.BaasioDevice;
	import com.kth.baasio.exception.BaasioException;
	import com.kth.common.utils.LogUtils;
	
	import android.app.Application;
	import android.os.AsyncTask;

	public class BaasioApplication extends Application {
		
		...
		AsyncTask mGCMRegisterTask;
		...

		@Override
    	public void onCreate() {
			....
			mGCMRegisterTask = Baas.io().setGcmEnabled(	//GCM 활성화
					this
					, null								//단말기를 등록할때 구분하기 위한 태그정보 ex) "female,orange"
					, new BaasioDeviceCallback() {		//등록 결과를 받기 위한 Callback
		            	@Override
			            public void onException(BaasioException e) {
			                // 실패
			            }
			
			            @Override
			            public void onResponse(BaasioDevice response) {
			                // 성공
		            	}
	        		}
					, BaasioConfig.GCM_SENDER_ID		//GCM Sender ID
				);
		}

		...

		@Override
    	public void onTerminate() {
			...
	        if (mGCMRegisterTask != null) {
	            mGCMRegisterTask.cancel(true);			//GCM 등록 작업 취소
	        }
			...
			super.onTerminate();
	    }

		...
	}

4. GCMIntentService.java 구현

GCMIntentService.java는 GCM에서 보내주는 각종 메시지를 처리하는 역할을 하며, onMessage()에서 해당 메시지를 이용하여 Notification Bar에서 메시지를 보여주는 등의 처리를 할 수 있습니다.

먼저, 앱의 기본 package 경로에 gcm이라는 path를 생성합니다. 예를 들어, 기본 package 경로가 com.example.app 이라면, com.example.app.gcm 경로를 생성합니다.

생성한 경로에 GCMIntentService.java를 생성하여 아래의 코드를 붙여넣기 하고, {package명} 부분을 기본 package 경로로 바꿔줍니다.

붙여넣기 한 코드는 기본적으로 Notification Bar에 메시지를 보여주도록 처리하고 있습니다. 이를 수정하려면 onMessage()를 수정하면 됩니다.

/*
 * Copyright 2012 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package {package명}.gcm;
	
import com.google.android.gcm.GCMBaseIntentService;
import com.kth.baasio.entity.push.BaasioPayload;
import com.kth.baasio.entity.push.BaasioPush;
import com.kth.baasio.exception.BaasioException;
import {package명}.BaasioConfig;
import {package명}.R;
import {package명}.MainActivity;
import com.kth.baasio.utils.JsonUtils;
import com.kth.baasio.utils.ObjectUtils;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;

import java.util.Random;

/**
 * {@link android.app.IntentService} responsible for handling GCM messages.
 */
public class GCMIntentService extends GCMBaseIntentService {

    private static final String TAG = LogUtils.makeLogTag("GCM");

    public GCMIntentService() {
        super(BaasioConfig.GCM_SENDER_ID);
    }

    @Override
    protected void onRegistered(Context context, String regId) {
        LogUtils.LOGI(TAG, "Device registered: regId=" + regId);

        try {
            BaasioPush.register(context, regId);
        } catch (BaasioException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    protected void onUnregistered(Context context, String regId) {
        LogUtils.LOGI(TAG, "Device unregistered");

        try {
            BaasioPush.unregister(context);
        } catch (BaasioException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    protected void onMessage(Context context, Intent intent) {
        String announcement = intent.getStringExtra("message");
        if (announcement != null) {
            generateNotification(context, announcement);
            return;
        }
    }

    /**
     * Issues a notification to inform the user that server has sent a message.
     */
    private static void generateNotification(Context context, String message) {
        BaasioPayload msg = JsonUtils.parse(message, BaasioPayload.class);
        if (ObjectUtils.isEmpty(msg)) {
            return;
        }

        String alert = "";
        if (!ObjectUtils.isEmpty(msg.getAlert())) {
            alert = msg.getAlert().replace("\\r\\n", "\n");
        }

        int icon = R.drawable.ic_launcher;
        long when = System.currentTimeMillis();
        NotificationManager notificationManager = (NotificationManager)context
                .getSystemService(Context.NOTIFICATION_SERVICE);

        Intent notificationIntent = new Intent(context, MainActivity.class);
        // set intent so it does not start a new activity
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

        Notification notification = new NotificationCompat.Builder(context).setWhen(when)
                .setSmallIcon(icon).setContentTitle(context.getString(R.string.app_name))
                .setContentText(alert).setContentIntent(intent).setTicker(alert)
                .setAutoCancel(true).getNotification();

        notificationManager.notify(0, notification);
    }

    @Override
    public void onError(Context context, String errorId) {
        LogUtils.LOGE(TAG, "Received error: " + errorId);
    }

    @Override
    protected boolean onRecoverableError(Context context, String errorId) {
        // log message
        LogUtils.LOGW(TAG, "Received recoverable error: " + errorId);
        return super.onRecoverableError(context, errorId);
    }
}

5. GCMRedirectedBroadcastReceiver.java 구현

GCMRedirectedBroadcastReceiver.java는 GCMIntentService가 메시지를 받을 수 있도록 전달해주는 역할을 합니다.

앞서 생성한 gcm 위치에 GCMRedirectedBroadcastReceiver.java를 생성하여 아래의 코드를 붙여넣기 하고, {package명} 부분을 기본 package 경로로 바꿔줍니다.

/*
 * Copyright 2012 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package {package명}.gcm;

import com.google.android.gcm.GCMBroadcastReceiver;

import android.content.Context;

/**
 * @author [email protected] (Trevor Johns)
 */
public class GCMRedirectedBroadcastReceiver extends GCMBroadcastReceiver {

    /**
     * Gets the class name of the intent service that will handle GCM messages.
     * Used to override class name, so that GCMIntentService can live in a
     * subpackage.
     */
    @Override
    protected String getGCMIntentServiceClassName(Context context) {
        return GCMIntentService.class.getCanonicalName();
    }
}

6. AndroidManifest.xml 수정

Push를 이용하기 위해 관련 클래스를 등록하고 퍼미션을 설정합니다. 아래 코드를 복사하여 사용하실 때에는 {package명}를 개발하시는 앱의 package명으로 수정하시기 바랍니다.

<permission
    android:name="{package명}.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="{package명}.permission.C2D_MESSAGE" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />

<!--  전역 클래스 등록 -->
<application
    android:name="{package명}.BaasioApplication"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">

	...

	<!--  GCM관련 모듈 등록 -->
	<!--
      BroadcastReceiver that will receive the C2DM messages from GCM
      services and handle them to the custom IntentService.

      The com.google.android.c2dm.permission.SEND permission is necessary
      so only GCM services can send data messages for the app.
    -->
	<receiver
        android:name="{package명}.gcm.GCMRedirectedBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <!-- Receives the actual messages. -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <!-- Receives the registration id. -->
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <category android:name="{package명}" />
        </intent-filter>
    </receiver>

    <!--
      Application-specific subclass of GCMBaseIntentService that will
      handle received messages.

      By default, it must be named .GCMIntentService, unless the
      application uses a custom BroadcastReceiver that redefines its name.
    -->
    <service android:name="{package명}.gcm.GCMIntentService" />
</application>

7. 푸쉬 확인해보기

baas.io이동 > My page > 백엔드앱을 선택 > 푸시관리 > 푸시발송에서 내용을 입력하고 메시지를 보내보세요.

테스트 하실 때에는 Google Play가 설치된 실제 안드로이드 단말에서 테스트 바랍니다. 특히, 에뮬레이터는 메시지를 받을 수 없습니다.

<Push 발송>

테스트하시는 단말로 메시지가 도착하셨나요? 축하드립니다.!!!

※ 잘 안되시나요? Push가 정상 설정되었는지 확인하세요.

Push를 활성화를 하시면, 정상적으로 동작시키기 위해 아래 체크리스트를 확인 바랍니다.

  1. <CHECK!!> Google Play가 설치된 실제 안드로이드 단말에서 테스트하셔야합니다.
  2. baas.io 사이트 이동
  3. 로그인 > My page 이동> Application 선택
  4. 설정 > 푸시인증서 관리
  5. <CHECK!!> Android API KEY 등록되었는지 확인
  6. <CHECK!!> 푸시 사용 설정이 사용함인지 확인
  7. 데이터브라우저 > Role 선택 > guest 선택 > Permission 탭 선택
  8. <CHECK!!>"/devices" Create 체크됨 확인(v0.8.1 이전 버전은 "/pushes/devices")
  9. <CHECK!!>"/devices/*" Update, Delete 체크됨 확인(v0.8.1 이전 버전은 "/pushes/devices/*")
  10. 데이터브라우저 > Role 선택 > default 선택 > Permission 탭 선택
  11. <CHECK!!>설정된 Role이 "/device" Create와 "/devices/*" Update, Delete를 포함하고 있는지 확인(v0.8.1 이전 버전은 "/pushes/devices", "/pushes/devices/*")
  12. <CHECK!!>프로젝트의 AndroidManifest.xml 파일을 열어 아래와 같이 package 명이 제대로 들어가 있는지 확인합니다.
	<permission
   		android:name="{package명}.permission.C2D_MESSAGE"
        android:protectionLevel="signature" /> 
	...
	<receiver
        android:name="{package명}.gcm.GCMRedirectedBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <!-- Receives the actual messages. -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <!-- Receives the registration id. -->
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="{package명}" />
        </intent-filter>
    </receiver>
	...
	<service android:name="{package명}.gcm.GCMIntentService" />

<주> Role관련부분은 역할과 권한을 참고 바랍니다.

축하드립니다.!!

이제 모든 설정이 끝났습니다. 이제 baas.io Android SDK를 좀더 자세히 알아 볼까요?

아래 링크를 누르시면 SDK 가이드로 이동됩니다.


Clone this wiki locally