পোস্টটি পড়া হয়েছে 9,383 বার

Android অ্যাপে পুশ নোটিফিকেশন: Firebase API ও PHP backend

আমাদের ডেভেলপ করা অ্যাপগুলোতে ইউজারদেরকে আরো বেশি এঙ্গেজ করতে আমরা পুশ নোটিফিকেশন ব্যবহার করে থাকি। নোটিফিকেশনের মাধ্যমে জানাতে পারি অ্যাপের নতুন ফিচার, ই-কমার্স টাইপ অ্যাপ হলে জানাতে পারি নতুন কোন অফার। বা কোনো বিশেষ দিবসে ইউজারদেরকে পাঠাতে পারি কোন শুভেচ্ছা বার্তা। অনেকগুলো সার্ভিসের মাধ্যমে পুশ নোটিফিকেশনের কাজটা করা যায়। আমি এখানে দেখাবো Firebase Push Notification এর মাধ্যমে Android App এ কিভাবে নোটিফিকেশন পাঠানো যায়।

Problem Description

ধরুন আপনার একটা ব্লগ সাইট আছে। প্রতিদিন আপনি নতুন লেখা পোস্ট করেন। আপনার ব্লগের জন্য একটা অ্যাপ বানিয়েছেন। সেটা দিয়ে শুধুমাত্র আপনার ব্লগের প্রতিদিনের নতুন পোস্টটা পড়া যায়। ধরা যাক, আগের কোন পোস্ট এই অ্যাপ দিয়ে পড়া যাবে না। ব্লগে নতুন পোস্ট করা হলে আপনি সার্ভার থেকে অ্যাপে একটা নোটিফিকেশন পাঠাবেন। ঐ নোটিফিকেশনে ক্লিক করে ছবি সহ আপনার আর্টিকেলটা ইউজার পড়তে পারবেন।

সার্ভার থেকে নোটিফিকেশন পাঠালে ফোনের সিসটেম ট্রেতে নোটিফিকেশনের আইকন শো করবে। সাথে থাকবে একটা অডিও টোন। নোটিফিকেশন ট্রে থেকে swipe down করলে দেখা যাবে সার্ভার থেকে সেট করে দেয়া নোটিফিকেশনের টাইটেল, শর্ট মেসেজ ও একটা ইমেজ। এখানে ক্লিক করলে একটা Activity ওপেন হবে। সেখানে থাকবে ওয়েব সার্ভার থেকে নোটিফিকেশন আকারে পাঠানো সেই ইমেজ, আর্টিকেলের টাইটেল, time stamp ও সম্পূর্ণ আর্টিকেল।

Firebase সম্পর্কে প্রাথমিক ধারণা

ফায়ারবেজ একটা অ্যাপ্লিকেশন ডেভেলপমেন্ট প্ল্যাটফর্ম। বেশ কিছু টুলস এর সমন্বয়ে গঠিত এই প্ল্যাটফর্মের সাহায্যে খুব দ্রুত ও সহজে দারুণ সব অ্যাপ বানানে যায়। একটা অ্যাপে যে সকল কমন টুলসগুলোর দরকার পড়ে সেগুলো ফায়ারবেজের মাধ্যমে ইমপ্লিমেন্ট করা যায়। ফায়ারবেজ যেই সুবিধাগুলো দেয় সেগুলোর মধ্য কয়েকটির নাম উল্লেখ করা হলো:

  • Analytics
  • Push Notification
  • Adwords
  • Realtime Database
  • Cloud Messaging
  • Storage
  • Crash Reporting
  • App Indexing

Firebase Push Notification সম্পর্কে প্রাথমিক ধারণা

Firebase Message Types: ফায়ারবেজের মাধ্যমে ৩ ধরনের নোটিফিকেশন পাঠানো যায়।

  1. Notification message,
  2. Data message,
  3. Both (notification and data).

