Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

Unity로 Firebase 클라우드 메시징 클라이언트 앱 설정

Unity로 교차 플랫폼 Firebase Cloud Messaging 클라이언트 앱을 작성하려면 Firebase Cloud Messaging API를 사용하세요. Unity SDK는 Android와 Apple 모두에서 작동하며 각 플랫폼에 필요한 몇 가지 추가 설정이 있습니다.

시작하기 전에

전제 조건

  • Unity 2019.1 이상을 설치합니다. 이전 버전도 호환될 수 있지만 적극적으로 지원되지는 않습니다. Unity 2019.1에 대한 지원은 더 이상 사용되지 않는 것으로 간주되며 다음 주요 릴리스 이후에는 더 이상 적극적으로 지원되지 않습니다.

  • (iOS 전용) 다음을 설치합니다.

    • 엑스코드 13.3.1 이상
    • 코코아팟 1.10.0 이상
  • Unity 프로젝트가 다음 요구 사항을 충족하는지 확인하세요.

    • iOS의 경우 — iOS 11 이상을 대상으로 합니다.
    • Android의 경우 — API 레벨 19(KitKat) 이상을 대상으로 합니다.
  • 기기를 설정하거나 에뮬레이터를 사용하여 Unity 프로젝트를 실행하세요.

    • iOS의 경우 — 앱을 실행할 물리적 iOS 장치 를 설정하고 다음 작업을 완료합니다.

      • Apple 개발자 계정 에 대한 Apple 푸시 알림 인증 키를 얻습니다.
      • App > Capabilities 아래의 XCode에서 푸시 알림을 활성화합니다.
    • Android의 경우에뮬레이터 는 Google Play에서 에뮬레이터 이미지를 사용해야 합니다.

아직 Unity 프로젝트가 없고 Firebase 제품을 사용해 보고 싶다면 빠른 시작 샘플 중 하나를 다운로드할 수 있습니다.

1단계: Firebase 프로젝트 만들기

Unity 프로젝트에 Firebase를 추가하려면 먼저 Unity 프로젝트에 연결할 Firebase 프로젝트를 만들어야 합니다. Firebase 프로젝트에 대해 자세히 알아보려면 Firebase 프로젝트 이해 를 방문하세요.

2단계: Firebase에 앱 등록

Firebase 프로젝트에 연결할 하나 이상의 앱 또는 게임을 등록할 수 있습니다.

  1. Firebase 콘솔 로 이동합니다.

  2. 프로젝트 개요 페이지 중앙에서 Unity 아이콘( )을 클릭하여 설정 워크플로를 시작합니다.

    Firebase 프로젝트에 앱을 이미 추가한 경우 앱 추가 를 클릭하여 플랫폼 옵션을 표시합니다.

  3. 등록하려는 Unity 프로젝트의 빌드 대상을 선택하거나 지금 동시에 두 대상을 등록하도록 선택할 수도 있습니다.

  4. Unity 프로젝트의 플랫폼별 ID를 입력합니다.

    • iOS의 경우iOS 번들 ID 필드에 Unity 프로젝트의 iOS ID를 입력합니다.

    • Android의 경우Android 패키지 이름 필드에 Unity 프로젝트의 Android ID를 입력합니다.
      패키지 이름애플리케이션 ID 라는 용어는 종종 같은 의미로 사용됩니다.

  5. (선택 사항) Unity 프로젝트의 플랫폼별 닉네임을 입력합니다.
    이러한 닉네임은 내부 편의 식별자이며 Firebase 콘솔에서만 볼 수 있습니다.

  6. 앱 등록 을 클릭합니다.

3단계: Firebase 구성 파일 추가

  1. Firebase 콘솔 설정 워크플로에서 플랫폼별 Firebase 구성 파일을 가져옵니다.

    • iOS의 경우GoogleService-Info.plist 다운로드 를 클릭합니다.

    • Android의 경우google-services.json 다운로드 를 클릭합니다.

  2. Unity 프로젝트의 프로젝트 창을 연 다음 구성 파일을 Assets 폴더로 이동합니다.

  3. Firebase 콘솔로 돌아가서 설정 워크플로에서 다음 을 클릭합니다.

