ارسال پوش نوتیفیکیشن در اندروید – راهنمای گام به گام ساده


در این مقاله نحوه ارسال پوش نوتیفیکیشن در اندروید با استفاده از سرویس پیامرسان ابری فایربیس (Firebase Cloud Messaging) شرح داده شده است.
پوش نوتیفیکیشن Push Notification چیست؟
پوش نوتیفیکیشن (Push Notification) یا همان «اعلان سریع» یا «اعلان لحظهای» پیامی است که در دستگاه کاربر ظاهر میشود. کاربر میتواند این اعلانها یا همان توتیفیکیشنها را بدون نیاز به باز بودن و در حال اجرا بودن اپلیکیشن مربوطه روی دستگاه خود ببیند. استفاده از پوش نوتیفیکیشن در اندروید و سایر سیستمهای عامل مثل iOS برای حفظ کاربران یک اپلیکیشن (محصول تجاری)، امری بسیار مهم (در دیجیتال مارکتینگ) به حساب میآید.

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

با کلیک کردن روی دکمهای که در تصویر فوق مشاهده میشود (یعنی در صورت وقوع رخداد OnClick):
- پوش نوتیفیکشن حاوی پیام نوشته شده به کاربر ارسال خواهد شد:

چه فناوری هایی در پروژه نمونه ارسال پوش نوتیفیکیشن در اندروید به کار گرفته شده است؟
در ادامه، فناوریهای مورد استفاده در این پروژه فهرست شدهاند:
- سرویس پیامرسان ابری فایربیس (Firebase Cloud Messaging): یک راهکار پیامرسانی با پشتیبانی چندپلتفرمی است که امکان ارسال پیام را بدون هزینه فراهم میکند.
- زبان کاتلین (Kotlin) برای برنامه نویسی اندروید
- فریمورک NodeJS برای پیادهسازی کارکرهای بکاند (back End | سمت سرور)
علاوه بر فایربیس، سرویسهای پوش نوتیفیکیشن دیگری هم وجود دارند که میتوان با مطالعه مقاله زیر با آنها بیشتر آشنا شد:
- مقاله مرتبط: بهترین سرویسهای پوش نوتیفیکیشن — فهرست کاربردی
چه گام هایی در پروژه نمونه ارسال پوش نوتیفیکیشن در اندروید طی میشوند؟
گامهایی که برای پیادهسازی پروژه نمونه ارسال پوش نوتیفیکیشن در اندروید باید طی شوند در ادامه فهرست شدهاند:
- راهاندازی اندروید استودیو
- ایجاد پروژه فایربیس
- اضافه کردن متعلقات (Dependencyها)
- راهاندازی Hilt و Retrofit
- راهاندازی پیامرسان ابری فایربیس
- ساخت نمای اپلیکیشن (View)
- ایجاد مخزن (ریپازیتوری) ViewModel و View
- ساخت بکاند مورد نیاز با استفاده از NodeJS

اکنون در ادامه هر یک از گامهای مورد نیاز برای پیادهسازی پروژه نمونه ارسال پوش نوتیفیکیشن در اندروید به صورت تک به تک شرح داده شدهاند.
ارسال پوش نوتیفیکیشن در اندروید استودیو
برای راهاندازی و آمادهسازی اندروید استودیو جهت اجرای پروژه ارسال پوش نوتیفیکیشن در اندروید ابتدا باید پروژه جدیدی را در اندروید استودیو ایجاد کرد.
مراحل ایجاد پروژه جدید در اندروید استودیو برای ارسال پوش نوتیفیکیشن در اندروید
جهت ایجاد پروژه جدید در اندروید استودیو برای ارسال پوش نوتیفیکیشن در اندروید باید گامهای زیر را طی کرد:
- ابتدا باید اندروید استودیو را دانلود و آن را نصب کرد.
- سپس باید با استفاده از گزینه New پروژه جدیدی را ایجاد کرد و در این فرایند لازم است گزینه Empty Activity انتخاب شود.
- باید نامی را برای پروژه خود انتخاب کرد که این نام میتواند هر اسم دلخواهی باشد. مثلاً میتوان نام پروژه را «Firebase Notification Android » گذاشت.
- در انتها نیز باید گزینه Finish را کلیک کرد.
ساختاربندی پروژه ارسال پوش نوتیفیکیشن در اندروید
گام بعدی در راهاندازی اندروید استودیو برای ارسال پوش نوتیفیکیشن در اندروید، تعیین ساختار پروژه است. در اینجا از الگوی معماری MVVM استفاده شده است:
- باید ۷ بسته جدید (new packages ) با نامهای زیر ایجاد شوند:
- di
- firebase
- helper
- model
- view
- viewmodel
- network
- سپس باید MainActivity را به بسته یا پکیجview انتقال داد.
ایجاد پروژه فایربیس برای ارسال پوش نوتیفیکیشن در اندروید
برای ایجاد پروژه فایربیس مورد نیاز در پروژه نمونه ارسال پوش نوتیفیکیشن در اندروید، باید گامهای زیر را طی کرد:
- ابتدا باید به آدرس https://console.firebase.google.com/ مراجعه شود.
- سپس باید وارد حساب کاربری خود شده و روی گزینه Add Project کلیک کرد.
- اکنون نام پروژه باید وارد شود (هر نام دلخواهی را میتوان انتخاب کرد).
- باید گزینهContinue را کلیک کرد.
- حالا باید در صفحه Google Analytics گزینهContinue را زد.
- در این مرحله باید یک حساب کاربری گوگل را انتخاب کرد. لازم است گزینه Default Account For Firebaseانتخاب شود.
- سپس نیاز است روی گزینهCreate Project کلیک شود.
- در این مرحله، پیامی به صورت «Your new project is ready » مشاهده خواهد شد.
- در نهایت هم بایدContinue را کلیک کرد.
به این ترتیب، پروژه فایربیس مورد نیاز برای ارسال پوش نوتیفیکیشن در اندروید ایجاد و آماده شده است. حالا باید این پروژه فایربیس را با اپلیکیشن اندروید خود پیوند داد.
اتصال فایربیس به اندروید
- برای اتصال فایربیس به اندروید، باید در صفحه خانه کنسول خود، روی لوگوی اندروید کلیک کرد:

- برای پر کردن قسمت نام بسته اندروید (Android Package Name) باید به فایل Manifest.xml مراجعه شود، package را کپی و آن را آنجا الصاق (paste) کرد. این نام چیزی شبیه به عبارت زیر است:
- com.name.firebasenotificationandroid
- در قسمت App Nickname که به معنی نام مستعار اپلیکیشن است هم میتوان هر چیزی را نوشت و تفاوتی در این خصوص وجود ندارد.
- برای قسمت «Debug Signing Certificate» هم باید مطابق تصویر زیر به نشانی gradle — Tasks — Android — signingReport رفت. سپس لازم است کلید SHA-1 را کپی و آن را الصاق کرد.

- در گام بعدی باید روی گزینهRegister Appکلیک کرد.
- حالا بایدgoogle-services.json را دانلود و آن را در پوشه project در شاخه اپلیکیشنها الصاق (Paste) کرد.

- در این مرحله باید تمام متعلقات فایربیس را به پروژه اندروید اضافه کرد.
- در نهایت با همگامسازی (Sync کردن پروژه) کار به اتمام میرسد.
فیلم های آموزش برنامه نویسی اندروید

در وب سایت فرادرس دورهها و فیلمهای آموزشی بر اساس موضوع دستهبندی شدهاند و برای سهولت دسترسی در قالب مجموعههای آموزشی در دسترس علاقهمندان قرار دارند. یکی از این مجموعههای آموزشی مربوط به دورهها و فیلمهای آموزش اندروید است. در مجموعه آموزش برنامه نویسی اندروید، دورههای آموزشی در سطوح مختلف از مقدماتی، تکمیلی تا پیشرفته موجود هستند.
همچنین بسیاری از دورههای آموزشی دیگر هم برای کاربردها و شاخههای جزئیتر اندروید، مثل ارتباط با دیتابیس سمت سرور در اندروید و بسیاری از دورههای آموزشی دیگر در این مجموعه ارائه شدهاند. دورههای پروژهمحور بسیاری هم موجودند که برای یادگیری بیشتر میتوان از آنها استفاده کرد. از جمله دورههای پروژهمحور اندروید میتوان به آموزش ساخت اپلیکیشن کتاب در مجموعه آموزش اندروید اشاره کرد. در تصویر فوق تنها برخی از دورههای این مجموعه قابل مشاهده هستند.
- برای مشاهده همه فیلم های آموزش اندروید + اینجا کلیک کنید.
اضافه کرن متعلقات مورد نیاز به پروژه ارسال پوش نوتیفیکیشن در اندروید
در این اپلیکیشن و پروژه نمونه از زیرروالها (Coroutineها)، Retrofit ،Hilt ،Cloud Messaging و سایر موارد استفاده میشود. بنابراین برای اضافه کردن این متعلقات به پروژه ارسال پوش نوتیفیکیشن در اندروید باید گامهایی را طی کرد که در ادامه شرح داده شدهاند. اما پیش از آن بهتر است هر یک از متعلقات مورد استفاده برای ارسال پوش نوتیفیکیشن در اندروید بهطور مختصر معرفی شوند و لازم است توضیحاتی پیرامون چیستی هر یک از آنها ارائه شود.
Coroutine در اندروید چیست؟
اصطلاح Coroutine در علوم کامپیوتر به معنی دستورالعملهای اتصال مجموعهای از ورودیها به مجموعهای از خروجیها است. Coroutine در اندروید و کاتلین یک الگوی طراحی همزمانی است که میتوان از آن در اندروید برای سادهسازی کدهایی استفاده کرد که بهطور ناهمزمان (آسنکرون) اجرا میشوند. Coroutineها در نسخه ۱.۳ به کاتلین اضافه شدهاند و مبتنی بر مفاهیم جاافتاده در سایر زبانهای برنامه نویسی هستند.
- مقاله مرتبط برای مطالعه بیشتر: Coroutine در کاتلین — راهنمای مقدماتی