Notification message পাঠানো খুব সহজ। ফায়ারবেজের কনসোল থেকেই এই নোটিফিকেশন পাঠানো যায়। এই নোটিফিকেশন Firebase SDK নিজেই handle করে। কিন্তু এতে করে এই নোটিফিকেশনের উপর আপনার খুব বেশি কন্ট্রোল থাকবে না।

{
    "to": "e1w6hEbZn-8:jkjlklvflkfldlfspdfoi574576dfvdfd87c5f6d...",
    "notification": {
        "body": "This is my Message Body. It contains some message for users",
        "title": "This is notification tile",
        "icon": "appicon"
    }
}

কনসোল থেকে এই ধরনের নোটিফিকেশন পাঠালে অ্যাপে আসা JSON data এর ফরমেট হয় উপরের JSON এর মত। এক্ষেত্রে “notification” keyword টা একটা JSON object এর key হিসাবে থাকে।

Data Message ফায়ারবেজ SDK নিজেই handle করতে পারে না। এটা অ্যাপ থেকে হ্যান্ডেল করতে হয়। ডেটা মেসেজ ফায়ারবেজ কনসোল থেকে পাঠানো সম্ভব না। এর জন্য আপনার নিজস্ব সার্ভার (অথবা localhost) ব্যবহার করে Firebase API এর মাধ্যমে নিচের মত JSON data পাঠাতে হবে। এক্ষেত্রে “data” keyword টা থাকতে হবে।

{
   "to" : "e1w6hEbZn-8:Dfdfdf91bEUKLhlkdS5fdJfI5Ak...",
   "data" : {
     "name" : "Nekro Zen Commuter Bicycle",
     "product_id" : "2564",
     "price" : "16000"
   }
 }

Both (notification and data) টাইপের মেসেজ পাঠানোর জন্য JSON ডেটায় “notification” ও “data” উভয় কীওয়ার্ডই থাকতে হবে।

{
    "to" : "e1w6hEbZn-8:APA91bEUIb2JewYCIiApsMu5JfI5Ak...",
    "notification": {
        "body": "This is my Message Body. It contains some message",
        "title": "This is notification tile",
        "icon": "appicon"
    },
"data" : {
     "name" : "Nekro Zen Commuter Bicycle",
     "product_id" : "2564",
     "price" : "16000"
   }
}

অ্যাপ ব্যাকগ্রাউন্ডে আছে এমন অবস্থায় নোটিফিকেশন আসলে নোটিফিকেশন ট্রেতে “notification” কী এর ডেটাগুলোর মাধ্যমে নোটিফিকেশন জেনারেট করবে। ইউজার নোটিফিকেশনে ক্লিক করলে তখন “data” কী এর মেসেজগুলো প্রসেস করা হবে। কিন্তু অ্যাপ যদি foreground এ থাকে তাহলে অ্যাপ উভয় ডেটাই রিসিভ করে।

Target Audience of Firebase Push Notification

কনসোল ও আপনার নিজস্ব সার্ভার উভয় থেকেই আপনি আপনার টার্গেট ইউজারদেরকে মেসেজ পাঠাতে পারবেন। যে সকল ডিভাইসে আপনার অ্যাপটি ইন্সটল করা আছে সেগুলোতো ফায়ারবেজের একটা registration ID থাকবে। এই আইডির মাধ্যমে আপনি individual device এ নোটিফিকেশন পাঠাতে পারেন। উপরের message type এর উদাহরনের মেসেজগুলো individual device এর ক্ষেত্রে কাজ করবে। “to” : “e1w6hEbZn-8:APJewpsMu5JfI5Ak…” এখানে “to” key এর value হচ্ছে কোনো একটা ডিভাইসের ফায়ারবেজ রেজিস্ট্রেশন আইডি।

এছাড়া গ্রুপ আকারেও আপনার মেসেজগুলো পাঠাতে পারেন। যেমন বিবিসি নিউজের অ্যাপে আপনাকে সিলেক্ট করার অপশন দেয়া হয় যে, কোন কোন টপিকের নিউজের নোটিফিকেশন আপনি পেতে চান। গ্রুপ বা টপিক মেসেজ পাঠানোর জন্য অ্যাপে কিছু কাজ করা লাগবে। সেগুলো এই পোস্টেই দেখানো হবে। টপিক মেসেজের ডেটা ফরমেট হয় এরকম:

