R Hosseini
R Hosseini
خواندن ۸ دقیقه·۵ سال پیش

نحوه افزودن پوش نوتیفیکیشن فایربیس به پروژه های اندرویدی (کاتلین)


FCM
FCM


یه سری کارها هستن که تقریبا برای تمام پروژه هامون بصورت تکراری انجام میدیم. اما فاصله زمانی بین این پروژه ها میتونه باعث بشه که مراحل انجام اون کارو فراموش کنیم.

به همین خاطر میخوام تو این مقاله چگونگی اضافه کردن پوش نوتیفیکیشن فایربیس به پروژه رو شرح بدم تا هم یه مرجعی باشه برای خودم و هم برای دیگران.


تصور بر اینه که شما پروژتونو ساختین و حالا فقط میخواین FCM رو بهش اضافه کنید.


مرحله اول: تنظیم فایربیس و FCM SDK

1. ابتدا فایربیس را به پروژه اضافه کنید (در این مقاله بصورت کامل شرح دادم)

2. دیپندنسی زیر را به فایل build.gradle اپلیکیشن اضافه کنید:

implementation 'com.google.firebase:firebase-messaging:20.1.5'


مرحله دوم: تغییرات لازم در فایل منیفست

1. افزودن پرمیشن اینترنت

<uses-permission android:name=&quotandroid.permission.INTERNET&quot/>

2. افزودن یک سرویس جدید به منیفست (کد این سرویس در مرحله بعد)

<service android:name=&quot.java.MyFirebaseMessagingService&quot android:exported=&quotfalse&quot> <intent-filter> <action android:name=&quotcom.google.firebase.MESSAGING_EVENT&quot /> </intent-filter> </service>

(کد بالا را در تگ application کپی کنید)


مرحله سوم: ساخت سرویس برای دریافت پیغامهای FCM

یک سرویس با عنوان MyFirebaseMessagingService بسازید و کدهای زیر را در آن کپی کنید:

class MyFirebaseMessagingService : FirebaseMessagingService() { privateval TAG = MyFirebaseMessagingService::class.java.simpleName privateval REQUEST_CODE = 0 override fun onNewToken(s: String) { super.onNewToken(s) Log.d(TAG, &quotFirebase token: $s&quot) FirebaseMessaging.getInstance().subscribeToTopic(&quotall&quot).addOnCompleteListener { Log.d(TAG, &quotThis user subscribe in topic: all&quot) } } override fun Received(remoteMessage: RemoteMessage) { Log.d(TAG, &quotFrom: $remoteMessage.from&quot) sendNotification(remoteMessage.notification, remoteMessage.data) } private fun sendNotification( notification: RemoteMessage.Notification?, data: Map<String, String> ) { val icon = BitmapFactory.decodeResource(Resources.getSystem(), R.mipmap.ic_launcher) val intent = Intent(this, MainActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) val pendingIntent = PendingIntent.getActivity(this, REQUEST_CODE, intent, PendingIntent.FLAG_ONE_SHOT) val channelId = getString(R.string.default_notification_channel_id) var title: String? = &quot&quot var body: String? = &quot&quot if (notification != null) { title = if (notification.title == null) getString(R.string.app_name) else notification.title body = if (notification.body == null) &quot&quot else notification.body } val notificationBuilder = NotificationCompat.Builder(this, channelId) .setContentTitle(title) .setContentText(body) .setAutoCancel(true) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) .setContentIntent(pendingIntent) .setContentInfo(title) .setLargeIcon(icon) .setColor(Color.GREEN) .setLights(Color.RED, 1000, 300) .setDefaults(Notification.DEFAULT_VIBRATE) .setSmallIcon(R.mipmap.ic_launcher) try { val pictureUrl = data[&quotpicture_url&quot] if (pictureUrl != null && &quot&quot != pictureUrl) { val url = URL(pictureUrl) val bigPicture = BitmapFactory.decodeStream(url.openConnection().getInputStream()) notificationBuilder.setStyle( NotificationCompat.BigPictureStyle().bigPicture(bigPicture).setSummaryText(body) ) } } catch (e: IOException) { e.printStackTrace() } val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager // Notification Channel is required for Android O and above if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( channelId, &quotinsta tutorial notif channel&quot, NotificationManager.IMPORTANCE_DEFAULT ) channel.description = &quotchannel description&quot channel.setShowBadge(true) channel.canShowBadge() channel.enableLights(true) channel.lightColor = Color.BLUE channel.enableVibration(true) channel.vibrationPattern = longArrayOf(100, 200, 300, 400, 500) notificationManager.createNotificationChannel(channel) } notificationManager.notify(Random().nextInt(), notificationBuilder.build()) } }

توجه: این کلاس پیغامهای رسیده را در هر دو حالت اپلیکیشن یعنی Foreground و Background هندل میکند. و همچنین همه کاربران را به تاپیکی بنام all اضافه میکند.

در هر قسمت از برنامه که قصد دارید کاربر را به تاپیک خاصی اضافه کنید کافیست کد زیر را با نام تاپیک دلخواه خود کپی کنید:

FirebaseMessaging.getInstance().subscribeToTopic(&quottopic name&quot) .addOnCompleteListener { task -> var msg = getString(R.string.msg_subscribed) if (!task.isSuccessful) { msg = getString(R.string.msg_subscribe_failed) } Log.d(TAG, msg) Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() }


مرحله بعد تست ارسال نوتیفیکیشن و همینطور هندل کردن دیتای دریافتیه که سعی میکنم تو مقاله دیگه ای بصورت کامل شرح بدم.


فایربیسنوتیفیکیشنکاتلینkotlin
android developer
شاید از این پست‌ها خوشتان بیاید