Firebase Cloud Messaging یا FCM چیست ؟
سرویس پیامرسانی ابری فایربیس (Firebase Cloud Messaging | FCM) اتصالی قابل اتکا و بهینه از لحاظ مصرف انرژی میان سرور و دستگاههایی است که امکان ارسال و دریافت بدون هزینه پیامها و نوتیفیکیشنها را در سیستم عاملهای iOS، اندروید و محیط وب فراهم میکند.
Hilt چیست ؟
Hilt یک کتابخانه تزریق وابستگی (Dependancy Injection) برای اندروید به حساب میآید که کدنویسی تکراری مربوط به انجام تزریق وابستگی به صورت دستی را در پروژه کاهش میدهد. در انجام تزریق وابستگی به صورت دستی لازم است هر یک از کلاسها و متعلقات مربوط به آنها توسط برنامه نویس بهطور جداگانه پیادهسازی شوند و باید از Containerها برای استفاده مجدد و مدیریت وابستگیها استفاده کرد.
Hilt روشی استاندارد را برای استفاده از تزریق وابستگی یا به اختصار DI در اپلیکیشن فراهم میسازد. این کار به وسیله Hilt اینگونه انجام میشود که Containerهایی برای هر یک از کلاسهای اندروید در پروژه فراهم میشوند و با استفاده از Hilt چرخه حیات این کانتینرها به صورت خودکار مدیریت خواهد شد.