{
  "to": "/topics/sports_news",
  "data": {
    "message": "This is your sports message",
   }
}

এই ছিল মোটামুটি ফায়ারবেজ পুশ নোটিফিকেশনের ব্যাসিক overview. এখন চলে যাব সরাসরি প্রোজেক্টে।

Integrating Firebase Push Notification

1. Firebase এর অফিসিয়াল সাইটে ঢুকে একটা একাউন্ট খুলে ফেলেন। একই সাথে Android Studio দিয়ে একটা নতুন প্রোজেক্ট ওপেন করুন। আপনার ইচ্ছা মত package name দিন।

2. “Add Project” অপশনে ক্লিক করে প্রোজেক্টের নাম ও দেশের নাম দিন।

“CREATE PROJECT” বাটনে ক্লিক করার পর ফায়ারবেজের সবগুলো সার্ভিসের লিস্ট সম্বলিত একটা পেজ পাবেন। তার উপরের অংশে থাকবে নিচের মত তিনটি অপশন। একটা প্রোজেক্টের তিনটা ভার্সন হতে পারে। আমি এখানে Android নিয়ে কাজ করব। সিলেক্ট করুন “Add Firebase to your Android app”.

3. আপনার অ্যাপের package name এন্ট্রি দিন। পরের দুটি ফিল্ড অপশনাল। ইচ্ছা হলে দিতে পারেন।

“REGISTER APP” বাটনে ক্লিক করলে নিচের মত একটা pop up message আসবে।

তিনটা instruction আছে এখানে। প্রথমে ১ নাম্বার অপশনে থাকা ডাউনলোড বাটনে ক্লিক করে google-services.json ফাইলটি ডাউনলোড করে নিন। Project view তে সুইচ করে ৩ নাম্বার নির্দেশনা মোতাবেক ডাউনলোড হওয়া ফাইলটি app ফোল্ডারে paste করুন

এরপর Firebase console এর “CONTINUE” বাটনে ক্লিক করুন।

4. এরপর এরকম একটা পপ আপ আসবে:

PHP backend থেকে Firebase API ব্যবহার করে নোটিফিকেশন পাঠানো

উপরের ব্যাসিক আলোচনার মাধ্যমে আমরা জেনেছি যে Notification Message শুধুমাত্র ফায়ারবেজ কনসোল থেকে পাঠানো যায়। সাথে data payload পাঠাতে হলে অবশ্যই আপনাকে কিছু সার্ভার সাইড লজিক নিয়ে কাজ করতে হবে। আমি এক্ষেত্রে Server Side Language হিসাবে PHP ব্যবহার করছি। প্রথমে PHP এর পার্টটা দেখবো। এরপর অ্যাপে আরো কিছু কাজ করতে হবে সেগুলোও দেখবো। আর ধরে নিচ্ছি আপনি HTML, CSS, PHP এর ব্যাসিকগুলো জানেন। কিভাবে একটা PHP ফাইল localhost এ রান করতে হয় এ বিষয়ে আপনার জানা থাকতে হবে। Firebase Push Notification পাঠানোর জন্য আপনার live server এর প্রয়োজন নাই। আপনার পিসির Localhost থেকেই আপনি আপনার অ্যাপ ইন্সটল থাকা হাজার হাজার ডিভাইসে নোটিফিকেশন পাঠাতে পারবেন! Exciting না???

Preparing the PHP backend for Firebase Push Notification

আমাদের উদ্দেশ্য হচ্ছে নিচের মত একটা ইনপুট দেয়ার সিসটেম বানানো। ধরুন আমরা চাচ্ছি এমন একটা নোটিফিকেশন পাঠাতে যেখানে টাইটেল, একটা শর্ট মেসেজ, আর্টিকেল ও ইমেজের একটা লিংক থাকবে।

