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

۱۹۱۴ بازدید
آخرین به‌روزرسانی: ۲۱ دی ۱۴۰۱
زمان مطالعه: ۱۴ دقیقه
ارسال پوش نوتیفیکیشن در اندروید — راهنمای گام به گام ساده

در این مقاله نحوه ارسال پوش نوتیفیکیشن در اندروید با استفاده از سرویس پیام‌رسان ابری فایربیس (Firebase Cloud Messaging) شرح داده شده است.

فهرست مطالب این نوشته

پوش نوتیفیکیشن Push Notification چیست؟

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

پوش نوتیفیکیشن چیست

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

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

ساخت اپلیکیشن ارسال پوش نوتیفیکیشن در اندروید

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

  • پوش نوتیفیکشن حاوی پیام نوشته شده به کاربر ارسال خواهد شد:

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

در ادامه، فناوری‌های مورد استفاده در این پروژه فهرست شده‌اند:

  1. سرویس پیام‌رسان ابری فایربیس (Firebase Cloud Messaging): یک راهکار پیام‌رسانی با پشتیبانی چندپلتفرمی است که امکان ارسال پیام را بدون هزینه فراهم می‌کند.
  2. زبان کاتلین (Kotlin) برای برنامه نویسی اندروید
  3. فریم‌ورک NodeJS برای پیاده‌سازی کارکرهای بک‌اند (back End | سمت سرور)

علاوه بر فایربیس، سرویس‌های پوش نوتیفیکیشن دیگری هم وجود دارند که می‌توان با مطالعه مقاله زیر با آن‌ها بیشتر آشنا شد:

چه گام هایی در پروژه نمونه ارسال پوش نوتیفیکیشن در اندروید طی می‌شوند؟

گام‌هایی که برای پیاده‌سازی پروژه نمونه ارسال پوش نوتیفیکیشن در اندروید باید طی شوند در ادامه فهرست شده‌اند:

  • راه‌اندازی اندروید استودیو
  • ایجاد پروژه فایربیس
  • اضافه کردن متعلقات (Dependencyها)
  • راه‌اندازی Hilt و Retrofit
  • راه‌اندازی پیام‌رسان ابری فایربیس
  • ساخت نمای اپلیکیشن (View)
  • ایجاد مخزن (ریپازیتوری) ViewModel و View
  • ساخت بک‌اند مورد نیاز با استفاده از NodeJS
پوش نوتیفیکیشن

اکنون در ادامه هر یک از گام‌های مورد نیاز برای پیاده‌سازی پروژه نمونه ارسال پوش نوتیفیکیشن در اندروید به صورت تک به تک شرح داده شده‌اند.

ارسال پوش نوتیفیکیشن در اندروید استودیو

برای راه‌اندازی و آماده‌سازی اندروید استودیو جهت اجرای پروژه ارسال پوش نوتیفیکیشن در اندروید ابتدا باید پروژه جدیدی را در اندروید استودیو ایجاد کرد.

مراحل ایجاد پروژه جدید در اندروید استودیو برای ارسال پوش نوتیفیکیشن در اندروید

جهت ایجاد پروژه جدید در اندروید استودیو برای ارسال پوش نوتیفیکیشن در اندروید باید گام‌های زیر را طی کرد:

  1. ابتدا باید اندروید استودیو را دانلود و آن را نصب کرد.
  2. سپس باید با استفاده از گزینه New پروژه جدیدی را ایجاد کرد و در این فرایند لازم است گزینه Empty Activity   انتخاب شود.
  3. باید نامی را برای پروژه خود انتخاب کرد که این نام می‌تواند هر اسم دلخواهی باشد. مثلاً می‌توان نام پروژه را « Firebase Notification Android  » گذاشت.
  4. در انتها نیز باید گزینه Finish‌   را کلیک کرد.

ساختاربندی پروژه ارسال پوش نوتیفیکیشن در اندروید

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

  1. باید ۷ بسته جدید ( new packages  ) با نام‌های زیر ایجاد شوند:
    • di
    • firebase
    • helper
    • model
    • view
    • viewmodel
    • network
  2. سپس باید MainActivity  را به بسته یا پکیج view  انتقال داد.

ایجاد پروژه فایربیس برای ارسال پوش نوتیفیکیشن در اندروید

برای ایجاد پروژه فایربیس مورد نیاز در پروژه نمونه ارسال پوش نوتیفیکیشن در اندروید، باید گام‌های زیر را طی کرد:

  1. ابتدا باید به آدرس https://console.firebase.google.com/ مراجعه شود.
  2. سپس باید وارد حساب کاربری خود شده و روی گزینه Add Project   کلیک کرد.
  3. اکنون نام پروژه باید وارد شود (هر نام دلخواهی را می‌توان انتخاب کرد).
  4. باید گزینه Continue  را کلیک کرد.
  5. حالا باید در صفحه Google Analytics گزینه Continue  را زد.
  6. در این مرحله باید یک حساب کاربری گوگل را انتخاب کرد. لازم است گزینه Default Account For Firebase انتخاب شود.
  7. سپس نیاز است روی گزینه Create Project  کلیک شود.
  8. در این مرحله، پیامی به صورت « Your new project is ready  » مشاهده خواهد شد.
  9. در نهایت هم باید Continue  را کلیک کرد.

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

اتصال فایربیس به اندروید

  • برای اتصال فایربیس به اندروید، باید در صفحه خانه کنسول خود، روی لوگوی اندروید کلیک کرد:
انتخاب گزینه اندروید برای اتصال فایربیس به اندروید
  • برای پر کردن قسمت نام بسته اندروید (Android Package Name) باید به فایل Manifest.xml مراجعه شود، package را کپی و آن را آن‌جا الصاق (paste) کرد. این نام چیزی شبیه به عبارت زیر است:
    • com.name.firebasenotificationandroid
  • در قسمت App Nickname که به معنی نام مستعار اپلیکیشن است هم می‌توان هر چیزی را نوشت و تفاوتی در این خصوص وجود ندارد.
  • برای قسمت «Debug Signing Certificate» هم باید مطابق تصویر زیر به نشانی gradle — Tasks — Android — signingReport  رفت. سپس لازم است کلید SHA-1 را کپی و آن را الصاق کرد.
کپی کردن کلید SHA و الصاق آن از قسمت signingReport
  • در گام بعدی باید روی گزینه Register App کلیک کرد.
  • حالا باید google-services.json  را دانلود و آن را در پوشه project در شاخه اپلیکیشن‌ها الصاق (Paste) کرد.
دانلود و الصاق فایل google-services.json در حین پیاده سازی پروژه ارسال پوش نوتیفیکیشن در اندروید
  • در این مرحله باید تمام متعلقات فایربیس را به پروژه اندروید اضافه کرد.
  • در نهایت با همگام‌سازی (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})

به این ترتیب پروژه ارسال پوش نوتیفیکیشن در اندروید اینجا به پایان می‌رسد و تمام موارد لازم انجام شده است. می‌توان از طریق این لینک [+] به تمام فایل‌های پروژه دسترسی پیدا کرد.

جمع‌بندی

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

بر اساس رای ۱۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Medium
۱ دیدگاه برای «ارسال پوش نوتیفیکیشن در اندروید — راهنمای گام به گام ساده»

👍👍👍👍👍

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *