نوتیفیکیشن اندروید — اصول مقدماتی
ارسال نوتیفیکیشن به کاربران، تأثیر بسزایی بر نرخ «درگیری کاربر» (user engagement) دارد، اما در صورتی که در این امر زیادهروی کنید، میتواند آزاردهنده نیز باشد. در این مقاله به بررسی مبانی پیادهسازی پوش نوتیفیکیشن اندروید میپردازیم.
شروع
برای آغاز باید ابتدا «فایربیس» (Firebase) را در اپلیکیشن خود راهاندازی کنیم. به این منظور قبل از هر چیز باید یک پروژه در کنسول فایربیس (+) ایجاد کنیم. توجه داشته باشید که در زمان نگارش این مقاله، ایران در فهرست کشورهای تحریم شده از سوی این سرویس قرار دارد و برای دسترسی به آن باید از ابزارهای کمکی مناسبی استفاده کنید.
پس از اجرای این مرحله میتوانیم اپلیکیشن خود را به پروژه اضافه کنیم. به این منظور روی پروژه خود کلیک کرده و سپس روی دکمه + Add app کلیک کرده و در ادامه روی آیکون اندروید بزنید. در نهایت باید برخی اطلاعات مقدماتی در مورد اپلیکیشن خود وارد کنید و فایل پیکربندی google-services.json را که برای اتصال اپلیکیشن به فایربیس ضروری است را دانلود کنید. در این مورد در ادامه بیشتر توضیح خواهیم داد. فعلاً همین کارها در کنسول فایربیس کافی است.
اتصال اپلیکیشن به فایربیس
اینک به بخش جالب ماجرا میرسیم. در پروژه اندروید فایل build.gradle پروژه را باز کنید. اطمینان پیدا کنید که ریپازیتوری maven گوگل را در هر دو بلوک repositories و همچنین بلوک allprojects اضافه کردهاید و ضمناً افزونه Google Services را در وابستگیها به صورت زیر قرار دادهاید:
1buildscript {
2 repositories {
3 google()
4 // ... Your other repo's go here
5 }
6
7 dependencies {
8 // ... Your other dependencies
9 classpath 'com.google.gms:google-services:4.2.0'
10 }
11}
12
13allprojects {
14 // ...
15
16 repositories {
17 google()
18 // ... Your other repo's go here
19 }
20}
در ادامه به فایل build.gradle اپلیکیشن سر میزنیم. همچنین وابستگی Firebase Core را به پروژه اضافه کرده و افزونه Google Services را در انتهای فایل اضافه میکنیم:
1dependencies {
2 // ... Put your other dependencies here
3
4 implementation 'com.google.firebase:firebase-core:16.0.9'
5}
6
7apply plugin: 'com.google.gms.google-services' // Make sure you apply the plugin at the bottom of the file
کار تقریباً به پایان رسیده است. به خاطر دارید که در مرحله قبل فایل پیکربندی google-services.json را از کنسول فایربیس دانلود کردیم. اینک باید این فایل را در دایرکتوری app اضافه کنیم تا کار پیکربندی فایربیس در اپلیکیشن به اتمام برسد.
ارسال پیام
اکنون که اپلیکیشن خود را به پروژه فایربیس اضافه کردیم، آماده هستیم تا از سرویس پیامرسانی ابری خود بهره بگیریم. FCM که اختصاری برای «پیامرسانی ابری فایربیس» (Firebase Cloud Messaging) است، استاندارد جدیدی برای نوتیفیکیشن محسوب میشود، چون گوگل پشتیبانی از GCM را متوقف کرده و آن را منسوخ نموده است. بدین منظور کافی است وابستگی را به فایل build.gradle اپلیکیشن اضافه کنیم:
1implementation 'com.google.firebase:firebase-messaging:18.0.0'
اگر میخواهید روی مدیریت نوتیفیکیشنها در پیشزمینه کنترل بیشتری داشته باشد، دادهها را درون نوتیفیکیشن مدیریت کنید و یا میخواهید دستگاههای منفرد خاص یا گروههای معینی از افراد را هنگام ارسال نوتیفیکیشن هدفگیری کنید، در این صورت به سرویسی نیاز دارید که FirebaseMessagingService را بسط دهد. ما آن را MessagingService.kt مینامیم:
1class MessagingService : FirebaseMessagingService() {
2
3 override fun onNewToken(token: String) {
4 // Sync your token with the backend here (optional)
5 }
6
7 override fun onMessageReceived(remoteMessage: RemoteMessage?) {
8 // Handle the incoming message here
9 }
10}
این دقیقاً همان جایی است که یک پیام ورودی یا احتمالاً رفرش/ایجاد توکن را مدیریت میکنید. به این ترتیب میتوان یک توکن را برای نمونه در فراخوانی onNewToken به بکاند ارسال کرد و روی آن کارهایی انجام داد یا یک نوتیفیکیشن در onMessageReceived ساخت. به یاد بسپارید که نیازی به ساخت یک نوتیفیکیشن برای نمایش دادن وجود ندارد. این موضوع را در ادامه بیشتر توضیح میدهیم.
اکنون که MessagingService خود را ساختهایم، باید آن را در مانیفست نیز ثبت کنیم:
1<!-- Replace <mypackage> with the package of MessagingService -->
2<service
3 android:name="<mypackage>.MessagingService"
4 android:exported="false">
5 <intent-filter>
6 <action android:name="com.google.firebase.MESSAGING_EVENT" />
7 </intent-filter>
8</service>
اینک قادر هستیم نوتیفیکیشن ورودی خود را از طریق سرویس پیامرسانی خودمان مدیریت کنیم.
مشکل عدم فراخوانی onMessageReceived
این مشکل به روش مدیریت نوتیفیکیشنها مربوط میشود و به payload نوتیفیکیشن نیز ارتباط دارد. تابع onMessageReceived به صورت پیشفرض تنها زمانی فراخوانی میشود که اپلیکیشن در پیشزمینه است. این بدان معنی است که وقتی اپلیکیشن در پسزمینه است و یا کلاً باز نشده است، سیستم نوتیفیکیشن را برای ما مدیریت میکند.
اگر میخواهید نوتیفیکیشن را در هر دو حالت مدیریت کنید، دو گزینه وجود دارد. یکی این که پس از کلیک کردن روی نوتیفیکیشن انجام دهید و دیگری آن که آن را مستقیماً زمانی که وارد میشود مدیریت کنید. در ادامه به بررسی payload نوتیفیکیشن میپردازیم:
1{
2 "message":{
3 "token":"...",
4 "notification":{
5 "title":"This is your notification's title",
6 "body":"This is the body text of your notification"
7 },
8 "data" : {
9 "first_name" : "Android",
10 "last_name" : "Roboto"
11 }
12 }
13}
هرزمان که یک title و یک body در نوتیفیکیشن وجود داشته باشد، سیستم آن را در پسزمینه مدیریت میکند. زمانی که data در payload باشد و روی نوتیفیکیشن کلیک کنید میتوانید آن را در سرویس خودتان مدیریت کنید.
اگر در نوتیفیکیشن خود title و body ندارید، نوتیفیکیشن ورودی همواره به سرویس میرسد. این بدان معنی است که شما باید نوتیفیکیشن را خودتان بسازید تا بتوانید آن را نمایش دهید.
کانالهای نوتیفیکیشن چه هستند؟
از اندروید O (سطح API 26) به بعد امکان استفاده از کانالهای نوتیفیکیشن وجود دارد. اگر هیچ چیزی تعریف نشده باشد، همه نوتیفیکیشنها در کانال پیشفرض ارسال میشوند. با این حال میتوان با افزودن قطعه کد زیر به مانیفست یک کانال پیشفرض اختصاصی نیز تعریف کرد:
1<meta-data
2 android:name="com.google.firebase.messaging.default_notification_channel_id"
3 android:value="@string/my_default_notification_channel" />
اگر نوتیفیکیشنها شامل شناسه کانال نباشند، در این کانال پیشفرض سفارشی قرار میگیرند.
همچنین میتوانیم یک گام فراتر گذارده و شروع به تعریف کانالهای خاص خودمان بکنیم. این کاری است که در کلاس Application زیر انجام دادهایم:
1class MyApp : Application() {
2 override fun onCreate() {
3 super.onCreate()
4
5 // Create notification channels
6 initNotificationChannels()
7
8 // ... Do other stuff
9 }
10
11 private fun initNotificationChannels() {
12 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
13 // Build your channel
14 val myChannel = NotificationChannel(
15 MessagingService.MY_CHANNEL_ID,
16 getString(R.string.my_channel_title), // The channel title in the app settings
17 NotificationManager.IMPORTANCE_DEFAULT)
18 .apply {
19 // The description of the channel in the app settings
20 description = getString(R.string.channel_podcasts_description)
21 }
22
23 // Register the channel with the system
24 val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
25 notificationManager.createNotificationChannel(myChannel)
26 }
27 }
28}
به همین سادگی است. اکنون میتوانید نوتیفیکیشنها را از طریق payload نوتیفیکیشن و یا از طریق MessagingService به کانال خاص خود تحویل دهید.
سخن پایانی
امیدواریم از مطالعه این مقاله بهره لازم را برده باشید و با روش مدیریت نوتیفیکیشن در اپلیکیشنها آشنا شده باشید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی اندروید
- گنجینه برنامه نویسی اندروید (Android)
- مجموعه آموزشهای برنامهنویسی
- ۵ گام ضروری برای یادگیری برنامهنویسی اندروید — راهنمای جامع
- نوتیفیکیشنهای اندروید برای توسعهدهندگان — به زبان ساده
==