4단계: Firebase Unity SDK 추가

  1. Firebase 콘솔에서 Firebase Unity SDK 다운로드 를 클릭한 다음 편리한 위치에 SDK의 압축을 풉니다.

    • 언제든지 Firebase Unity SDK 를 다시 다운로드할 수 있습니다.

    • Firebase Unity SDK는 플랫폼별로 다르지 않습니다.

  2. 열려 있는 Unity 프로젝트에서 Assets > Import Package > Custom Package 로 이동합니다.

  3. 압축을 푼 SDK에서 앱에서 사용하려는 지원되는 Firebase 제품 을 선택합니다.

    Firebase 클라우드 메시징에 대한 최적의 환경을 위해 프로젝트에서 Google Analytics를 활성화하는 것이 좋습니다. 또한 애널리틱스 설정의 일부로 애널리틱스용 Firebase 패키지를 앱에 추가해야 합니다.

    애널리틱스 사용

    • Google 애널리틱스용 Firebase 패키지 추가: FirebaseAnalytics.unitypackage
    • Firebase 클라우드 메시징용 패키지 추가: FirebaseMessaging.unitypackage

    애널리틱스가 사용 설정되지 않음

    Firebase 클라우드 메시징용 패키지 추가: FirebaseMessaging.unitypackage

  4. Unity 패키지 가져오기 창에서 가져오기 를 클릭합니다.

  5. Firebase 콘솔로 돌아가서 설정 워크플로에서 다음 을 클릭합니다.

5단계: Google Play 서비스 버전 요구 사항 확인

Android용 Firebase Unity SDK에는 Google Play 서비스 가 필요하며 SDK를 사용하려면 최신 버전이어야 합니다.

애플리케이션 시작 부분에 다음 코드를 추가합니다. SDK에서 다른 메서드를 호출하기 전에 Firebase Unity SDK에 필요한 버전으로 Google Play 서비스를 확인하고 선택적으로 업데이트할 수 있습니다.

Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
  var dependencyStatus = task.Result;
  if (dependencyStatus == Firebase.DependencyStatus.Available) {
    // Create and hold a reference to your FirebaseApp,
    // where app is a Firebase.FirebaseApp property of your application class.
       app = Firebase.FirebaseApp.DefaultInstance;

    // Set a flag here to indicate whether Firebase is ready to use by your app.
  } else {
    UnityEngine.Debug.LogError(System.String.Format(
      "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
    // Firebase Unity SDK is not safe to use here.
  }
});

Unity 프로젝트가 Firebase를 사용하도록 등록 및 구성되었습니다.

7단계: 사용자 알림 프레임워크 추가

  1. Xcode에서 프로젝트를 클릭한 다음 편집기 영역 에서 일반 탭을 선택합니다.

  2. Linked Frameworks and Libraries 까지 아래로 스크롤한 다음 + 버튼을 클릭하여 프레임워크를 추가합니다.

  3. 표시되는 창에서 UserNotifications.framework 로 스크롤하고 해당 항목을 클릭한 다음 추가 를 클릭합니다.

8단계: 푸시 알림 활성화

  1. Xcode에서 프로젝트를 클릭한 다음 Editor 영역 에서 Capabilities 탭을 선택합니다.

  2. 푸시 알림켜기 로 전환합니다.

  3. 배경 모드 까지 아래로 스크롤한 다음 켜기 로 전환합니다.

  4. 백그라운드 모드 에서 원격 알림 확인란을 선택합니다.

Firebase 클라우드 메시징 초기화

Firebase 클라우드 메시지 라이브러리는 TokenReceived 또는 MessageReceived 이벤트에 대한 핸들러를 추가할 때 초기화됩니다.