Hilt مبتنی بر کتابخانه تزریق وابستگی محبوب Dagger ساخته شده است؛ دلیلش بهرهمندی از مزایایی است که Dagger فراهم میکند. از جمله برخی از این مزایای Dagger میتوان به صحت زمان کامپایل، بهبود عملکرد زمان اجرا، مقیاسپذیری و پشتیبانی از اندروید استودیو اشاره کرد.
Retrofit چیست ؟
Retrofit یک کتابخانه HTTP مربوط به شبکه دارای ایمنی نوع است که برای اندوید و جاوا (و کاتلین) بهکار میرود. استفاده از Retrofit باعث شده است که پیکربندیهای مربوط به شبکه در اپلیکیشنهای اندروید بسیار آسانتر انجام شوند. Retrofit قابلیتهای بسیار زیادی دارد که از جمله آنها میتوان به امکان اضافه کردن آسان موارد زیر اشاره کرد:
- سرآیندهای سفارشی و نوعهای درخواست (Request Types)
- آپلود فایلها
- Mocking Responseها
- سایر موارد
از طریق سهولت انجام موارد فوق میتوان کدهای تکراری را کاهش داد و با سادگی بیشتری از وب سرویسها استفاده کرد. اکنون در ادامه مراحل اضافه کرن متعلقات و وابستگیهای مورد نیاز به پروژه ارسال پوش نوتیفیکیشن در اندروید شرح داده شدهاند.
مراحل اضافه کرن وابستگی های مورد نیاز به پروژه ارسال پوش نوتیفیکیشن در اندروید
- ابتدا باید فایلbuild.gradle(app) را باز و کدهای زیر را به آن اضافه کرد:
1apply plugin: 'com.android.application'
2apply plugin: 'kotlin-android'
3apply plugin: 'kotlin-android-extensions'
4apply plugin: 'com.google.gms.google-services'
5apply plugin: 'kotlin-kapt'
6apply plugin: 'dagger.hilt.android.plugin'
7
8android {
9 compileSdkVersion 30
10 buildToolsVersion "29.0.3"
11
12 defaultConfig {
13 applicationId "com.ibrajix.firebasenotificationandroid"
14 minSdkVersion 23
15 targetSdkVersion 30
16 versionCode 1
17 versionName "1.0"
18
19 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
20 }
21
22 buildTypes {
23 release {
24 minifyEnabled false
25 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
26 }
27 }
28
29 buildFeatures {
30 viewBinding true
31 dataBinding true
32 }
33
34 compileOptions {
35 sourceCompatibility JavaVersion.VERSION_1_8
36 targetCompatibility JavaVersion.VERSION_1_8
37 }
38
39 kotlinOptions {
40 jvmTarget = JavaVersion.VERSION_1_8.toString()
41 freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
42 }
43
44 tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
45 kotlinOptions {
46 jvmTarget = "1.8"
47 }
48 }
49
50}
51
52dependencies {
53 implementation fileTree(dir: "libs", include: ["*.jar"])
54 implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
55 implementation 'androidx.core:core-ktx:1.3.2'
56 implementation 'androidx.appcompat:appcompat:1.2.0'
57 implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
58 testImplementation 'junit:junit:4.13'
59 androidTestImplementation 'androidx.test.ext:junit:1.1.2'
60 androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
61
62 //firebase dependencies
63 // Import the Firebase BoM
64 implementation platform('com.google.firebase:firebase-bom:26.2.0')
65
66 // Add the dependency for the Firebase SDK for Google Analytics
67 // When using the BoM, don't specify versions in Firebase dependencies
68 implementation 'com.google.firebase:firebase-analytics-ktx'
69
70 // Add the dependencies for any other desired Firebase products
71 implementation 'com.google.firebase:firebase-messaging'
72 implementation 'com.google.firebase:firebase-analytics'
73
74 //coroutines
75 def coroutines_version = "1.3.9"
76
77 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
78 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
79 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$coroutines_version"
80
81 //dagger hilt
82 implementation "com.google.dagger:hilt-android:2.28-alpha"
83 kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
84
85 // hilt viewModel extension
86 def hilt_jetpack_version = "1.0.0-alpha01"
87 //noinspection GradleDependency
88 implementation "androidx.hilt:hilt-lifecycle-viewmodel:$hilt_jetpack_version"
89 kapt "androidx.hilt:hilt-compiler:$hilt_jetpack_version"
90
91 //retrofit
92 def retrofit_version = "2.9.0"
93 implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
94 implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
95 implementation "com.squareup.okhttp3:logging-interceptor:4.9.0"
96 implementation "com.squareup.retrofit2:converter-scalars:$retrofit_version"
97
98 //lifeCycle
99 def lifecycle_version = "2.2.0"
100 //viewModel
101 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
102
103 //liveData
104 implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
105
106 //by viewmodels
107 implementation "androidx.fragment:fragment-ktx:1.2.5"
108
109}
- سپس باید وارد build.gradle(project)شد و مسیر کلاس Hilt را به آن اضافه کرد:
......... dependencies { ........ //firebase classpath 'com.google.gms:google-services:4.3.4' //hilt classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha' } ............
تنظیمات مورد نیاز برای HILT
جهت انجام تنظیمات مورد نیاز برای HILT باید موارد زیر را انجام داد:
- ابتدا باید دو کلاس جدید در بسته di ایجاد شود. بهتر است نام آنها را — AppModule و MyApplication انتخاب کرد.
- کلاس AppModule برای اجرای تزریق به نوع دادههایی مثل واسطها و کلاسهایی از کتابخانههای خارجی استفاده میشود که مثلاً دارای Retrofit نیستند.
1@Module
2@InstallIn(ApplicationComponent::class)
3class AppModule {
4
5 //retrofit
6 @Provides
7 fun providesBaseUrl() = EndPoints.BASE_URL
8
9 @Provides
10 fun providesGson(): Gson = GsonBuilder().setLenient().create()
11
12 @Provides
13 @Singleton
14 fun provideRetrofit(gson: Gson) : Retrofit = Retrofit.Builder()
15 .baseUrl(EndPoints.BASE_URL)
16 .client(
17 OkHttpClient.Builder().also { client ->
18 if (BuildConfig.DEBUG){
19 val logging = HttpLoggingInterceptor()
20 logging.setLevel(HttpLoggingInterceptor.Level.BODY)
21 client.addInterceptor(logging)
22 client.connectTimeout(120, TimeUnit.SECONDS)
23 client.readTimeout(120, TimeUnit.SECONDS)
24 client.protocols(Collections.singletonList(Protocol.HTTP_1_1))
25 }
26 }.build()
27 )
28 .addConverterFactory(ScalarsConverterFactory.create())
29 .addConverterFactory(GsonConverterFactory.create(gson))
30 .build()
31
32 @Provides
33 @Singleton
34 fun provideApiService(retrofit: Retrofit): ApiService = retrofit.create(ApiService::class.java)
35
36 @Provides
37 @Singleton
38 fun provideApiDataSource(apiService: ApiService) = ApiDataSource(apiService)
39
40
41}
- کلاس MyApplication کلاس Application را بسط میدهد. دستور زیر تمام کدهای مورد نیاز در خصوص hilt را تولید خواهد کرد و به عنوان یک نگهدارنده متعلقات (ظرف وابستگی) عمل میکند:
//Make sure you add this @HiltAndroidApp class MyApplication: Application() { }
- در نهایت، باید به فایل Manifest.xml رفت و در برچسب application کد «android:name=”.di.MyApplication” » را اضافه کرد.
تنظیمات مورد نیاز برای RETROFIT
برای این مرحله باید در بسته helper ، کلاسی را به نام EndPoints ایجاد کرد.
کلاس EndPoints چیست؟
EndPoints کلاسی است که نشانی URL پایه و نقطه پایانی تمام فراخوانیهای API در آن قرار گرفتهاند. کدهای مربوط به این کلاس در ادامه مشاهده میشوند:
1class EndPoints {
2
3 companion object {
4
5 //BASE
6 const val BASE_URL = "https://put-your-base-url-here/"
7
8 //SAVE_TOKEN
9 const val SAVE_TOKEN = "save"
10
11 }
12
13}
- در پکیج model ، باید کلاسی با نام AuthResponse ایجاد شود.
- AuthResponse کلاسی است که پاسخ دریافتی از سرور را مدلسازی میکند تا بتوان عملیات مناسب را انجام داد:
1data class AuthResponse(
2 val message: String,
3 val status: String
4)
- در قسمت پکیج network ، باید یک interface را به نام ApiService به همراه ۲ کلاس جدید ایجاد کرد و در اینجا نام کلاسها هم ApiDataSource و BaseDataSource انتخاب شدهاند.
واسط ApiService چیست؟
ApiService یک interface است که یک Post Request (درخواست ارسال) را برای ذخیرهسازی نام یک کاربر و همچنین ذخیره توکن نوتیفیکیشن به سرور پروژه صادر میکند.
1
2@JvmSuppressWildcards
3interface ApiService {
4
5 @FormUrlEncoded
6 @POST(EndPoints.SAVE_TOKEN)
7 suspend fun sendNotification(
8 @Field("message") name: String,
9 @Field("token") token: String)
10 : Response<AuthResponse>
11
12}
کلاس ApiDataSource چیست؟
کلاسی است که ApiService را در معرض استفاده قرار میدهد یا به اصطلاح آن را Expose میکند تا استفاده از ApiService در مخزن پروژه (Repository) وجود داشته باشد.
1class ApiDataSource @Inject constructor(private val apiService: ApiService) {
2
3 suspend fun sendNotification(message: String, token: String) = apiService.sendNotification(message, token)
4
5}
به این ترتیب کدنویسی و تنظیمات لازم برای پیکربندی Retrofit و Hilt در این مقطع به پایان میرسد.
راه اندازی سرویس پیام رسان ابری فایربیس برای ارسال پوش نوتیفیکیشن در اندروید
جهت راه اندازی پیام رسانی ابری فایربیس برای ارسال پوش نوتیفیکیشن در اندروید، باید مراحل زیر را طی کرد:
- در داخل قسمت بسته firebase باید یک کلاس جدید به نام MyFirebaseMessagingService ایجاد کرد. این کلاس از کلاس FirebaseMessagingService بسط داده شده است و کنترل پیامها، دریافت نوتیفیکیشنها در پس زمینه، دریافت پایهبار دادهها و ارسال پیامهای جریانی به وسیله آن انجام خواهند شد.
1class MyFirebaseMessagingService : FirebaseMessagingService() {
2
3 companion object {
4 private const val TAG = "MyFirebaseMsgService"
5 }
6
7 //this is called when a message is received
8 override fun onMessageReceived(remoteMessage: RemoteMessage) {
9
10 //check messages
11 Log.d(TAG, "From: ${remoteMessage.from}")
12
13 // Check if message contains a data payload, you can get the payload here and add as an intent to your activity
14 remoteMessage.data.let {
15 Log.d(TAG, "Message data payload: " + remoteMessage.data)
16 //get the data
17 }
18
19 // Check if message contains a notification payload, send notification
20 remoteMessage.notification?.let {
21 Log.d(TAG, "Message Notification Body: ${it.body}")
22 sendNotification(it.body!!)
23 }
24
25 }
26
27 override fun onNewToken(token: String) {
28
29 Log.d("rfst", "Refreshed token: $token")
30
31 // If you want to send messages to this application instance or
32 // manage this apps subscriptions on the server side, send the
33 // FCM registration token to your app server.
34 sendRegistrationToServer(token)
35
36 }
37
38 private fun sendRegistrationToServer(token: String?) {
39
40 //you can send the updated value of the token to your server here
41
42 }
43
44 private fun sendNotification(messageBody: String, id: String, status: String, date: String, description: String, price: String, total: String, quantity: String, itemName: String, actionActivity: String){
45 val notificationManager = ContextCompat.getSystemService(applicationContext, NotificationManager::class.java) as NotificationManager
46 notificationManager.sendNotification(messageBody, applicationContext, id, status, date, description, price, total, quantity, itemName, actionActivity)
47 }
48
49
50}
- در قسمت helper باید شیئی را از نوع Utility ایجاد کرد.
کلاس Utility چیست؟
Utility یک کلاس (تاسیساتی | تسهیلاتی) از نوع utilityبه حساب میآید. این کلاس دارای قابلیتی است که موارد مربوط به کنترل نوتیفیکیشن در آن ساخته میشوند. مثلاً عملی که با ضربه زدن کاربر روی نوتیفیکیشن باید انجام شود یا شخصیسازی ویژگیهای ظاهری نوتیفیکیشن هم با استفاده از این کلاس انجام میشود.
1object Utility {
2
3 // Notification ID.
4 private const val NOTIFICATION_ID = 0
5
6 fun NotificationManager.sendNotification(messageBody: String, applicationContext: Context) {
7
8
9 // TODO: Step 1.11 create intent
10 val contentIntent = Intent(applicationContext, MainActivity::class.java)
11
12 // TODO: Step 1.12 create PendingIntent
13 val contentPendingIntent = PendingIntent.getActivity(
14 applicationContext,
15 NOTIFICATION_ID,
16 contentIntent,
17 PendingIntent.FLAG_UPDATE_CURRENT
18 )
19
20 // TODO: You can add style here
21
22
23 // TODO: Step 1.2 get an instance of NotificationCompat.Builder
24
25 // Build the notification
26 val builder = NotificationCompat.Builder(
27 applicationContext,
28 // TODO: Step 1.8 use a notification channel
29 applicationContext.getString(R.string.app_notification_channel_id)
30 )
31 // TODO: Step 1.3 set title, text and icon to builder
32 .setSmallIcon(R.drawable.ic_bell)
33 .setContentTitle(applicationContext.getString(R.string.notification_title))
34 .setContentText(messageBody)
35 // TODO: Step 1.13 set content intent
36 .setContentIntent(contentPendingIntent)
37
38 // TODO: Step 2.5 set priority
39 .setPriority(NotificationCompat.PRIORITY_HIGH)
40 .setAutoCancel(true)
41
42 // TODO Step 1.4 call notify
43 // Deliver the notification
44 notify(NOTIFICATION_ID, builder.build())
45 }
46
47// TODO: Step 1.14 Cancel all notifications
48 /**
49 * Cancels all notifications.
50 *
51 */
52 fun NotificationManager.cancelNotifications() {
53 cancelAll()
54 }
55
56}
- در این مرحله باید فایل Manifest.xlm را باز و قبل از برچسب پایانی application، کدهای زیر را وارد کرد:
1<service
2 android:name=".firebase.MyFirebaseMessagingService"
3 android:exported="false">
4 <intent-filter>
5 <action android:name="com.google.firebase.MESSAGING_EVENT"/>
6 </intent-filter>
7</service>
8...
9</application>
- حالا باید یک آیکون پیشفرض نوتیفیکیشن، رنگ پیشفرض و کانال پیشفرض را اضافه کرد. بنابراین، کدهای زیر باید به فایل manifest.xml و در داخل تگ application اضافه شوند:
1<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
2 android:resource="@drawable/ic_bell" />
3
4<meta-data
5 android:name="com.google.firebase.messaging.default_notification_color"
6 android:resource="@color/colorAccent" />
7<meta-data
8android:name="com.google.firebase.messaging.default_notification_channel_id"
9android:value="@string/default_notification_channel_id" />
به این ترتیب، تمام موارد مربوط به پیکربندی Cloud Messaging انجام شده است. اکنون نوبت به ساخت نما و قالب اپلیکیشن میرسد.
ساخت نما و قالب اپلیکیشن ارسال پوش نوتیفیکیشن در اندورید
برای ساخت نما و قالب اپلیکیشن ارسال پوش نوتیفیکیشن در اندورید باید فایل main_activity.xml را باز کرد و کدهای زیر را در آن نوشت:
1<?xml version="1.0" encoding="utf-8"?>
2<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 android:fillViewport="true"
8 tools:context=".view.MainActivity">
9
10
11 <LinearLayout
12 android:layout_width="match_parent"
13 android:layout_height="match_parent"
14 android:orientation="vertical"
15 android:gravity="center"
16 android:layout_marginTop="0dp">
17
18 <TextView
19 android:layout_width="wrap_content"
20 android:layout_height="wrap_content"
21 android:text="@string/send"
22 android:textSize="20sp"
23 android:textStyle="bold"
24 android:textColor="@color/black"
25 android:layout_gravity="center"/>
26
27 <TextView
28 android:layout_width="wrap_content"
29 android:layout_height="wrap_content"
30 android:text="@string/notification"
31 android:textSize="20sp"
32 android:textStyle="bold"
33 android:textColor="@color/black"
34 android:layout_gravity="center"/>
35
36 <ImageView
37 android:layout_width="250dp"
38 android:layout_height="250dp"
39 android:src="@drawable/ic_mello"
40 android:layout_marginTop="40dp" />
41
42 <EditText
43 android:layout_width="match_parent"
44 android:layout_height="50dp"
45 android:id="@+id/etMessage"
46 android:layout_marginStart="50dp"
47 android:layout_marginTop="40dp"
48 android:layout_marginEnd="50dp"
49 android:background="@drawable/et_input_with_border"
50 android:hint="@string/name"
51 android:importantForAutofill="no"
52 android:paddingStart="20dp"
53 android:paddingEnd="20dp"
54 android:textSize="16sp" />
55
56 <ProgressBar
57 android:layout_width="wrap_content"
58 android:layout_height="wrap_content"
59 android:id="@+id/loading"
60 android:layout_marginTop="10dp"
61 android:visibility="gone"/>
62
63 <Button
64 android:id="@+id/btn_send"
65 android:layout_width="match_parent"
66 android:layout_height="60dp"
67 android:layout_marginStart="50dp"
68 android:layout_marginTop="40dp"
69 android:layout_marginEnd="50dp"
70 android:background="@drawable/btn_border_blue_bg"
71 android:text="@string/send_capital"
72 android:textColor="@color/white"
73 android:textStyle="bold" />
74
75 </LinearLayout>
76
77</ScrollView>
بنابراین نمای ساده و نه چندان وزین این اپلیکیشن هم آماده شده است. حالا باید مخزن مربوطه و مدل نمای مربوطه را ساخت.
راه اندازی مخزن و ViewModel و View برای پروژه ارسال پوش نوتیفیکیشن در اندروید
جهت راه اندازی مخزن ، ViewModel و View برای پروژه ارسال پوش نوتیفیکیشن در اندروید، ابتدا باید پکیج viewmodel را باز کرد و دو کلاس جدید با نامهای MainRepo و MainViewModel ساخت.
کلاس MainRepo چیست ؟
این کلاس به عنوان منبعی از دادهها برای استفاده توسط مدل نما عمل میکند:
1lass MainRepo @Inject constructor(private val apiDataSource: ApiDataSource): BaseDataSource() {
2
3 suspend fun sendNotification(message: String, token: String) = safeApiCall { apiDataSource.sendNotification(message, token) }
4
5}
این کلاس با Repository یا همان مخزن ارتباط برقرار میکند و سپس نتیجه دریافتی از فراخوانی API به عنوان LiveData (با قابلیت آگاهی از چرخه حیات | Lifecycle Aware) بازگردانده میشود و سپس این نتیجه از طریق View ساخته شده (MainActivity) قابل مشاهده خواهد بود.
1class MainViewModel @Inject constructor(private val mainRepo: MainRepo) : ViewModel() {
2
3
4 private val _sendNotification = SingleLiveEvent<Resource<AuthResponse>>()
5
6 val sendNotification : LiveData<Resource<AuthResponse>> get() = _sendNotification
7
8
9 fun doSendNotification(message: String, token: String) =
10 viewModelScope.launch {
11 try {
12 _sendNotification.value = mainRepo.sendNotification(message, token)
13 }
14 catch (exception: Exception){
15
16 }
17 }
18
19
20}
- اکنون باید فایل MainActivity را باز کرد. کاری که این کلاس انجام میدهد به صورت زیر است:
- دریافت نماها (Viewها) از طریق ViewBinding
- مقداردهی اولی نماها
- گوش دادن به رخداد کلیک در دکمه مربوطه
- برقراری ارتباط با viewModel برای ثبت کاربر
- پایش دادههای تبادل شده از جانب viewModel و نمایش پیامهای مناسب
کدهای مربوط به این فایل در ادامه آمده است:
1@AndroidEntryPoint
2class MainActivity : AppCompatActivity() {
3
4 //viewBinding
5 private var _binding: ActivityMainBinding? = null
6 private val binding get() = _binding!!
7 private var buttonSend: Button? = null
8 private var name: EditText? = null
9 private var loadingProgress: ProgressBar? = null
10
11 private val mainViewModel: MainViewModel by viewModels()
12
13 override fun onCreate(savedInstanceState: Bundle?) {
14 super.onCreate(savedInstanceState)
15
16
17 _binding = ActivityMainBinding.inflate(layoutInflater)
18 val root = binding.root
19 setContentView(root)
20
21 initView()
22
23 }
24
25 private fun initView(){
26
27 loadingProgress = binding.loading
28 buttonSend = binding.btnSend
29 name = binding.etName
30
31 //listen to click event
32 buttonSend!!.setOnClickListener {
33
34 //hide button
35 buttonSend!!.visibility = View.GONE
36
37 //show progress bar
38 loadingProgress!!.visibility = View.VISIBLE
39
40 //register user
41 doSendNotification()
42 }
43
44 }
45
46 private fun doSendNotification(){
47
48 //get user notification token provided by firebase
49 FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
50 if (!task.isSuccessful) {
51 Log.w("token_failed", "Fetching FCM registration token failed", task.exception)
52 return@OnCompleteListener
53 }
54
55 // Get new FCM registration token
56 val notificationToken = task.result
57 val messageString = etMessage.text.toString()
58
59 //store the user name
60 mainViewModel.doSendNotification(messageString, notificationToken!!)
61 setupObserver()
62 })
63
64 }
65
66 private fun setupObserver(){
67
68 //observe data obtained
69 mainViewModel.sendNotification.observe(this, Observer {
70
71 when(it.status){
72
73 Resource.Status.SUCCESS ->{
74
75 if(it.data?.status == "success"){
76
77 //stop progress bar
78 loadingProgress!!.visibility = View.GONE
79 buttonSend!!.visibility = View.VISIBLE
80
81 //show toast message
82 Toast.makeText(this, "Notification sent successfully", Toast.LENGTH_LONG).show()
83 }
84
85 else if(it.data?.status == "fail"){
86
87 //stop progress bar
88 loadingProgress!!.visibility = View.GONE
89 buttonSend!!.visibility = View.VISIBLE
90
91 //something went wrong, show error message
92 Toast.makeText(this, it.message, Toast.LENGTH_LONG).show()
93
94 }
95
96
97 }
98 Resource.Status.ERROR -> {
99
100 Toast.makeText(this, it.message, Toast.LENGTH_LONG).show()
101
102 loading!!.visibility = View.GONE
103 buttonSend!!.visibility = View.VISIBLE
104
105 }
106 Resource.Status.LOADING -> {
107
108 loading!!.visibility = View.VISIBLE
109 buttonSend!!.visibility = View.GONE
110
111 }
112 }
113
114 })
115
116 }
117
118
119}
راه اندازی بک اند پروژه تمرینی با استفاده از NodeJs برای ارسال پوش نوتیفیکیشن در اندروید
جهت راه اندازی بکاند پروژه تمرینی با استفاده از NodeJs برای ارسال پوش نوتیفیکیشن در اندروید باید به کنسول فایربیس خود رفت و در آیکون settings گزینه «Project settings» را کلیک کرد.

