> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Android Studio 및 푸시 알림 시작

> Android Studio, Google Play Services, Firebase Cloud Messaging 및 PlayFab을 연결하여 Android 클라이언트 애플리케이션에 푸시 알림을 보냅니다.

## 개요

이 자습서는 푸시 알림을 사용하는 Android PlayFab 통합을 시작하고 실행하는 데 도움이 되도록 작성되었습니다.

푸시 알림을 사용하려면 여러 시스템에서 구성이 필요합니다. 시작하기 전에 인프라가 어떻게 작동하는지 살펴보겠습니다. 이 프로세스에는 4개의 엔터티가 참여합니다.

1. **Google Play Services**
2. **Firebase Cloud Messaging Service**s(**FCM**, 기존 **Google Cloud Messaging** 위에 구축됨)
3. **PlayFab Services**
4. **클라이언트 애플리케이션**

### 1. Google Play Services

Google Play Services는 패키지 이름을 사용하여 Play 마켓에서 사용자의 페이지를 식별합니다.

예를 들면 **com.bob.games.matchthree**와 같습니다.

Google Play에 등록되면 패키지 이름은 고유한 애플리케이션 ID가 되며, Play 스토어를 통한 설치부터 사칭 방지에 이르기까지 다양한 용도로 사용됩니다.

### 2. Firebase Cloud Messaging(FCM)

Firebase Cloud Messaging 서비스는 푸시 알림을 보내고, 전달 대상을 지정하고, 배달하는 클라우드 기반 시스템을 제공합니다.

또한 다른 서비스(예: PlayFab)가 FCM 서버 키를 사용하여 사용자를 대신해 푸시 알림을 보낼 수 있도록 합니다.

### 3. PlayFab Services

그런 다음 PlayFab Services는 FCM 서버 키를 사용하여 클라이언트에 푸시 알림을 보냅니다.

### 4. 클라이언트 서비스

마지막으로 클라이언트 애플리케이션은 알림을 수신하고 필요에 따라 처리할 수 있습니다.

### 4방향 분할

따라서 *4개의 서로 다른 시스템*을 설정해야 합니다. 이를 위해 이 자습서는 각 부분의 구성을 다루는 4개의 장으로 나뉘어 있습니다.

> [!NOTE]
>
> 시스템을 구성하는 *순서*가 중요합니다.

## 필수 구성 요소

