استفاده همزمان از FCM و کتابخانه پوش‌متریکس

کتابخانه پوش‌متریکس برای دریافت اعلان از سرویس FCM(Firebase Cloud Messaging) گوگل استفاده می‌کند. در صورتی که پوش‌متریکس تنها سرویسی در اپلیکیشن شما باشد که از این سرویس استفاده می‌کند، دنبال کردن مراحل موجود در مستندات پیاده‌سازی کافی خواهد بود.

در مواردی که غیر از پوش‌متریکس سرویس دیگری نیز بخواهد از FCM استفاده کند، مثلا اگر خود شما بخواهید مستقیما از Firebase استفاده کنید و پیغام‌های FCM را دریافت کنید، تداخل پیش خواهد آمد، چرا که در هر اپلیکیشن تنها یک سرویس گوش‌دهنده به پیغام‌های FCM می‌تواند وجود داشته باشد. اگر بیش از یک سرویس گوش‌دهنده تعریف شود، پیغام‌هایی که به اپلیکیشن می‌رسند به صورت تصادفی تنها به دست یکی از این سرویس‌ها خواهد رسید و این باعث مختل شدن کار برنامه می‌شود.

برای رفع این مشکل لازم است مراحل زیر را در راه اندازی طی کنید:

  1. سرویس گوش دهنده FCM پوش‌متریکس را غیر فعال کنید
  2. سرویس گوش دهنده FCM خود را فعال کنید
  3. با دریافت پیغام‌های FCM و رخ دادن رویداد‌های مربوط به آن در سرویس خود، پوش‌متریکس را مطلع کنید


در ادامه نحوه اعمال این مراحل را قدم به قدم توضیح می‌دهیم:

غیر فعال کردن سرویس FCM پوش‌متریکس

برای غیر فعال کردن سرویس FCM پوش‌متریکس، عبارت زیر را در تگ <application> فایل AndroidManifest.xml خود بگذارید:

<service
    android:name="ir.metrix.notification.messaging.fcm.FcmService" 
    tools:node="remove" />



ایجاد سرویس FCM دلخواه خود

در صورتی که از قبل سرویس FCM برای برنامه‌ی خود ایجاد کرده‌اید می‌توانید از این مرحله بگذرید.

مانند نمونه زیر، یک کلاس جدید بسازید که از کلاس FirebaseMessagingService ارث می‌برد.

public class MyFcmService extends FirebaseMessagingService {

}

سرویس جدید را با گذاشتن عبارت زیر در تگ <application> فایل AndroidManifest.xml برنامه خود فعال کنید. توجه داشته باشید که نام کلاس را با نام کلاس تعریف شده خود جایگزین کنید.

<service android:name=".MyFcmService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>


رساندن پیغام‌ها و رویداد‌ها به پوش‌متریکس

در کلاس تعریف شده در مرحله قبل، متدهای زیر را به همراه کد داخل آن‌ها پیاده‌سازی کنید:

public class MyFcmService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (MetrixNotification.getFcmHandler().onMessageReceived(remoteMessage)) {
            // Message is for PushMetrix
            return;
        }
        super.onMessageReceived(remoteMessage);

        // Handle Firebase message
    }

    @Override
    public void onNewToken(String s) {
        MetrixNotification.getFcmHandler().onNewToken(s);
        super.onNewToken(s);

        // Token is refreshed
    }

    @Override
    public void onMessageSent(String s) {
        MetrixNotification.getFcmHandler().onMessageSent(s);
        super.onMessageSent(s);

        // Message sent
    }

    @Override
    public void onDeletedMessages() {
        MetrixNotification.getFcmHandler().onDeletedMessages();
        super.onDeletedMessages();

        // Message was deleted
    }

    @Override
    public void onSendError(String s, Exception e) {
        MetrixNotification.getFcmHandler().onSendError(s, e);
        super.onSendError(s, e);

        // Error sent
    }
}

هر بار که یک پیغام FCM به برنامه شما می‌رسد، تابع onMessageReceived کلاس شما صدا زده می‌شود. همانطور که در مثال بالا مشاهده می‌کنید در پیاده‌سازی این تابع، شما با استفاده از عبارت زیر پوش‌متریکس را از دریافت پیغام مطلع می‌کنید:

fcmHandler.onMessageReceived(remoteMessage)

با این کار پیغام به دست پوش‌متریکس نیز می‌رسد و اگر پیغام مربوط به کتابخانه‌ی پوش‌متریکس باشد عملیات لازم بر روی آن انجام می‌شود. در صورتی که پیغام مربوط به پوش‌متریکس باشد عبارت بالا مقدار true بر می‌گرداند و شما نیازی نیست عملیات بیشتری روی این پیغام انجام دهید. در صورتی که از عبارت بالا مقدار false گرفتید به این معنی است که پیغام مربوط به پوش‌متریکس نیست و شما باید بسته به نیاز خود عملیات مورد نظر را برای آن انجام دهید.

سایر توابع کلاس تعریف شده، زمان رخ دادن رویداد‌های مختلف مربوط به FCM صدا زده می‌شوند. همانطور که در مثال بالا نشان داده شد، نیاز است که شما هنگام رخ دادن این رویدادها با صدا زدن تابع مربوطه، پوش‌متریکس را از رخ دادن این رویدادها مطلع کنید.