Android Studio 및 푸시 알림 시작하기
개요
이 튜토리얼은 푸시 알림과 함께 Android PlayFab 통합을 시작하고 실행하는 데 도움을 주기 위해 작성되었습니다.
푸시 알림은 여러 시스템에서 구성해야 합니다. 시작하기 전에 인프라가 어떻게 작동하는지 이야기해 보도록 합시다. 프로세스에 참여하는 엔티티는 4개입니다.
- Google Play 서비스
- Firebase 클라우드 메시징 서비스 (FCM, 이전 Google 클라우드 메시징위에 구축됨.)
- PlayFab 서비스
- 클라이언트 응용 프로그램
1. Google Play 서비스
Google Play 서비스는 패키지 이름을 사용하여 게임 시장에서 페이지를 식별합니다.
예를 들면 다음과 같습니다. com.bob.games.matchthree.
Google Play에 등록하면 패키지 이름이 고유한 애플리케이션 ID가되며 Play 스토어 설치에서 사칭을 막는데 이르기까지 다양한 용도로 사용됩니다.
2. FCM (Firebase 클라우드 메시징)
Firebase 클라우드 메시징 서비스는 사용자에게 푸시 알림을 전송, 전달 및 전달할 수있는 클라우드 기반 시스템을 제공합니다.
또한 다른 서비스 (예 : PlayFab)가 FCM 서버 키를 사용하여 사용자 대신 푸시 알림을 보낼 수 있습니다.
3. PlayFab 서비스
PlayFab 서비스는 FCM 서버 키를 사용하여 고객에게 푸시 알림을 보냅니다.
4. 클라이언트 서비스
마지막으로 클라이언트 응용 프로그램에서 알림을 수신하고 필요에 따라 처리할 수 있습니다.
네 방향 분활
그 결과, 4가지 다른 시스템을 설정해야 합니다. 이를 위해 튜토리얼은 4 개의 챕터로 나뉘어 각 부분에 대한 구성을 포함합니다.
참고 항목
시스템을 구성하는 데 사용하는 순서가 중요합니다.
필수 조건
- Google 계정이 있어야 합니다.
- PlayFab 계정이 있어야 합니다.
- Android 자산 스튜디오 Notification icon generator을 사용하여 생성된 알림 아이콘입니다.
시나리오
튜토리얼의 이 섹션에서는 Foo PlayFab 앱이라는 응용 프로그램을 조합합니다. 다음과 같은 기능을 갖춘 Android 앱입니다.
- Android 장치 ID를 사용하여 PlayFab에 로그인합니다.
- PlayFab에서 푸시 알림을 받습니다.
패키지 이름은 com.foo.playfab.app입니다.
Important
이 튜토리얼을 수행할 때는 고유 패키지 이름과 제목을 사용해야 합니다.
1 장: Firebase 구성하기
공식 콘솔 페이지을 사용하여 Firebase를 구성하기 시작합니다. 새 프로젝트를 추가할 수 있는 페이지가 나타납니다.
- 이렇게 하려면 다음 그림과 같이 프로젝트 추가 영역을 선택합니다.
프로젝트 이름을 제공해야 합니다 (이 튜토리얼에서는Foo PlayFab 앱을 사용하지만, 이 튜토리얼을 수행 할 때 자신만의 이름을 만들었는지 꼭 확인하세요).
프로젝트 만들기 버튼을 선택하여 다음 단계로 넘어갑니다.
새 프로젝트 대시보드.로 리디렉션됩니다.
- 다음 그림과 같이 영역을 선택하여 새로운 Android 응용 프로그램 을 프로젝트에 추가합니다.
새로운 Application은 3단계가 추가되어야 합니다.
먼저, Android 패키지 이름을 지정해야 합니다. 여기에서는 com.foo.playfab.app을 사용하지만 이 튜토리얼을 따를 때 고유한패키지 이름을 만들어야 합니다.
Register App 버튼을 선택하여 다음 단계로 이동합니다.
2 단계에서는 google-services.json 설정 파일을 다운로드할 수 있습니다. 나중에 App에서 사용되어 Google 서비스를 자동으로 구성합니다.
- 다운로드 한 후 계속 버튼 선택하여 다음 단계로 이동합니다.
- 마지막 단계에서는 빌드 프로세스를 설정하여 Firebase 및 Google Play SDK를 연결하는 방법에 대한 정보를 제공합니다.
참고 항목
이 설정을 자동으로 수행하는 Android 스튜디오에 내장된 자동화 도구를 사용하므로 이 정보를 무시할 수 있습니다.
- 계속 진행하려면 끝내기 버튼을 선택합니다.
을용 프로그램이 추가되면 대시 보드에 표시됩니다.
이 시점에서 구성이 완료되면 FCM 서버 키 (PlayFab 푸시 알림을 연결하는 데 사용)를 추출해야 합니다.
다음 그림과 같이 프로젝트 설정으로 이동합니다.
Project settings에서 Cloud 메시징 탭으로 이동합니다.
서버 키 영역 (아래 사진에서 빨간색 영역)을 찾습니다.
이 키를 복사하여 안전하고 쉽게 접근할 수있는 장소에 보관합니다.
이제 푸시 알림을 활성화하기 위해 Firebase에서 필요한 모든 작업을 수행했습니다.
2장: Google Play 콘솔 구성
앱이 준비되면 제품 Play 스토어 페이지를 유지 관리하기 위해 Google 콘솔 프로젝트를 만들 가능성이 큽니다. Google Play 프로젝트를 만들고 이를 Firebase 프로젝트에 연결하는 과정을 살펴 보겠습니다.
먼저 Google Play 콘솔 페이지을 방문하여 다음 사진과 같이 새 프로젝트를 만듭니다.
- Title을 지정합니다.
참고 항목
이 예에서는 Foo PlayFab App을 사용합니다. 이 튜토리얼를 수행하는 동안 자신만의 타이틀과 패키지 이름을 사용해야 합니다.
- 계속하려면 만들기 버튼을 선택합니다.
Google Play 콘솔 프로젝트 페이지가 열립니다.
사이드 메뉴에서 서비스 및 APIs을 선택합니다.
- 서비스 구성 페이지가 열립니다.
- Firebase Cloud 메시징 패널을 찾습니다.
- 다음 그림과 같이 발신자 ID 연결 버튼을 선택합니다.
Sender ID를 연결하려면:
- 이전 장에서 Firebase 콘솔을 사용하면서 받은 (저장한) FCM 서버 키를 사용합니다.
- 완료되면, 예제에서와 같이 연결 버튼을 선택합니다.
- 잠시 시간을 내어 아래 예와 같이 Google Play 콘솔에 표시된 발신자 ID가 Firebase 콘솔 의 ID와 일치하는지 확인하세요.
이 시점에서 Google Play 콘솔 프로젝트는 Firebase 프로젝트에 연결되었습니다.
3장 : PlayFab 타이틀 구성하기
이 장의 목적은 PlayFab 서비스를 구성하여 플레이어를 대신하여 플레이어에게 푸시 알림을 보낼 수 있는 방법을 보여주는 것입니다.
먼저 타이틀의 설정 메뉴에서 제목 설정으로 이동해야 합니다.
푸시 알림 탭을 선택합니다.
Android 옵션의 경우 설정 아이콘을 선택합니다.
Google 서버 API 키를 요구하는 메시지가 표시됩니다.
아래 제공된 예제와 같이 Firebase 콘솔을 통해 받은 파일을 복사합니다.
- 모든 사항이 올바른 경우 푸시 알림이 활성화된 것으로 표시된 페이지가 제시됩니다.
이것으로 PlayFab 타이틀을 구성합니다.
4장: Android 스튜디오 프로젝트 구성
PlayFab JavaSDK를 활용하려면 PlayFab 클라이언트 JavaSDK 및 그 종속인 Google GSON이 필요합니다.
여기에 PlayFab 클라이언트 JavaSDK JAR 라이브러리를 다운로드합니다.
client-sdk-*.jar
과 필요한 경우 해당 Java Doc를 찾습니다.최신 Google GSON을 다운로드합니다.
gson-*.jar
을 찾습니다.앞에서 언급 한 .jar 파일을 근처에 두세요.
정기적인 Android 스튜디오 프로젝트를 만드는 것으로 시작합니다.
Package name이 이 튜토리얼에서 사용한 것과 일치하는지 확인하세요 (예: Firebase).
참고 항목
이예제에서 우리는 com.foo.playfab.app를 사용하고 있지만 이 튜토리얼를 진행하는 동안 자신의 패키지 이름과 제목을 생각해 내기 바랍니다.
원하는 대로 Minimum SDK을 선택합니다.
그리고 나서 다음 버튼을 선택합니다.
이 튜토리얼에서는 활동 없음 템플릿을 사용하여 시작하는 것이 좋습니다.
사용할 템플릿를 선택합니다.
그리고 나서 다음 버튼을 선택합니다.
원하는대로 템플릿을 구성합니다.
끝내기버튼을 선택합니다.
새로 생성된 프로젝트를 열면
- 프로젝트 탭 (1)으로 전환합니다.
참고 항목
이전 장에서는 Firebase 콘솔에서 google-services.json
설정 파일을 다운로드했습니다. 다음 단계에서 사용하세요.
- 이 파일이 App 폴더 (2) 아래에 있는지 확인합니다.
- 그런 다음 도구 (3)로 이동합니다.
- 아래 제공된 예제와 같이 Firebase (4)를 선택합니다.
Firebase Assistant가 창 오른쪽에 열립니다.
- 아래 사진과 같이 Cloud 메시징 폴더를 찾아 Firebase Cloud 메시징 설정 설정을 선택합니다.
Firebase 알림 어시스턴트에서 다음 사진과 같이 앱에 FCM 추가 (1) 버튼을 선택합니다.
새로운 종속성이 Gradle을 통해 추가됨을 나타내는 대화 상자가 열립니다.
변경 승인 (2)을 선택하여 변경 사항을 승인하세요.
참고 항목
안타깝게도 Gradle 동기화 프로세스 (3) 에 의해 자동으로 추가된 종속성이 잘못되어 실패했습니다!
종속성을 올바르게 설정하려면 자동 추가된 문장을 다음으로 대체하세요.
implementation 'com.google.firebase:firebase-core:16.0.3
implementation 'com.google.firebase:firebase-messaging:17.0.0
프로세스가 완료되면
- Firebase 알림 어시스턴트 가 종속성이 올바르게 설정되었음을 나타냅니다 (1).
참고 항목
이 장의 시작 부분에서 필요한 JAR 파일을 확보했습니다. 일반적으로 빌드 파일은 자동으로 이러한 파일을 가져옵니다.
- 이러한 JAR 파일이 app/libs 폴더 (2) 아래에 나열되도록 하려면 모든 파일을 선택하고 마우스 오른쪽 버튼을 클릭합니다.
- 그런 다음 아래 제공된 예제와 같이 ...로 라이브러리에 추가 (3)를 선택합니다.
Android 자산 스튜디오 알림 아이콘 생성기을 사용하여 아이콘을 준비하고app/src/main/res안에 배치합니다.
아래 표시된 예제에서 아이콘은 ic_stat_blur_on입니다.
- 마지막으로 프로젝트 재구축를 선택합니다.
이제 알림 수신 및 처리를 위한 코드 구현을 시작할 수 있습니다. 우리는 4 개의 파일을 수정 (그리고 필요한 경우 생성)할 것입니다.
- app/src/main/AndroidManifest.xml
- app/src/main/java/..packagePath../MainActivity.java
- app/src/main/java/..packagePath../FooAppFirebaseInstanceIdService.java
- app/src/main/java/..packagePath../FooAppFirebaseMessagingService.java
참고 항목
현재 구현은 알림을 신속하게 테스트하기 위해 최대한 짧게 만들어졌습니다. 고품질의 모범 사례와 보다 복잡한 구현 예제는 FCM 가이드를 참조하세요
AndroidManifest.xml
다음 코드에서 MY_PACKAGE_IDENTIFIER
자리 표시자를 자신만의 패키지 식별자로 바꿉니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="MY_PACKAGE_IDENTIFIER">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- The following block enables our custom Firebase Instance ID Service-->
<service android:name=".FooAppFirebaseInstanceIdService" android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
<service
android:name=".FooAppFirebaseMessagingService" android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
</application>
</manifest>
MainActivity.java
코드의 다음 자리 표시자는 시나리오에 따라 바꿔야 합니다.
PLAYFAB_TITLE_ID
- PlayFab 게임 관리자에서 받은 타이틀에 ID를 사용하세요.
PACKAGE_IDENTIFIER
- 설정과 일치하는 Java 패키지 ID를 사용합니다.
package PACKAGE_IDENTIFIER;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.playfab.PlayFabClientAPI;
import com.playfab.PlayFabClientModels.*;
import com.playfab.PlayFabErrors;
import com.playfab.PlayFabSettings;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
// Invoked when activity is started
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Set PlayFab title
PlayFabSettings.TitleId = "PLAYFAB_TITLE_ID";
// Start login operation
AsyncTask.execute(new Runnable() {
@Override
public void run() {
if(login()) FooAppFirebaseInstanceIdService.setAllowRegisterForPush(true); // Ready to register for push notifications
}
});
}
public boolean login(){
LoginWithAndroidDeviceIDRequest request = new LoginWithAndroidDeviceIDRequest();
request.CreateAccount = true;
// There are several approaches on getting unique android device id.
// https://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id
request.AndroidDeviceId = "qwerty";
PlayFabErrors.PlayFabResult<LoginResult> response = PlayFabClientAPI.LoginWithAndroidDeviceID(request);
if(response.Error != null){
Log.d("Foo PlayFab App",CompileErrorsFromResult(response.Error));
return false;
}
return true;
}
// Utility method to compose an error message out of PlayFab result.
private static String CompileErrorsFromResult(PlayFabErrors.PlayFabError error) {
if (error == null)
return null;
String errorMessage = "";
if (error.errorMessage != null)
errorMessage += error.errorMessage;
if (error.errorDetails != null)
for (Map.Entry<String, List<String>> pair : error.errorDetails.entrySet())
for (String msg : pair.getValue())
errorMessage += "\n" + pair.getKey() + ": " + msg;
return errorMessage;
}
}
FooAppFirebaseInstanceIdService.java
아래에 표시된 코드의 자리 표시자는 시나리오에 따라 바뀌어야 합니다.
PACKAGE_IDENTIFIER
- 설정과 일치하는 Java 패키지 식별자여야 합니다.
package PACKAGE_IDENTIFIER;
import android.text.TextUtils;
import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;
import com.playfab.PlayFabClientAPI;
import com.playfab.PlayFabClientModels;
import com.playfab.PlayFabErrors;
import java.util.List;
import java.util.Map;
public class FooAppFirebaseInstanceIdService extends FirebaseInstanceIdService {
private static String _token;
private static boolean _allowRegistration;
// This is invoked from activity that performs authentication.
// Once login is complete this method is invoked.
// If we have a pending token, we use it to register for push notifications
public static void setAllowRegisterForPush(boolean isAllowed) {
_allowRegistration = isAllowed;
if (_allowRegistration && !TextUtils.isEmpty(_token)) {
registerForPush(_token);
}
}
// Invoked when firebase has fetched a token
// If we already have logged in, we use new token to register for push
@Override
public void onTokenRefresh() {
_token = FirebaseInstanceId.getInstance().getToken();
if (_allowRegistration && !TextUtils.isEmpty(_token)) {
registerForPush(_token);
}
}
private static void registerForPush(String token) {
PlayFabClientModels.AndroidDevicePushNotificationRegistrationRequest request = new PlayFabClientModels.AndroidDevicePushNotificationRegistrationRequest();
request.DeviceToken = token;
PlayFabErrors.PlayFabResult<PlayFabClientModels.AndroidDevicePushNotificationRegistrationResult> response = PlayFabClientAPI.AndroidDevicePushNotificationRegistration(request);
if (response.Error != null) {
Log.d("Foo PlayFab App", CompileErrorsFromResult(response.Error));
}
}
// Utility method to compose an error message out of PlayFab result.
private static String CompileErrorsFromResult(PlayFabErrors.PlayFabError error) {
if (error == null)
return null;
String errorMessage = "";
if (error.errorMessage != null)
errorMessage += error.errorMessage;
if (error.errorDetails != null)
for (Map.Entry<String, List<String>> pair : error.errorDetails.entrySet())
for (String msg : pair.getValue())
errorMessage += "\n" + pair.getKey() + ": " + msg;
return errorMessage;
}
}
FooAppFirebaseMessagingService.java
아래에 표시된 코드의 자리 표시자는 시나리오에 따라 바뀌어야 합니다.
PACKAGE_IDENTIFIER
- 설정과 일치하는 Java 패키지 식별자여야 합니다.
package com.foo.playfab.app;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
public class FooAppFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage message) {
// Intercept the message here
Log.d("Foo PlayFab App","Message received: "+message.getNotification().getBody());
}
}
테스트
이 시점에서 장치에 응용 프로그램을 배포할 수 있어야 합니다.
응용 프로그램을 시작하면 자동으로 로그인하여 푸시 알림을 등록합니다.
응용 프로그램을 최소화하려면 장치에서 홈 버튼을 선택합니다. 시스템 트레이에 도착한 알림을 테스트할 수 있으므로 중요합니다.
그런 다음 PlayFab 타이틀 게임 관리자 페이지로 이동하여 대시 보드를 사용하여 최신 푸시 등록을 찾습니다.
플레이어 ID (1)를 선택합니다.
해당 플레이어에 대해 푸시 알림 보내기 페이지가 열립니다.
푸시 알림 보내기를 선택합니다(1).
타이틀 (2)을 입력합니다.
메시지 본문을 입력합니다 (3).
푸시 알림 보내기 버튼 (4)을 선택하여 변경 사항을 적용합니다.
- 메시지가 장치에 도착하는지 확인합니다.
메시지가 도착하면 메시지가 응용 프로그램에 성공적으로 전달됩니다.
이제 성공적으로 통합되었습니다. 응용 프로그램이 실제로 실행되는 동안 FooAppFirebaseMessagingService을 사용하여 수신 메시지를 처리할 수 있습니다.