استفاده همزمان با دیگر سرویس‌های fcm

نکته:‌ در این بخش بایستی کد به زبان نیتیو اندروید نوشته شود.

مشکل استفاده‌ از دو سرویس FCM

پوشه برای دریافت و ارسال پیام‌های خود از سرویس FCM(Firebase cloud messaging)گوگل استفاده می‌کند. در صورتی که قصد دارید در کنار پوشه از سرویس دیگری مانند فایربیس و یا هر سرویسی که پایه‌ی آن fcm است، استفاده‌کنید باید در نظر داشته‌باشید که در هربرنامه فقط یک سرویس برپایه‌ی fcm می‌تواند باشد و در صورت وجود بیش از یک سرویس، ممکن است در کار آنها اختلال ایجاد کند.

رفع مشکل اختلال سرویس‌ها

برای جلوگیری از ایجاد اخلال باید یک سرویس طراحی کنید و پیام‌های سایر سرویس‌ها را جداسازی کنید. در این صورت ارجاع پیام به سرویس مربوطه بایستی دستی انجام شود تا هر سرویس بتواند جدا از سرویس دیگری کار خود را انجام دهد.

حذف سرویس ها و ساخت سرویس جدید

در این بخش باید تگ‌های سرویس پوشه و لایبرری دیگر که از فایربیس استفاده می‌کند (مثل خود فایربیس در ReactNative) را از مانیفست نهایی پاک کنید و تگ سرویس خود را قرار دهید.

فایل AndroidManifest.xml خود را باز کرده و در داخل تگ application در قبل یا بعد از توکن پوشه خطوط زیر را اضافه‌کنید:

<service
android:name="co.ronash.pushe.fcm.FcmService"
tools:node="remove" />
<!-- Add your own service name instead of this , if you are not using firebase -->
<service
android:name="com.reactlibrary.RNPusheNotificationService"
tools:node="remove" />

دقت‌کنید که یکی از سرویس‌ها پوشه است و سرویس دیگری مربوط به پلاگین دیگری‌است که از فایربیس استفاده می‌کند (در اینجا پلاگین فایربیس ReactNative).

پس از پاک‌کردن سرویس‌های در معرض مشکل، سرویسی ایجاد کنید که از سرویس دیگر (در اینجا سرویس فایربیس ReactNative) ارث‌بری می‌کند؛ مثلا سرویس FirebaseMessagingService برای فایربیس. پس از ساختن سرویس کد سرویس را بصورت زیر تغییر دهید:

بایستی در آدرس android/src/main/java/ به داخل فولدر پکیج خودتان بروید و در آنجا یک فایل جاوا ایجاد کنید. توصیه می‌شود از Android studio برای این کار استفاده کنید.

public class MyFCMService extends FirebaseMessagingService {
@Override
public void onNewToken(String s) {
co.ronash.pushe.Pushe.getFcmHandler(this).onNewToken(s);
super.onNewToken(s);
}
@Override
public void onDeletedMessages() {
co.ronash.pushe.Pushe.getFcmHandler(this).onDeletedMessages();
super.onDeletedMessages();
}
@Override
public void onSendError(String s, Exception e) {
co.ronash.pushe.Pushe.getFcmHandler(this).onSendError(s, e);
super.onSendError(s, e);
}
@Override
public void onMessageSent(String s) {
co.ronash.pushe.Pushe.getFcmHandler(this).onMessageSent(s);
super.onMessageSent(s);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (!co.ronash.pushe.Pushe
.getFcmHandler(this)
.onMessageReceived(remoteMessage)) {
// It is for fire base, otherwise the condition will handle the message for Pushe
super.onMessageReceived(remoteMessage);
}
}
}

و در آخر سرویس خود را به مانیفست اضافه نمایید:

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