초기화 시 클라이언트 앱 인스턴스에 대한 등록 토큰이 요청됩니다. 앱은 나중에 사용할 수 있도록 캐시해야 하는 OnTokenReceived 이벤트와 함께 토큰을 받습니다. 메시지에 대해 이 특정 장치를 대상으로 지정하려면 이 토큰이 필요합니다.

또한 들어오는 메시지를 받을 수 있으려면 OnMessageReceived 이벤트에 등록해야 합니다.

전체 설정은 다음과 같습니다.

public void Start() {
  Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
  Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
}

public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token) {
  UnityEngine.Debug.Log("Received Registration Token: " + token.Token);
}

public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) {
  UnityEngine.Debug.Log("Received a new message from: " + e.Message.From);
}

Android 진입점 활동 구성

Android에서 Firebase Cloud Messaging은 기본 UnityPlayerActivity 를 대체하는 사용자 지정 진입점 활동과 함께 번들로 제공됩니다. 사용자 지정 진입점을 사용하지 않는 경우 이 교체는 자동으로 수행되며 추가 작업을 수행할 필요가 없습니다. 기본 진입점 활동을 사용하지 않거나 자체 Assets/Plugins/AndroidManifest.xml 을 제공하는 앱은 추가 구성이 필요합니다.

Android의 Firebase Cloud Messaging Unity Plugin은 두 개의 추가 파일과 함께 번들로 제공됩니다.

  • Assets/Plugins/Android/libmessaging_unity_player_activity.jar 에는 표준 UnityPlayerActivity 를 대체하는 MessagingUnityPlayerActivity 라는 활동이 포함되어 있습니다.
  • Assets/Plugins/Android/AndroidManifest.xmlMessagingUnityPlayerActivity 를 앱의 진입점으로 사용하도록 앱에 지시합니다.

이러한 파일은 기본 UnityPlayerActivityonStop , onRestart 활동 수명 주기 전환을 처리하지 않거나 Firebase 클라우드 메시징이 수신 메시지를 올바르게 처리하는 데 필요한 onNewIntent 를 구현하지 않기 때문에 제공됩니다.

사용자 정의 진입점 활동 구성

앱에서 기본 UnityPlayerActivity 를 사용하지 않는 경우 제공된 AndroidManifest.xml 을 제거하고 사용자 지정 활동이 Android 활동 수명 주기 의 모든 전환을 적절하게 처리하는지 확인해야 합니다(이를 수행하는 방법의 예는 아래에 나와 있음). 맞춤 활동이 UnityPlayerActivity 를 확장하는 경우 필요한 모든 메서드를 구현하는 com.google.firebase.MessagingUnityPlayerActivity 를 대신 확장할 수 있습니다.

맞춤 활동을 사용 com.google.firebase.MessagingUnityPlayerActivity 를 확장하지 않는 경우 활동에 다음 스니펫을 포함해야 합니다.

/**
 * Workaround for when a message is sent containing both a Data and Notification payload.
 *
 * When the app is in the background, if a message with both a data and notification payload is
 * received the data payload is stored on the Intent passed to onNewIntent. By default, that
 * intent does not get set as the Intent that started the app, so when the app comes back online
 * it doesn't see a new FCM message to respond to. As a workaround, we override onNewIntent so
 * that it sends the intent to the MessageForwardingService which forwards the message to the
 * FirebaseMessagingService which in turn sends the message to the application.
 */
@Override
protected void onNewIntent(Intent intent) {
  Intent message = new Intent(this, MessageForwardingService.class);
  message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT);
  message.putExtras(intent);
  message.setData(intent.getData());
  // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`.
  // startService(message);
  MessageForwardingService.enqueueWork(this, message);
}