* Google 계정이 있어야 합니다.
* PlayFab 계정이 있어야 합니다.
* Android Asset Studio [알림 아이콘 생성기](https://romannurik.github.io/AndroidAssetStudio/icons-notification.html)를 사용하여 생성한 알림 아이콘이 있어야 합니다.

## 시나리오

자습서의 이 섹션에서는 Foo PlayFab App이라는 애플리케이션을 만듭니다. 이 앱은 다음 기능을 갖춘 Android 앱입니다.

* Android 디바이스 ID를 사용하여 PlayFab에 로그인합니다.
* PlayFab에서 푸시 알림을 수신합니다.

패키지 이름은 com.foo.playfab.app입니다.

> [!NOTE]
>
> 이 자습서를 따라 할 때는 반드시 자신의 패키지 이름과 타이틀을 사용하세요.

### 1장: Firebase 구성

[공식 콘솔 페이지](https://console.firebase.google.com/)를 사용하여 Firebase 구성을 시작합니다. 새 프로젝트를 추가할 수 있는 페이지가 표시됩니다.

* 이렇게 하려면 다음 그림과 같이 **프로젝트 추가** 영역을 선택합니다.

![Firebase - 프로젝트 추가](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/firebase-add-project.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=c6ebf07725bdea073d34718e5d7c3f1d)

* **프로젝트 이름**을 입력하라는 메시지가 표시됩니다(이 자습서에서는 **Foo PlayFab App**을 사용하지만, 이 자습서를 따라 할 때는 *반드시* *자신만의* 이름을 정하세요).

* **프로젝트 만들기** 단추를 선택하여 다음 단계로 진행합니다.

![Firebase - 프로젝트 만들기](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/firebase-create-project.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=93cc77ef6805ee6472636146800a54e9)

**새 프로젝트 대시보드**로 리디렉션됩니다.

* 다음 그림과 같이 해당 영역을 선택하여 프로젝트에 새 **Android 애플리케이션**을 추가합니다.

![Firebase - Android 앱에 Firebase 추가](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/firebase-add-to-android-app.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=db71c761512694decfdf3298661322cf)

새 **애플리케이션**을 추가하려면 3단계가 필요합니다.

1. 먼저 **Android 패키지 이름**을 입력해야 합니다. 여기서는 **com.foo.playfab.app**을 사용하지만, 이 자습서를 따라 할 때는 반드시 *자신만의* **패키지 이름**을 정하세요.

2. **앱 등록** 단추를 선택하여 다음 단계로 이동합니다.

![Firebase - Android 앱 등록](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/firebase-register-android-app.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=8949cec22f3514f2833782c065266372)

2단계에서는 **google-services.json**이라는 설정 파일을 다운로드할 수 있습니다. 이 파일은 나중에 **앱**에서 **Google** 서비스를 자동으로 구성하는 데 사용됩니다.

* 다운로드한 후 **계속** 단추를 선택하여 다음 단계로 이동합니다.

![Firebase - Google 설정 파일 추가](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/firebase-add-google-settings-file.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=003f8a1a55f516e5a3fa60584e283db2)

3. 마지막 단계에서는 Firebase 및 Google Play SDK를 연결하도록 빌드 프로세스를 설정하는 방법에 대한 정보를 제공합니다.

> [!NOTE]
>
> 이 설정을 자동으로 수행하는 Android Studio 기본 제공 자동화 도구를 사용할 것이므로 이 정보는 무시해도 됩니다.

* **마침** 단추를 선택하여 계속합니다.

![Firebase - Android 앱에 추가 완료](https://mintcdn.com/microsoft-4404708b/59DtlsYffqki5YJ_/images/playfab/live-service-management/game-configuration/title-communications/tutorials/firebase-finish-adding-to-android-app.webp?fit=max\&auto=format\&n=59DtlsYffqki5YJ_\&q=85\&s=3ff4fb88ab6c458e6a343ca83afd98f9)

* **애플리케이션**이 추가되면 대시보드에 표시됩니다.

* 이 시점에서 구성이 완료되었으며, FCM 서버 키(PlayFab 푸시 알림을 연결하는 데 사용)를 추출해야 합니다.

* 다음 그림과 같이 **프로젝트 설정**으로 이동합니다.

![Firebase - 프로젝트 설정](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/firebase-project-settings.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=25453db20ddb38b6c7cd0e6f46578db7)

* **프로젝트 설정**에서 **클라우드 메시징** 탭으로 이동합니다.

* **서버 키** 영역(아래 그림의 빨간색 영역)을 찾습니다.

* 이 **키**를 복사하여 안전하고 쉽게 액세스할 수 있는 곳에 보관합니다.

![Firebase - 클라우드 메시징 - 서버 키](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/firebase-copy-server-key.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=47549ef555d012d68d2506b12e17d653)

이제 푸시 알림을 사용하도록 Firebase에서 해야 할 모든 작업을 완료했습니다.

### 2장: Google Play Console 구성

앱이 준비되면 제품 Play 스토어 페이지를 관리하기 위해 Google Console 프로젝트를 만들게 될 가능성이 높습니다. GooglePlay 프로젝트를 만들고 Firebase 프로젝트에 연결하는 프로세스를 살펴보겠습니다.

먼저 [Google Play Console 페이지](https://play.google.com/apps/publish)를 방문하여 다음 그림과 같이 새 프로젝트를 만듭니다.

![Google Play - Console 페이지](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/google-play-console-page.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=b2764cf59e851638067b05739c9e0bfe)

* **제목**을 지정합니다.

> [!NOTE]
>
> 이 예제에서는 **Foo PlayFab App**을 사용합니다. 이 자습서를 따라 할 때는 반드시 *자신만의* 타이틀과 패키지 이름을 정하세요.

* **만들기** 단추를 선택하여 계속합니다.

![Google Play - 애플리케이션 만들기](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/google-play-create-application.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=ac4858a57d9150e91dbbbe5502004fa1)

* **Google Play Console 프로젝트** 페이지가 열립니다.

* 사이드 메뉴에서 **서비스 및 API**를 선택합니다.

![Google Play Console - 서비스 및 API](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/google-play-console-services-and-apis.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=89ed8f41596cf33bcb7d90201e0d799b)

* **서비스 구성** 페이지가 열립니다.
* **Firebase Cloud Messaging** 패널을 찾습니다.
* 다음 그림과 같이 **발신자 ID 연결** 단추를 선택합니다.

![Google Play - FCM 패널 - 발신자 ID 연결](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/google-play-fcm-link-sender-id.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=c38ceb863412115eadb603d7b045e2c4)

**발신자 ID**를 연결하려면 다음을 수행합니다.

* 이전 장에서 Firebase 콘솔을 사용하는 동안 받은(그리고 저장한) FCM 서버 키를 사용합니다.
* 완료되면 예제와 같이 **연결** 단추를 선택합니다.

![Google Play - 발신자 ID 연결 - FCM API 키 추가](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/google-play-add-fcm-api-key.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=09e18dd1c6e80d94ffbbea649b7943ca)

* 아래 예제와 같이 **Google Play Console**에 표시된 **발신자 ID**가 **Firebase Console**의 ID와 일치하는지 잠시 확인합니다.

![Google Play Console - Firebase Console - 발신자 ID 일치](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/google-play-firebase-match-sender-id.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=4ddb06d507e22df96db776b3e74fd3c6)

이제 **Google Play Console 프로젝트**가 **Firebase 프로젝트**에 성공적으로 연결되었습니다.

### 3장: PlayFab 타이틀 구성

이 장의 목적은 PlayFab Services가 사용자를 대신하여 플레이어에게 푸시 알림을 보낼 수 있도록 구성하는 방법을 보여 주는 것입니다.

* 먼저 타이틀의 설정 메뉴에서 **타이틀 설정**으로 이동해야 합니다.

* **푸시 알림** 탭을 선택합니다.

* Android 옵션에서 **설정** 아이콘을 선택합니다.

![PlayFab - 푸시 알림 - Android 설정](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/playfab-push-notifications-android-settings.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=4eec7a15301af9539810665d379e4dd2)

* **Google 서버 API 키**를 입력하라는 메시지가 표시됩니다.

* 아래 예제와 같이 Firebase 콘솔을 통해 받은 키를 복사합니다.

![PlayFab - Firebase Console - 서버 API 키 추가](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/playfab-firebase-add-server-api-key.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=37afb2d4a347067d24e0025d5db1c622)

* 모든 것이 올바르면 **푸시 알림**이 **활성**으로 표시된 페이지가 나타납니다.

![PlayFab - 푸시 알림 - 활성](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/playfab-push-notifications-android-active.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=968a305d91cfbd117a34cab960fd28d1)

이것으로 PlayFab 타이틀 구성이 완료되었습니다.

### 4장: Android Studio 프로젝트 구성

PlayFab JavaSDK를 활용하려면 PlayFab Client JavaSDK와 해당 종속성인 Google GSON이 필요합니다.

* 여기에서 PlayFab 클라이언트 JavaSDK JAR 라이브러리를 다운로드합니다.

* `client-sdk-*.jar` 및 필요한 경우 해당 Java Doc을 찾습니다.

* 최신 Google GSON을 다운로드합니다.

* `gson-*.jar`를 찾습니다.

* 앞에서 언급한 .jar 파일을 가까운 곳에 준비해 둡니다.

먼저 일반 Android Studio 프로젝트를 만듭니다.

* **패키지 이름**이 이 자습서 전체에서 사용한 이름(예: Firebase에서 사용한 이름)과 일치하는지 확인합니다.

> [!NOTE]
>
> *이* 예제에서는 **com.foo.playfab.app**을 사용하지만, 이 자습서를 따라 할 때는 자신만의 패키지 이름과 타이틀을 정해야 한다는 점을 기억하세요.

![Android Studio - 새 프로젝트 - 앱 이름 추가](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-studio-new-project-add-app-name.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=e3a6f68571ac08857f7e1784409e18a4)

* 원하는 **최소 SDK**를 선택합니다.

* 그런 다음 **다음** 단추를 선택합니다.

![Android Studio - 새 프로젝트 - 최소 SDK 선택](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-studio-new-project-select-min-sdk.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=37acc7e58f141a91bbc54b598e764640)

이 자습서에서는 **Empty Activity** 템플릿으로 시작하는 것이 좋습니다.

* 사용할 템플릿을 선택합니다.

* 그런 다음 **다음** 단추를 선택합니다.

![Android Studio - 새 프로젝트 - 템플릿 선택](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-studio-new-project-select-template.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=26ee148418e7ea9ffb651dcef5b5dc72)

* 원하는 대로 템플릿을 구성합니다.

* **마침** 단추를 선택합니다.

![Android Studio - 새 프로젝트 - 마침](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-studio-new-project-finish.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=f79cb46f260919d023e11c75d6ec9189)

새로 만든 프로젝트를 연 후 다음을 수행합니다.

* **Project** 탭 \*\*(1)\*\*으로 전환합니다.

> [!NOTE]
>
> 이전 장에서 Firebase 콘솔로부터 `google-services.json` 구성 파일을 다운로드했습니다. 다음 단계에서 이 파일을 사용합니다.

* 이 파일이 **App** 폴더 **(2)** 아래에 있는지 확인합니다.
* 그런 다음 \*\*Tools (3)\*\*로 이동합니다.
* 아래 예제와 같이 \*\*Firebase (4)\*\*를 선택합니다.

![Android Studio - 프로젝트에 구성 파일 추가](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-studio-add-config-file.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=71251ee117e53ba0ea52d14dd5ab94b6)

창 오른쪽에 **Firebase Assistant**가 열립니다.

* 아래와 같이 **Cloud Messaging** 폴더를 찾아 **Set up Firebase Cloud Messaging**을 선택합니다.

![Android Studio - Firebase Assistant - 클라우드 메시징 설정](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-studio-firebase-set-up-cloud-messaging.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=c1ab23fad1d9ce59d043f8a817ff2634)

* **Firebase Notifications Assistant**에서 다음 이미지와 같이 **Add FCM to your app (1)** 단추를 선택합니다.
* **Gradle**을 통해 새 종속성이 추가된다는 대화 상자가 열립니다.
* \*\*Accept Changes (2)\*\*를 선택하여 변경 내용을 승인합니다.

> [!NOTE]
>
> 안타깝게도 **Gradle** 동기화 프로세스(**3**)에서 자동으로 추가되는 종속성은 올바르지 않으며 실패를 보고합니다!

* 종속성을 올바르게 설정하려면 자동으로 추가된 문장을 다음으로 바꿉니다.

  `implementation 'com.google.firebase:firebase-core:16.0.3`\
  `implementation 'com.google.firebase:firebase-messaging:17.0.0`

![Android Studio - Firebase Assistant - 앱에 FCM 추가](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-studio-firebase-add-fcm-to-your-app.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=6e068982118ca54c1c54aa211854059a)

해당 프로세스가 완료되면 다음을 수행합니다.

* **Firebase Notifications Assistant**에 종속성이 이제 올바르게 설정되었다고 표시되는지 확인합니다 **(1)**.

> [!NOTE]
>
> 이 장의 시작 부분에서 필요한 JAR 파일을 확보했습니다. 일반적으로 빌드 파일이 이러한 파일을 자동으로 가져옵니다.

* 이러한 JAR 파일이 **app/libs** 폴더 **(2)** 아래에 나열되도록 하려면 모든 파일을 선택하고 마우스 오른쪽 단추로 클릭합니다.
* 그런 다음 아래 예제와 같이 \*\*Add as library... (3)\*\*를 선택합니다.

![Android Studio - Firebase Assistant - 라이브러리로 추가](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-studio-firebase-add-library.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=cac566cb854d201438a125b093700bf4)

* Android Asset Studio [알림 아이콘 생성기](https://romannurik.github.io/AndroidAssetStudio/icons-notification.html)를 사용하여 아이콘을 준비하고 **app/src/main/res** 안에 배치합니다.

* 아래 예제에서 아이콘 이름은 **ic\_stat\_blur\_on**입니다.

![Android Studio - 아이콘 추가](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-studio-add-icons.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=44c75647824acbc7f6eed1764629fb79)



* 마지막으로 **Rebuild Project**를 선택합니다.

![Android Studio - 프로젝트 다시 빌드](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-studio-rebuild-project.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=af06d0cc414a65ca537ec1930463b0d4)

이제 알림을 수신하고 처리하는 코드 구현을 시작할 수 있습니다. 다음 4개 파일을 수정(필요한 경우 생성)합니다.

1. **app/src/main/AndroidManifest.xml**
2. **app/src/main/java/..packagePath../MainActivity.java**
3. **app/src/main/java/..packagePath../FooAppFirebaseInstanceIdService.java**
4. **app/src/main/java/..packagePath../FooAppFirebaseMessagingService.java**

> [!NOTE]
>
> 현재 구현은 알림을 빠르게 테스트하기 위해 최대한 짧게 작성되었습니다. 고품질 모범 사례와 더 복잡한 구현 예제는 [FCM 가이드](https://firebase.google.com/docs/cloud-messaging/concept-options)를 참조하세요.

#### AndroidManifest.xml

다음 코드에서 `MY_PACKAGE_IDENTIFIER` 자리 표시자를 *자신의* 패키지 식별자로 바꿉니다.

```xml theme={null}
<?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 Game Manager에서 받은 타이틀 ID를 사용합니다.

* `PACKAGE_IDENTIFIER`
  * 설정과 일치하는 Java 패키지 식별자를 사용합니다.

```java theme={null}
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 패키지 식별자입니다.

```java theme={null}
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 패키지 식별자입니다.

```java theme={null}
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 타이틀의 Game Manager 페이지로 이동하여 대시보드에서 최신 **푸시 등록**을 찾습니다.

* \*\*플레이어 ID (1)\*\*를 선택합니다.

![PlayFab - PlayStream - 이벤트 로그](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/playfab-playstream-event-log.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=8f7c5bacba75a46d48ac840dee5bec99)

해당 플레이어의 **푸시 알림 보내기** 페이지가 열립니다.

* **푸시 알림 보내기** 단추 \*\*(1)\*\*를 선택합니다.

* \*\*제목 (2)\*\*을 입력합니다.

* 메시지 본문 \*\*(3)\*\*을 입력합니다.

* **푸시 알림 보내기** 단추 \*\*(4)\*\*를 선택하여 변경 내용을 커밋합니다.

![PlayFab - 푸시 알림 보내기](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/playfab-send-push-notification.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=e055e70076d9991525fe1668015c0760)

* 메시지가 디바이스에 도착하는지 확인합니다.

![Android 앱 - PlayFab 푸시 알림 수신](https://mintcdn.com/microsoft-4404708b/3hg2JQs0m7qmDqay/images/playfab/live-service-management/game-configuration/title-communications/tutorials/android-app-receive-playfab-push-notification.png?fit=max\&auto=format\&n=3hg2JQs0m7qmDqay\&q=85\&s=dd679dd51527afebfb287bc2ab59d2c9)

메시지가 도착하면 메시지가 애플리케이션에 성공적으로 배달되고 있는 것입니다.

이제 통합이 성공적으로 완료되었습니다. 애플리케이션이 실제로 실행 중일 때 **FooAppFirebaseMessagingService**를 사용하여 수신 메시지를 처리할 수 있습니다.


## Related topics

- [Android용 푸시 알림](https://docs.xbox.com/ko/services/playfab/live-service-management/game-configuration/title-communications/push-notifications/push-notifications-for-android.md)
- [네이티브 및 Android Studio용 Java 빠른 시작](https://docs.xbox.com/ko/services/playfab/sdks/java/quickstart.md)
- [푸시 알림 빠른 시작](https://docs.xbox.com/ko/services/playfab/live-service-management/game-configuration/title-communications/push-notifications/quickstart.md)
- [푸시 알림 템플릿](https://docs.xbox.com/ko/services/playfab/live-service-management/game-configuration/title-communications/push-notifications/push-notification-templates.md)
- [푸시 알림](https://docs.xbox.com/ko/services/playfab/live-service-management/game-configuration/title-communications/push-notifications/index.md)
