티스토리 뷰

반응형

Xamarin.Android를 통한 푸시 서비스 구현을 안내드립니다. 여기서는 Firebase Cloud Messaging과 PushSharp 라이브러리를 이용합니다.

참고: 구글 푸시 서비스는 최초에는 C2DM(Cloud to Device Messaging)라는 이름으로 서비스하다가 GCM(Google Cloud Messaging)라는 이름으로 변경되었으며, 2018년 4월을 기점으로 GCM이 Deprecated되고 FCM (Firebase Cloud Messaging) 이름으로 서비스되고 있습니다. Firebase는 Android 4.0 (Icecream Sandwich, API 14)부터 지원합니다.

Firebase Cloud Messaging 설정

  1. 구글 개발자 계정으로 로그인 한 후 Firebase Messaging Service (https://console.firebase.google.com/)로 이동합니다.
  2. [프로젝트 추가] 버튼을 클릭하여 프로젝트를 생성합니다.
  3. 이제 Project Overview에서 [Android 앱에 Firebase 추가] 버튼을 클릭합니다.
  4. 패키지 이름을 입력하고 [앱 등록]을 클릭합니다.
  5. google-services.json 다운로드 페이지가 나타납니다. 이 파일에는 앱이 구글 서비스에 접속하기 위한 인증정보가 포함되어 있습니다. 파일을 다운로드 후 아래 그림처럼  Xamarin.Android 프로젝트의 루트 폴더에 추가해주세요.

프로젝트에 패키지 설치

  1. Android SDK Manager를 실행해 주세요.
  2. 추가(Extras) 섹션에 Google Repository가 설치되어 있는지 확인해주세요. 설치되어 있지 않으면, 체크하여 설치해주세요.
  3. Xamarin.Android 프로젝트의 Nuget Package Manager를 열고 [Xamarin.GooglePlayServices.Base] 패키지를 설치해주세요.
    (참고: 만약 설치 중 오류가 발생한다면 Xamarin.Forms 패키지와 호환성 때문일 가능성이 높습니다. 이 경우 Xamarin.GooglePlayServices.Base 패키지 버전을 점점 낮춰가며 설치를 시도해보세요. 여기서는 Xamarin.Forms 2.5.0.121934와 Xamarin.GooglePlayServices.Base 42.1021.1을 설치하였습니다.)
  4. 이제 [Xamarin.Firebase.Messaging] 패키지를 설치합시다. 패키지 버전은 Xamarin.GooglePlayServices.Base과 동일하게 해주세요. (여기서는 42.1021.1을 설치하였습니다)
  5. 테스트 할 안드로이드 OS에 Google Play Service이 설치가 되어있어야 합니다. 보통 설정 → 애플리케이션 관리자에서 설치여부를 확인하실 수 있습니다. 설치되어 있지 않은 경우 Google Play 앱스토어 apk를 설치해주시면 됩니다. (설치 도움말)
  6. 이제 Visual Studio를 종료한 후 다시 실행해주세요. 그리고 위에서 추가한 google-services.json의 Build Action을 GoogleServicesJson으로 변경해주세요.
    (만약 Build Action에 GoogleServciesJson이 나타나지 않으면 Xamarin.Firebase.Messaging을 다시 설치하신 후 Visual Studio을 재실행해주세요.)

Instance ID 수신자 추가하기

앱이 실행되면 Xamarin.Firebase.Messaging 패키지는 Firebase 서버와 통신하여 앱 식별자를 할당받게 됩니다. 이 앱 식별자 값을 Registration ID라고 하며 스마트폰을 식별하는 유일한 값이며 주기적으로 변경되거나 갱신될 수 있습니다. 개발자는 Registration ID와 함께 Message를 작성하며 Firebase 서버에 전송하면, Firebase 서버는 해당 스마트폰에 푸시 알림을 전송하게 됩니다. 여기서는 Registration ID를 수신받기 위한 설정 방법에 대해 안내드립니다.

  1. Xamarin.Android 프로젝트에서 Properties/AndroidManifest.xml를 열고 아래와 같이 <receiver> 엘리먼트를 <application> 섹션 하위에 추가합니다.
    <receiver
        android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
        android:exported="false" />
    <receiver
        android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>
    
  2. 프로젝트 Properties를 열고 Android Manifest / Required permission으로 이동 후 INTERNET Permission을 추가합니다.
  3. 프로젝트에 아래와 같은 IDService Class 파일을 추가합니다.

    using System;
    using Android.App;
    using Firebase.Iid;
    using Android.Util;
    
    namespace xfTestNotify.Droid.Code
    {
        [Service]
        [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
        public class FirebaseIIDService : FirebaseInstanceIdService
        {
            //Registration ID가 갱신될 때만 호출됩니다. (한번 호출되면 갱신되기 전까지 호출되지 않음)
            public override void OnTokenRefresh()
            {
                string refreshedToken = FirebaseInstanceId.Instance.Token;
                Log.Debug("FirebaseIIDService ", "Refreshed token: " + refreshedToken);
    
                SendRegistrationIdToServer(refreshedToken);
            }
    
    
            //Registration ID를 앱서버로 전송하는 로직을 구현해주세요.
            private void SendRegistrationIdToServer(string refreshedToken)
            {
            }
        }
    }
    

    수신된 Registration ID는 푸시 알림을 발송할 때 사용됩니다. 일반적으로 앱서버에 Registration ID를 전송하고, 앱서버에서는 Registration ID들을 따로 보관해뒀다가 푸시 알림을 발송하는 형태로 사용됩니다.

    참고로 Registration ID는 다음과 같은 순간에 변경됩니다.

    • 앱을 설치(혹은 재설치) 할 때
    • 사용자가 앱 데이터를 삭제할 때
    • 앱이 Instance ID를 삭제할 때
    • 보안 토큰이 손상되었을 때
    • Google Instance ID 문서에 따르면 6개월 마다 갱신된다고 함

푸시 알림 발송 테스트

푸시 알림이 정상적으로 발생하는지 테스트해 봅시다.

  1. 먼저 앱을 실행합니다. 위에서 작성한 코드를 그대로 실행하면 아래와 같이 Registration ID가 출력될 것입니다.
  2. 1에서 생성된 Registration Id를 복사합니다.
  3. Firebase Console로 이동하여 해당 프로젝트를 선택합니다.
  4. Project Overview 페이지에서 Notification의 [시작하기]를 클릭합니다.
  5. [첫 번째 메시지 보내기]를 클릭합니다.
  6. 아래와 같이 작성하여 [메시지 보내기]를 클릭하면 푸시 메시지가 발송됩니다.

푸시 알림 형태 조정하기

앱이 실행 중이지 않을 때에는 안드로이드 운영체제에서 푸시알림을 출력하지만, 앱이 실행 중인 상태에서는 직접 푸시 알림을 구현해야 합니다. 아래는 푸시 메시지를 수신하는 코드이며, Local Push Notification을 나타내는 등 원하는 형태로 처리할 수 있습니다.

[Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class PushFcmMessagingService : FirebaseMessagingService
{
    public override void OnMessageReceived(RemoteMessage message)
    {
        //앱이 실행 중인 상태에서 푸시 메시지를 수신했을 때 실행됨
             //직접 Local Notification을 띄우거나 원하는 방향으로 처리할 수 있음
        string messageFrom = message.From;
        string messageString = message.GetNotification().Body;
        Log.Debug("PushFirebaseMessagingService", "From: " + messageFrom);
        Log.Debug("PushFirebaseMessagingService", "Notification Message Body: " + messageString);
        
    }
}


References

  • MS - FCM 구축 안내: https://docs.microsoft.com/ko-kr/xamarin/android/data-cloud/google-messaging/remote-notifications-with-fcm?tabs=vswin
  • MS - FCM 기본 설명: https://docs.microsoft.com/ko-kr/xamarin/android/data-cloud/google-messaging/firebase-cloud-messaging
  • Xamarin Blog - FCM 구축 안내: https://blog.xamarin.com/implementing-push-notifications-android-apps/
  • Xamarin Sample Source : https://developer.xamarin.com/samples/monodroid/Firebase/FCMNotifications/



댓글