এখানে আসলে আর্টিকেলের উদাহরণ দেয়াটা খুব একটা ঠিক কাজ হচ্ছে না। কারণ নোটিফিকেশনে খুব বেশি ডেটা পাঠানো যায় না। এক্ষেত্রে পরবর্তীতে আপনি আপনার সাইটের কোনো API লিংক পাঠাতে পারেন। আর অ্যাপ থেকে কল করা হবে সেই লিংকে। সেখান থেকে JSON বা অন্য কোনো ফরমেটে আপনার আর্টিকেল নিয়ে এসে অ্যাপে শো করতে পারেন। এটা যেহেতু ভিন্ন একটা টপিক তাই আপাতত আমরা অল্প টেক্সট এর কোনো আর্টিকেল দিয়ে আমাদের সিসটেম চেক করতে পারি। নোটিফিকেশন পাঠানের কাজটা শেখা হয়ে গেলে পরে এটাকে নিজের মত কাস্টমাইজড করে নিতে পারবেন।

যাই হোক, উপরের মত ভিউ বানানোর সোর্স কোড সব রেডি করা আছে। এখান থেকে ফাইলগুলো নামিয়ে লোকাল হোস্ট থেকে রান করলে লগিন পেজ দেখাবে। সেখানে লগিনের আইডি-পাসওয়ার্ডও সেট করে দেয়া আছে। আমি PHP এর কোডগুলো Linux Mint অপারেটিং সিসটেমে রান করে নোটিফিকেশন টেস্ট করেছি। এক্ষেত্রে শুরুতে firebase.php ফাইলে থাকা curl এর ফাংশনগুলো রান করতে সমস্যায় পড়ি। আমার পিসিতে তখন curl ইন্সটল ছিল না। পরে তা ইন্সটল দেয়ার পর সমস্যা সমাধান হয়। আপনার ক্ষেত্রেও একই ধরনের সমস্যা হতে পারে। আশা করছি গুগল করে curl ইন্সটল করে নিতে কোনো সমস্যা হবে না।

Modify config.php file

config.php ফাইলে গিয়ে, Firebase console থেকে প্রাপ্ত server key টা বসিয়ে দিতে হবে।

<?php
    // Firebase Server Key
    define('FIREBASE_API_KEY', 'YOUR SERVER KEY');
?>

কনসোলে ‘সার্ভার কী’ খুঁজে না পেলে নিচের ছবিটা দেখতে পারেন।

dashboard.php File

এই ফাইলের একদম নিচে দেখবেন একটা HTML form আছে। এখান থেকে আমাদের ডেটাগুলো ইনপুট নিয়ে PHP code এর কাছে পাঠানো হবে ফায়ারবেজের API এর মাধ্যমে নোটিফিকেশন সেন্ড করার জন্য। একদম নিচে দেখেন আছে। এর মানে হচ্ছে আমরা গ্রুপ হিসাবে কোনো একটা ইউজারের গ্রুপের সবাইকে মেসেজ পাঠাতে চাচ্ছি। যদি individual একজনকে পাঠাতে চাই তখন value=”individual” করতে হবে।

এই ইনপুট হওয়া ডেটাগুলো handle করবে একই ফাইলেরtag এর শুরুতে থাকা PHP code block-টুকু। 101 নাম্বার লাইনে দেখুন চেক করা হচ্ছে push_type টা topic নাকি individual. যদি topic message হয় তাহলে 103 নাম্বার লাইনে $response = $firebase->sendToTopic(‘global’, $json); অর্থাৎ ‘global’ গ্রুপের সকল ইউজারদেরকে মেসেজটা পাঠানো হবে। ‘global’ গ্রুপটা কী? আমরা পরে দেখব কিভাবে কোনো একটা গ্রুপে অ্যাপ থেকে সাবস্ক্রাইব করা যায়। আপতত by default অ্যাপের সকল ইউজারদেরকে আমরা global টপিকে subscribe করিয়ে দিব।

আপনার অ্যাপটি কোনো নিউজ টাইপ অ্যাপ হলে ইউজারকে sports, politics ইত্যাদি টপিকে সাবস্ক্রাইব করাতে পারবেন। তখন PHP এর লজিক আপনার মত করে পরিবর্তন করে নিতে হবে। যখন কোনো খেলাধুলার পোস্ট করবেন তখন 103 নাম্বার লাইনে লিখবেন $response = $firebase->sendToTopic(‘sports’, $json); তা না করে যদি সব পোস্টই global টপিকে সেন্ড করেন তাহলে ইউজার নোটিফিকেশনের যন্ত্রণায় অ্যাপ ছেড়ে পালাবে।

অন্য দিকে, আপনার push_type যদি ‘individual’ হয় এর মানে আপনি একজন একজন করে ইউজারকে মেসেজ পাঠাতে চাচ্ছেন। তখন $regId = “PUT YOUR DEVICE ID HERE”; কাজ করবে। প্রশ্ন হচ্ছে ইউজারের ফায়ারবেজ আইডি কিভাবে পাবেন? বা কিভাবে বুঝবেন যে এই আইডিটা ‘হাসান আবদুল্লাহ’ এর কিনা? এজন্য ভাল বুদ্ধি হতে পারে login authentication রাখা। লগিন করার সময় ফায়ারবেজের আইডিও সার্ভারে পাঠিয়ে দিবেন। পরে কুয়েরি-টুয়েরি করে ইউজারের আইডি বের করে তাতে নোটিফিকেশন পাঠাতে পারেন। এজন্য Firebase Authentication ও Firebase Realtime Database ব্যবহার করা যেতে পারে। তবে individual notification কাজ করে কিনা সেটা বোঝার জন্য আপাতত আপনার নিজের ইমুলেটর বা রিয়েল ডিভাইসের আইডি দিয়ে টেস্ট করে দেখতে পারেন।

PHP এর বাকি কোডগুলো আশা করি নিজেই বুঝে যাবেন। তাই আর কথা বাড়াচ্ছি না।

Preparing Android App for Firebase Push Notification

Android Studio এর মাধ্যমে project level gradle ফাইলের dependency তে Google Service যোগ করুন। এর চেহারা দেখতে হবে এরকম:

buildscript {
    ext.kotlin_version = '1.3.50'
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:4.3.2'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

এরপর App level gradle ফাইলে নিচের প্লাগিনটি যোগ করুন:

.
apply plugin: 'com.google.gms.google-services'
.

এবং dependencies এর ভিতর add করুন:

.
implementation 'com.google.firebase:firebase-messaging:20.0.0' //I've used 20.0.0, you should use latest version of library
.

এরপর Sync Now তে ক্লিক করে sync করুন।

Android firebase notification
Project Structure of Android

আপাতত গিটহাবের রিপোজিটরি থেকে সোর্সকোডগুলো উপরের ছবির মত করে কপি-পেস্ট করুন। notification package-টি আপনি পরবর্তীতে আপনার যে কোনো প্রোজেক্টে ব্যবহার করতে পারবেন। জাস্ট কপি-পেস্ট করলেই কাজ করবে। তিনটি সার্ভিস ক্লাস ব্যবহার করেছি। সেগুলো manifest ফাইলে বলে দিতে হবে। Internet permission নিতে ভুলবেন না যেন!

<service android:name=".notification.MyFirebaseMessagingService">
      <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT" />
      </intent-filter>
 </service>

Description of some important classes

আপনার সুবিধার্থে ২-১ টা class এর কোড একটু ব্যাখ্যা করব। বাকিগুলো নিজে ঘাটাঘাটি করলেই বুঝে যাবেন।

এই সার্ভিস ক্লাসের মাধ্যমে ফায়ারবেজের ইউজার হিসাবে অ্যাপটি registered হয়। যতগুলো ডিভাইসে আপনার অ্যাপ ইন্সটল হবে সবগুলোতে এই আইডি হবে unique. আপনার যদি একজন একজন করে ইউজার ধরে ধরে নোটিফিকেশন পাঠানোর দরকার হয় সেক্ষেত্রে এই টোকেনগুলো আপনার সার্ভারে স্টোর করে রাখা লাগবে। Token registration এর সময় onNewToken() মেথডটি কল হয়। আপনি যদি কোনো ইউজারের ফায়ারবেজ টোকেন সার্ভারে স্টোর করতে চান তাহলে এই মেথডের ভিতর থেকে আপনার সার্ভারে API call করে টোকেনটি সার্ভারে পাঠাতে পারেন।

সার্ভার থেকে যখন নোটিফিকেশন পাঠানো হবে তখন এই সার্ভিস ক্লাসের onMessageReceived() মেথড কল হবে এবং ডেটাগুলো সে রিসিভ করবে। এই ডেটাগুলো দিয়ে সে নোটিফিকেশন জেনারেট করবে। handleDataMessage() মেথডের ভিতরে Intent initialization এর সময় দেখুন বলা আছে যে, নোটিফিকেশনে ক্লিক করলে কোন Activity ওপেন করতে হবে।

class MyFirebaseMessagingService : FirebaseMessagingService() {

    val TAG = "MessagingService"
    private var notificationUtils: NotificationUtils? = null

    override fun onNewToken(token: String) {
        super.onNewToken(token)

        Log.e("FCM Token", token)
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)

        Log.e(TAG, "From: " + remoteMessage.from)

        // Check if message contains a data payload.
        if (remoteMessage.data.isNotEmpty()) {
            Log.e(TAG, "Data Payload: " + remoteMessage.data.toString())

            try {
                val json = JSONObject(remoteMessage.data.toString())
                handleDataMessage(json)
            } catch (e: Exception) {
                Log.e(TAG, "Exception: " + e.message)
            }

        }
    }

    private fun handleDataMessage(json: JSONObject) {
        Log.e(TAG, "push json: $json")

        try {
            val data = json.getJSONObject("data")

            val title = data.getString("title")
            val message = data.getString("message")
            val imageUrl = data.getString("image")
            val timestamp = data.getString("timestamp")
            val payload = data.getJSONObject("payload")

            val articleData = payload.getString("article_data")

            //Send notification data to MessageShowActivity class for showing
            val resultIntent = Intent(applicationContext, MessageShowActivity::class.java)
            resultIntent.putExtra("title", title)
            resultIntent.putExtra("timestamp", timestamp)
            resultIntent.putExtra("article_data", articleData)
            resultIntent.putExtra("image", imageUrl)

            // check for image attachment
            if (TextUtils.isEmpty(imageUrl)) {
                showNotificationMessage(applicationContext, title, message, timestamp, resultIntent)
            } else {
                // image is present, show notification with image
                showNotificationMessageWithBigImage(
                    applicationContext,
                    title,
                    message,
                    timestamp,
                    resultIntent,
                    imageUrl
                )
            }

        } catch (e: JSONException) {
            Log.e(TAG, "Json Exception: " + e.message)
        } catch (e: Exception) {
            Log.e(TAG, "Exception: " + e.message)
        }

    }

    /**
     * Showing notification with text only
     */
    private fun showNotificationMessage(
        context: Context,
        title: String,
        message: String,
        timeStamp: String,
        intent: Intent
    ) {
        notificationUtils = NotificationUtils(context)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        notificationUtils?.showNotificationMessage(title, message, timeStamp, intent)
    }

    /**
     * Showing notification with text and image
     */
    private fun showNotificationMessageWithBigImage(
        context: Context,
        title: String,
        message: String,
        timeStamp: String,
        intent: Intent,
        imageUrl: String
    ) {
        notificationUtils = NotificationUtils(context)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        notificationUtils?.showNotificationMessage(title, message, timeStamp, intent, imageUrl)
    }
}

MainActivity.kt class

MainActivity এর ভিতর আমরা ইউজারের ফায়ারবেজ টোকেনটি প্রিন্ট করিয়েছি। এরপর ‘global’ নামক টপিকে ইউজারকে সাবস্ক্রাইব করিয়ে দিয়েছি। চাইলে এই সাবস্ক্রিপশনটা ইউজারের উপর ছেড়ে দিতে পারি। অর্থাৎ ইউজার কোনো একটা বাটন ক্লিক করলে সাবস্ক্রাইব করাতে পারি এবং আনসাবস্ক্রাইব করার জন্য বাটন ক্লিক করলে আনসাবস্ক্রাইবও করতে পারি।

class MainActivity : AppCompatActivity() {

    private val TAG = "MainActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
            firebaseId.append(it.token)
        }

        FirebaseMessaging.getInstance().subscribeToTopic(TOPIC_GLOBAL)
            .addOnCompleteListener { task ->

                if (task.isSuccessful)
                    Log.d(TAG, "Global topic subscription successful")
                else
                    Log.e(TAG, "Global topic subscription failed. Error: " + task.exception?.localizedMessage)
            }
    }
}

বাকি রইলো NotificationUtils.kt সহ আরো কিছু ক্লাস। NotificationUtils.kt এর মাধ্যমে বিভিন্ন ধরনের নোটিফিকেশন জেনারেট করা হয়। মেথডগুলো লাইন বাই লাইন পড়লে কাজগুলো ক্লিয়ার হবে। আর প্রয়োজনীয় কমেন্ট করা আছে। তাই বুঝা কষ্টকর হবে না।

পুরো প্রোজেক্টটি একত্রে পাওয়া যাবে আমার গিটহাব রিপোজিটরিতে। সেখান থেকে ২টা Activity এর UI ও অন্যান্য কোডগুলো দেখে নিতে পারেন। উল্লেখ্য, এই প্রোজেক্ট সরাসরি রান করলেই কাজ করবে না। আপনার প্রোজেক্টের google-services.json ও প্যাকেজের নাম আলাদা হতে হবে।

পুশ নোটিফিকেশন শেখা, এই পোস্ট লিখা এবং গিটহাবের প্রোজেক্টটি ডেভেলপ করার জন্য আমি অনুসরণ করেছি Ravi Tamada এর Android Hive ব্লগের এই পোস্টটি। আমার ধারণা আমার লেখাটি বেশ খাপ ছাড়া আর অগোছালো রয়ে গেছে। সেক্ষেত্রে আপনি মূল লেখাটি পড়তে পারেন। ঐ লেখাটি আরো তথ্যবহুল।

লেখাটি আরে উন্নত করার জন্য যে কোন ধরনের পরামর্শ ও মতামত সাদরে গ্রহন করা হবে। ধন্যবাদ।

