Unity로 교차 플랫폼 Firebase Cloud Messaging 클라이언트 앱을 작성하려면 Firebase Cloud Messaging API를 사용하세요. Unity SDK는 Android와 Apple 모두에서 작동하며 각 플랫폼에 필요한 몇 가지 추가 설정이 있습니다.
시작하기 전에
전제 조건
Unity 2019.1 이상을 설치합니다. 이전 버전도 호환될 수 있지만 적극적으로 지원되지는 않습니다. Unity 2019.1에 대한 지원은 더 이상 사용되지 않는 것으로 간주되며 다음 주요 릴리스 이후에는 더 이상 적극적으로 지원되지 않습니다.
(Apple 플랫폼만 해당) 다음을 설치합니다.
- 엑스코드 13.3.1 이상
- 코코아팟 1.10.0 이상
Unity 프로젝트가 다음 요구 사항을 충족하는지 확인하세요.
- iOS의 경우 — iOS 11 이상을 대상으로 합니다.
- tvOS용 - tvOS 12 이상 대상
- Android의 경우 — API 레벨 19(KitKat) 이상을 대상으로 합니다.
기기를 설정하거나 에뮬레이터를 사용하여 Unity 프로젝트를 실행하세요.
iOS 또는 tvOS의 경우 — 앱을 실행할 물리적 장치 를 설정하고 다음 작업을 완료합니다.
- Apple 개발자 계정 에 대한 Apple 푸시 알림 인증 키를 얻습니다.
- App > Capabilities 아래의 XCode에서 푸시 알림을 활성화합니다.
Android의 경우 — 에뮬레이터 는 Google Play에서 에뮬레이터 이미지를 사용해야 합니다.
- Google 계정을 사용하여 Firebase에 로그인 합니다.
아직 Unity 프로젝트가 없고 Firebase 제품을 사용해 보고 싶다면 빠른 시작 샘플 중 하나를 다운로드할 수 있습니다.
1단계: Firebase 프로젝트 만들기
Unity 프로젝트에 Firebase를 추가하려면 먼저 Unity 프로젝트에 연결할 Firebase 프로젝트를 만들어야 합니다. Firebase 프로젝트에 대해 자세히 알아보려면 Firebase 프로젝트 이해 를 방문하세요.
2단계: Firebase에 앱 등록
Firebase 프로젝트에 연결할 하나 이상의 앱 또는 게임을 등록할 수 있습니다.
Firebase 콘솔 로 이동합니다.
프로젝트 개요 페이지 중앙에서 Unity 아이콘(
)을 클릭하여 설정 워크플로를 시작합니다.Firebase 프로젝트에 앱을 이미 추가한 경우 앱 추가 를 클릭하여 플랫폼 옵션을 표시합니다.
등록하려는 Unity 프로젝트의 빌드 대상을 선택하거나 지금 동시에 두 대상을 등록하도록 선택할 수도 있습니다.
Unity 프로젝트의 플랫폼별 ID를 입력합니다.
iOS의 경우 — iOS 번들 ID 필드에 Unity 프로젝트의 iOS ID를 입력합니다.
Android의 경우 — Android 패키지 이름 필드에 Unity 프로젝트의 Android ID를 입력합니다.
패키지 이름 과 애플리케이션 ID 라는 용어는 종종 같은 의미로 사용됩니다.
Unity IDE에서 Unity 프로젝트를 연 다음 각 플랫폼의 설정 섹션으로 이동합니다.
iOS의 경우 — 빌드 설정 > iOS 로 이동합니다.
Android의 경우 — Android > 플레이어 설정 > 기타 설정 으로 이동합니다.
Unity 프로젝트의 ID는 번들 식별자 값입니다(예제 ID:
com.yourcompany.yourproject
).(선택 사항) Unity 프로젝트의 플랫폼별 닉네임을 입력합니다.
이러한 닉네임은 내부 편의 식별자이며 Firebase 콘솔에서만 볼 수 있습니다.앱 등록 을 클릭합니다.
3단계: Firebase 구성 파일 추가
Firebase 콘솔 설정 워크플로에서 플랫폼별 Firebase 구성 파일을 가져옵니다.
iOS의 경우 — GoogleService-Info.plist 다운로드 를 클릭합니다.
Android의 경우 — google-services.json 다운로드 를 클릭합니다.
Firebase 구성 파일에는 고유하지만 비밀이 아닌 프로젝트 식별자가 포함되어 있습니다. 이 구성 파일에 대해 자세히 알아보려면 Firebase 프로젝트 이해 를 방문하세요.
언제든지 Firebase 구성 파일 을 다시 다운로드할 수 있습니다.
구성 파일 이름에
(2)
와 같은 추가 문자가 추가되지 않았는지 확인하십시오.
Unity 프로젝트의 프로젝트 창을 연 다음 구성 파일을
Assets
폴더로 이동합니다.Firebase 콘솔로 돌아가서 설정 워크플로에서 다음 을 클릭합니다.
4단계: Firebase Unity SDK 추가
Firebase 콘솔에서 Firebase Unity SDK 다운로드 를 클릭한 다음 편리한 위치에 SDK의 압축을 풉니다.
언제든지 Firebase Unity SDK 를 다시 다운로드할 수 있습니다.
Firebase Unity SDK는 플랫폼별로 다르지 않습니다.
열려 있는 Unity 프로젝트에서 Assets > Import Package > Custom Package 로 이동합니다.
압축을 푼 SDK에서 앱에서 사용하려는 지원되는 Firebase 제품 을 선택합니다.
Firebase 클라우드 메시징에 대한 최적의 환경을 위해 프로젝트에서 Google Analytics를 활성화하는 것이 좋습니다. 또한 애널리틱스 설정의 일부로 애널리틱스용 Firebase 패키지를 앱에 추가해야 합니다.
애널리틱스 사용
- Google 애널리틱스용 Firebase 패키지 추가:
FirebaseAnalytics.unitypackage
- Firebase 클라우드 메시징용 패키지 추가:
FirebaseMessaging.unitypackage
애널리틱스가 사용 설정되지 않음
Firebase 클라우드 메시징용 패키지 추가:
FirebaseMessaging.unitypackage
- Google 애널리틱스용 Firebase 패키지 추가:
Unity 패키지 가져오기 창에서 가져오기 를 클릭합니다.
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단계: 사용자 알림 프레임워크 추가
Xcode에서 프로젝트를 클릭한 다음 편집기 영역 에서 일반 탭을 선택합니다.
Linked Frameworks and Libraries 까지 아래로 스크롤한 다음 + 버튼을 클릭하여 프레임워크를 추가합니다.
표시되는 창에서 UserNotifications.framework 로 스크롤하고 해당 항목을 클릭한 다음 추가 를 클릭합니다.
8단계: 푸시 알림 활성화
Xcode에서 프로젝트를 클릭한 다음 Editor 영역 에서 Capabilities 탭을 선택합니다.
푸시 알림 을 켜기 로 전환합니다.
배경 모드 까지 아래로 스크롤한 다음 켜기 로 전환합니다.
백그라운드 모드 에서 원격 알림 확인란을 선택합니다.
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.xml
은MessagingUnityPlayerActivity
를 앱의 진입점으로 사용하도록 앱에 지시합니다.
이러한 파일은 기본 UnityPlayerActivity
가 onStop
, 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;
이 값은 일단 설정되면 앱을 다시 시작해도 지속됩니다.
Android에서 딥 링크로 메시지 처리
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로 다운스트림 및 주제 메시지를 보낼 준비가 된 것입니다. 자세한 내용은 이 기능을 보여주는 빠른 시작 샘플 을 참조하세요.
앱에 다른 고급 동작을 추가하려면 앱 서버에서 메시지 보내기에 대한 가이드를 참조하세요.
이러한 기능을 사용하려면 서버 구현 이 필요합니다.