یه سری کارها هستن که تقریبا برای تمام پروژه هامون بصورت تکراری انجام میدیم. اما فاصله زمانی بین این پروژه ها میتونه باعث بشه که مراحل انجام اون کارو فراموش کنیم.
به همین خاطر میخوام تو این مقاله چگونگی اضافه کردن پوش نوتیفیکیشن فایربیس به پروژه رو شرح بدم تا هم یه مرجعی باشه برای خودم و هم برای دیگران.
تصور بر اینه که شما پروژتونو ساختین و حالا فقط میخواین FCM رو بهش اضافه کنید.
مرحله اول: تنظیم فایربیس و FCM SDK
1. ابتدا فایربیس را به پروژه اضافه کنید (در این مقاله بصورت کامل شرح دادم)
2. دیپندنسی زیر را به فایل build.gradle اپلیکیشن اضافه کنید:
implementation 'com.google.firebase:firebase-messaging:20.1.5'
مرحله دوم: تغییرات لازم در فایل منیفست
1. افزودن پرمیشن اینترنت
<uses-permission android:name="android.permission.INTERNET"/>
2. افزودن یک سرویس جدید به منیفست (کد این سرویس در مرحله بعد)
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </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, "Firebase token: $s") FirebaseMessaging.getInstance().subscribeToTopic("all").addOnCompleteListener { Log.d(TAG, "This user subscribe in topic: all") } } override fun Received(remoteMessage: RemoteMessage) { Log.d(TAG, "From: $remoteMessage.from") 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? = "" var body: String? = "" if (notification != null) { title = if (notification.title == null) getString(R.string.app_name) else notification.title body = if (notification.body == null) "" 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["picture_url"] if (pictureUrl != null && "" != 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, "insta tutorial notif channel", NotificationManager.IMPORTANCE_DEFAULT ) channel.description = "channel description" 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("topic name") .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() }
مرحله بعد تست ارسال نوتیفیکیشن و همینطور هندل کردن دیتای دریافتیه که سعی میکنم تو مقاله دیگه ای بصورت کامل شرح بدم.