/**
 * Dispose of the mUnityPlayer when restarting the app.
 *
 * This ensures that when the app starts up again it does not start with stale data.
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
  if (mUnityPlayer != null) {
    mUnityPlayer.quit();
    mUnityPlayer = null;
  }
  super.onCreate(savedInstanceState);
}

Firebase C++ SDK의 새 버전(7.1.0 이상)은 AndroidManifest.xml 파일에서 추가 수정이 필요한 JobIntentService 를 사용합니다.

<service android:name="com.google.firebase.messaging.MessageForwardingService"
     android:permission="android.permission.BIND_JOB_SERVICE"
     android:exported="false" >
</service>

Android에서의 메시지 전달에 대한 참고 사항

앱이 전혀 실행되지 않고 사용자가 알림을 탭하면 메시지는 기본적으로 FCM의 내장 콜백을 통해 라우팅되지 않습니다. 이 경우 메시지 페이로드는 응용 프로그램을 시작하는 데 사용되는 Intent 를 통해 수신됩니다.

앱이 백그라운드에 있는 동안 수신된 메시지에는 시스템 트레이 알림을 채우는 데 사용되는 알림 필드의 콘텐츠가 있지만 해당 알림 콘텐츠는 FCM에 전달되지 않습니다. 즉, FirebaseMessage.Notification 은 null이 됩니다.

요약해서 말하자면:

앱 상태 공고 데이터 둘 다
전경 Firebase.Messaging.FirebaseMessaging.MessageReceived Firebase.Messaging.FirebaseMessaging.MessageReceived Firebase.Messaging.FirebaseMessaging.MessageReceived
배경 시스템 트레이 Firebase.Messaging.FirebaseMessaging.MessageReceived 알림: 시스템 트레이
데이터: 의도의 엑스트라.

자동 초기화 방지

FCM은 기기 타겟팅을 위한 등록 토큰을 생성합니다. 토큰이 생성되면 라이브러리는 식별자와 구성 데이터를 Firebase에 업로드합니다. 토큰을 사용하기 전에 명시적으로 옵트인하려면 FCM(및 Android에서는 분석)을 비활성화하여 구성 시 생성을 방지할 수 있습니다. 이렇게 하려면 Apple의 Info.plist ( GoogleService-Info.plist 아님) 또는 Android의 AndroidManifest.xml 에 메타데이터 값을 추가합니다.

기계적 인조 인간

<?xml version="1.0" encoding="utf-8"?>
<application>
  <meta-data android:name="firebase_messaging_auto_init_enabled"
             android:value="false" />
  <meta-data android:name="firebase_analytics_collection_enabled"
             android:value="false" />
</application>

빠른

FirebaseMessagingAutoInitEnabled = NO

FCM을 다시 활성화하려면 런타임 호출을 할 수 있습니다.

Firebase.Messaging.FirebaseMessaging.TokenRegistrationOnInitEnabled = true;

이 값은 일단 설정되면 앱을 다시 시작해도 지속됩니다.

FCM에서는 앱에 대한 딥 링크가 포함된 메시지를 보낼 수 있습니다. 딥 링크가 포함된 메시지를 수신하려면 앱의 딥 링크를 처리하는 활동에 새 인텐트 필터를 추가해야 합니다. 의도 필터는 도메인의 딥 링크를 포착해야 합니다. 메시지에 딥 링크가 포함되어 있지 않으면 이 구성이 필요하지 않습니다. AndroidManifest.xml에서:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/>
</intent-filter>

의도 필터를 보다 유연하게 만들기 위해 와일드카드를 지정할 수도 있습니다. 예를 들어:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="*.example.com" android:scheme="http"/>
  <data android:host="*.example.com" android:scheme="https"/>
</intent-filter>

사용자가 지정한 체계 및 호스트에 대한 링크가 포함된 알림을 탭하면 앱이 링크를 처리하기 위해 이 인텐트 필터로 활동을 시작합니다.

다음 단계

클라이언트 앱을 설정하고 나면 Firebase로 다운스트림 및 주제 메시지를 보낼 준비가 된 것입니다. 자세한 내용은 이 기능을 보여주는 빠른 시작 샘플 을 참조하세요.

앱에 다른 고급 동작을 추가하려면 앱 서버에서 메시지 보내기에 대한 가이드를 참조하세요.

이러한 기능을 사용하려면 서버 구현 이 필요합니다.