17 thoughts on “Android অ্যাপে পুশ নোটিফিকেশন: Firebase API ও PHP backend

  1. অনেক অনেক ধন্যবাদ, এতো সুন্দরভাবে সবকিছু উপস্থাপন করার জন্য।
    অনেক সহজে বুঝতে পেরেছি বিষয়টা।

    আমার একটা প্রশ্ন ছিলো, সেটা হচ্ছে, ধরুন আমার একটা এপ প্লেস্টোরে আছে। যেটার ভার্সন ১.
    ওটার মধ্যে পুশ নোটিফিকেশন দেওয়া হয়নাই।

    এখন আমি চাচ্ছি, কাজটা যখন বুঝতে পেরেছি, ওই এপটাতেই পুশ নোটিফিকেশন চালু করার জন্য।

    এবং আমি করেছি ও। সবকিছু ঠিকঠাকভাবে চলছিলো।

    কিন্তু সমস্যা দেখা দিলো, যখন আমি এপটির ভার্সন চেইঞ্জ করলাম ১ থেকে ২ এ, তখন আর নোটিফিকেশন কাজ করেনা।

    লোকালহোস্টে দেখায় ম্যাসেজ সেন্ট, কিন্তু মোবাইলে এসে পৌছায়না।

    সমস্যাটা আসলে কোথায় হচ্ছে আমি ঠিক বুঝতে পারছিনা।
    একদম শেষে এসে এইভাবে হেরে গেলেতো কষ্ট লাগে খুব, বুঝেনইতো।

    আমি আপনার উত্তরের আশায় থাকবো। ধন্যবাদ 🙂

    1. আপনার প্রশ্ন ক্লিয়ার না। ভার্সন ১ প্লেস্টোরে আছে। সেটাতে পুশ এড করা নাই। আপনার existing code এ পুশের কোড এড করলেন। অ্যাপের ভার্সন চেঞ্জ করে ২ করলেন। এরপর বিল্ড দিলেন। এই বিল্ডে নোটিফিকেশন আসছে না? আনইন্সটল করে নিউ বিল্ড দিয়ে দেখেছেন কি?

    2. পুশ কাজ করা অবস্থায় ভার্সন চেঞ্জ হলে অনেক সময় ঝামেলা করে। নোটিফিকেশন আসে না। সেটার জন্য ভার্সন চেঞ্জ হলে আমি Firebase ID আগেরটা ডিলেট করে নতুন করে রেজিস্ট্রেশন করি। ডিলেট করে নতুন আইডি রেজিস্ট্রেশন করার জন্য গুগল সার্চ করলে সলুশন পাবেন আশা করি। আমি যখন কাজ করেছিলাম তখন কোথাও দেখেছিলাম এরকম সলিউশনের কথা। তাই নতুন করে রেজিস্ট্রেশন করেছিলাম।

          1. ভাই সালাম নিবেন। আপনার সাথে একটু দেখা করে কথা বলতে চাচ্ছিলাম। আমার অফিস ঢাকা সিটি কলেজের অপসিটে। আপনার মোবাইল নাম্বারটা অনেক দরকার। ধন্যবাদ।

          2. আপনি যেই ইমেইল অ্যাড্রেস দিয়েছেন সেটা সঠিক নয়। আমি মেইল পাঠানোর চেষ্টা করে পাঠাতে পারি নি। আপনার জানার বা জানানোর বিষয়টা এই পেজের কনটাক্ট ফরমের মাধ্যমে আমাকে পাঠাতে পারবেন। আর কাইন্ডলি ইমেইল অ্যাড্রেসটা কেয়ারফুল্যি দিবেন। যেন আমি রিপ্লাই করতে পারি। ধন্যবাদ।

  2. নিজের সার্ভার কি দেয়ার পরও ভাইয়া নোটিফিকেশন আসছে না।কি সমস্যা হতে পার?

  3. Assalamu-alaikum,
    ami ki android app theke php file ta run korte parbo?
    kivabe krbo ekto jodi help koren vaiya , upokar hobe.
    jazakallah khairan.

  4. I want to go to a specific activity when I will click the notification on the notification tray. How can I do so?
    Can you please help me in this regard.

      1. ভাইয়া আমি আপনার সাথে দেখা করতে চাই।

  5. ভাইয়া এই আমি কটলিন ভালো বুজিনা কিন্তু জাবায় অনেক ভালো বুজি তাই এই প্রোজেক্টা যদি একটু জাভায় কোড করে দিতেন তাহলে আমি সহ আমার সহপাঠীরা অনেক উপকৃত হতাম, অগ্রিম ধন্যবাদ আশা করি আপনার ছোট ভাই হিসাবে আমার এই ছোট চাওয়াটুক পুরন করে দিবেন।

    1. এটা শুরুতে জাভাতেই ছিল। পরবর্তীতে কটলিনে শিফট করা হয়েছে। ক্যারিয়ার গ্রোথ এবং ইন্ডাস্ট্রিতে টিকে থাকার জন্য কটলিন শিখে ফেলুন। কাজে লাগবে।

  6. সবকিছু পুংখানু পুংখভাবে বুঝিয়ে বলার জন্য ধন্যবাদ। আমি বিগেনার হয়েও অনেকটাই আয়ত্বে আনতে পেরেছি।

Leave a Reply

Your email address will not be published. Required fields are marked *