- حالا باید وارد سربرگ Service Account شد و گزینه Generate new private key را کلیک کرد.
- در این مرحله، تایید و دانلود را باید انجام داد.
- حالا باید پوشهای در کامپیوتر خود ساخت و سپس از طریق خط فرمان در محل ذخیره این پوشه قرار گرفت.
- وارد کردن دستور npm init و پر کردن تمام جزئیات مورد نیاز؛ به این وسیله یک فایل package.json ایجاد خواهد شد.
- وارد کردن دستور npm i firebase-admin در ترمینال برای نصب متعلقات فایربیس
- همچنین اجرای دستورات npm i express و npm i bodyparser
- ایجاد یک فایل پیکربندی (config)
1var admin = require("firebase-admin");
2
3//path to the json you just downloaded
4var serviceAccount = require("./.json");
5
6//init
7admin.initializeApp({
8 credential: admin.credential.cert(serviceAccount),
9})
10
11module.exports.admin = admin
سپس باید فایل index.js را ایجاد و کدهای زیر را در آن وارد کرد:
1import express from 'express'
2import bodyparser from 'body-parser'
3import { admin } from './firebase_config'
4
5const app = express()
6app.use(bodyparser.json())
7
8const port = 3000
9
10
11app.post('/send', (req, res)=>{
12
13 const notification_options = {
14 priority: "high",
15 timeToLive: 60 * 60 * 24
16 };
17
18 const payload = {
19 notification: {
20 title: "This is a Notification",
21 body: req.body.message
22 }
23 };
24
25 const token = req.body.token
26
27 admin.messaging().sendToDevice(token, payload, notification_options)
28 .then( response => {
29
30 //configure your response here
31
32 res.status(200).send("Notification sent successfully")
33
34 })
35 .catch( error => {
36 console.log(error);
37 });
38
39})
40app.listen(port, () =>{
41console.log("listening to port"+port)
42})
به این ترتیب پروژه ارسال پوش نوتیفیکیشن در اندروید اینجا به پایان میرسد و تمام موارد لازم انجام شده است. میتوان از طریق این لینک [+] به تمام فایلهای پروژه دسترسی پیدا کرد.
جمعبندی
یکی از رایجترین سرویسها برای ارسال پوش نوتیفیکیشن در اندروید فایربیس است. در این مقاله نیز برای آموزش ارسال پوش نوتیفیکیشن در اندروید از فایربیس استفاده شده است و در غالب یک پروژه نمونه ساده نحوه ارسال پوش نوتیفیکیشن در اندروید شرح داده شد. همچنین برخی از ابزارهایی که به عنوان وابستگی در این پروژه بهکار رفتهاند بهطور مختصر معرفی شدند. امید است این مقاله مفید واقع شده باشد.
👍👍👍👍👍