Flutter অ্যাপে Firebase Cloud Messaging ব্যবহার শুরু করা

প্ল্যাটফর্ম বেছে নিন: iOS+ Android ওয়েব Flutter Unity C++


এই নির্দেশিকা থেকে আপনি জানতে পারবেন যে কীভাবে আপনার Flutter ক্লায়েন্ট অ্যাপে Firebase Cloud Messaging ব্যবহার করা শুরু করবেন যাতে আপনি নির্ভরযোগ্যভাবে মেসেজ পাঠাতে পারেন।

আপনি যে প্ল্যাটফর্মকে টার্গেট করছেন তার উপর নির্ভর করে, আপনাকে কিছু অতিরিক্ত প্রয়োজনীয় সেট-আপ ধাপ সম্পূর্ণ করতে হবে।

iOS+

মেথড সোয়াজলিং

Apple ডিভাইসে FCM Flutter প্লাগ-ইন ব্যবহার করতে, মেথড সুইজলিং প্রয়োজন। এটি না থাকলে, FCM রেজিস্ট্রেশন হ্যান্ডেলিংয়ের মতো মূল Firebase ফিচার সঠিকভাবে কাজ করবে না।

Android

Google Play পরিষেবা

FCM ক্লায়েন্টের জন্য Android 7.0 বা তার পরবর্তী যেকোনও ভার্সন চালানো ডিভাইস প্রয়োজন, যাতে Google Play পরিষেবা ইনস্টল করা আছে অথবা Google API সহ Android 7.0 চালানো এমুলেটর আছে। মনে রাখবেন, Google Play Store-এর মাধ্যমে আপনার Android অ্যাপ ডেপ্লয় করার ব্যাপারে কোনও বিধিনিষেধ নেই।

Play Services SDK-এর উপর নির্ভর করে এমন অ্যাপের ক্ষেত্রে Google Play পরিষেবার ফিচার অ্যাক্সেস করার আগে সবসময় ডিভাইসে মানানসই Google Play পরিষেবা APK আছে কিনা তা চেক করে নেওয়া উচিত। এটি দুটি জায়গায় করার সাজেশন দেওয়া হয়: মূল অ্যাক্টিভিটির onCreate() পদ্ধতিতে এবং এর onResume() পদ্ধতিতে। onCreate() চেক-ইন করার মাধ্যমে নিশ্চিত করা হয় যে সফলভাবে চেক না করা পর্যন্ত অ্যাপ ব্যবহার করা যাবে না। চেক-ইন onResume() নিশ্চিত করে যে ব্যবহারকারী যদি ব্যাক বোতামের মতো অন্য কোনও উপায়ে রানিং অ্যাপে ফিরে আসেন, তাহলে চেকটি এখনও পারফর্ম করা হয়।

ডিভাইসে Google Play পরিষেবার মানানসই ভার্সন না থাকলে, আপনার অ্যাপ GoogleApiAvailability.makeGooglePlayServicesAvailable() কল করতে পারে, যাতে ব্যবহারকারীরা Play Store থেকে Google Play পরিষেবা ডাউনলোড করতে পারেন।

ওয়েব

FCM-এর মাধ্যমে ওয়েব ক্রেডেনশিয়াল কনফিগার করা

FCM ওয়েব ইন্টারফেস, ওয়েব ক্রেডেনশিয়াল ব্যবহার করে, যাকে ভলান্টারি অ্যাপ্লিকেশন সার্ভার আইডেন্টিফিকেশন বা "VAPID" কী বলা হয়, যাতে কাজ করে এমন ওয়েব পুশ পরিষেবায় অনুরোধ পাঠানোর অনুমতি দেওয়া যায়। আপনার অ্যাপকে পুশ বিজ্ঞপ্তিতে সাবস্ক্রাইব করতে, আপনাকে Firebase প্রোজেক্টের সাথে একটি কী পেয়ার অ্যাসোসিয়েট করতে হবে। আপনি নতুন কী পেয়ার তৈরি করতে পারেন অথবা Firebase কনসোলের মাধ্যমে আগে থেকে থাকা কী পেয়ার ইমপোর্ট করতে পারেন।

FCM প্লাগ-ইন ইনস্টল করুন

  1. আপনি আগেই এটি না করে থাকলে, Flutter-এর জন্য Firebase প্লাগ-ইন ইনস্টল ও ইনিশিয়ালাইজ করুন ।

  2. আপনার Flutter প্রোজেক্টের রুট থেকে, প্লাগ-ইন ইনস্টল করতে নিম্নলিখিত কমান্ড রান করুন:

    flutter pub add firebase_messaging
    
  3. সম্পূর্ণ হয়ে গেলে, আপনার Flutter অ্যাপ্লিকেশন আবার তৈরি করুন:

    flutter run
    

বিজ্ঞপ্তির অনুমতি দেওয়ার অনুরোধ

কোনও ডিভাইসে বিজ্ঞপ্তি মেসেজ পাঠাতে, আপনাকে register() ব্যবহার করে FCM-এর সাথে ডিভাইসটি রেজিস্টার করতে হবে। বিজ্ঞপ্তির অনুমতি না দেওয়া হয়ে থাকলে, এই পদ্ধতি ব্যবহারকারীকে বিজ্ঞপ্তির অনুমতি দেওয়ার জন্য অনুরোধ করবে। অন্যথায়, এটি সফল হলে onRegistered-এর মাধ্যমে FID ডেলিভার করে অথবা কোনও সমস্যার কারণে ভবিষ্যতে প্রত্যাখ্যান করে।

// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);

// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
 // APNS token is available, make FCM plugin API requests...
}

Firebase ইনস্টলেশন আইডি অ্যাক্সেস করা

Firebase ইনস্টলেশন আইডি ব্যবহার করে রেজিস্ট্রেশন চালু করুন

Firebase ইনস্টলেশন আইডি (FID) ব্যবহার করে FCM-এর সাথে আপনার অ্যাপ ইনস্ট্যান্সের রেজিস্ট্রেশন চালু করতে, আপনাকে প্রথমে Android ও Apple প্ল্যাটফর্মের জন্য আপনার অ্যাপের কনফিগারেশনে FID চালু করতে হবে (ওয়েবে কোনও স্ট্যাটিক অপ্ট-ইন কনফিগারেশনের প্রয়োজন নেই):

Android

আপনার AndroidManifest.xml-এর <application> এলিমেন্টের মধ্যে নিম্নলিখিত <meta-data> এলিমেন্ট যোগ করুন:

<meta-data android:name="firebase_messaging_installation_id_enabled"
           android:value="true" />

iOS+

আপনার Info.plist-এ FirebaseMessagingInstallationIdEnabled কী যোগ করুন এবং এটি true (YES)-এ সেট করুন:

<key>FirebaseMessagingInstallationIdEnabled</key>
<true/>

onRegistered স্ট্রিমে সাবস্ক্রাইব করুন

নির্দিষ্ট ডিভাইসে আপনার অ্যাপ ইনস্ট্যান্সে মেসেজ পাঠাতে, FCM-এর সাথে রেজিস্টার করার পরে আপনাকে সেই অ্যাপ ইনস্ট্যান্সের Firebase ইনস্টলেশন আইডি (FID) দিতে হবে। FID, onRegistered স্ট্রিমের মাধ্যমে অ্যাসিঙ্ক্রোনাসভাবে ডেলিভার করা হয়।

Android ও Apple প্ল্যাটফর্মে, অটোমেটিক ইনিশিয়ালাইজেশন চালু থাকলে (ডিফল্ট), FCM স্টার্ট-আপে অ্যাপ ইনস্ট্যান্স অটোমেটিক রেজিস্টার করে। তবে, register()-এ স্পষ্ট কল করতে হবে:

  • ওয়েব-এ। আপনি চাইলে vapidKey এবং serviceWorkerScriptPath পাস করতে পারেন।
  • Android ও Apple প্ল্যাটফর্মে অটোমেটিক ইনিশিয়ালাইজেশন বন্ধ করা থাকলে অথবা unregister() কল করার পরে। এছাড়াও, আপনি যেকোনও সময় register()-এ কল করে আগে থেকে রেজিস্টার করা FID-এর মাধ্যমে onRegistered ট্রিগার করতে পারবেন।

register() কল করার আগে সবসময় onRegistered-এ সাবস্ক্রাইব করুন যাতে রেজিস্ট্রেশন ইভেন্ট এমিট করার সময় আপনার লিসেনার অ্যাক্টিভ থাকে:

final messaging = FirebaseMessaging.instance;

messaging.onRegistered
    .listen((String installationId) {
      // TODO: Send the Firebase Installation ID (FID) to your application server.
    })
    .onError((err) {
      // Error getting Firebase Installation ID.
    });

// Required on Web, and on Android/Apple if auto-initialization is disabled.
await messaging.register(
  // Optional on Web (ignored on Android and Apple platforms)
  vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu",
);

onRegistered স্ট্রিম নিম্নলিখিত পরিস্থিতিতে FID নির্গত করে:

  1. অটো-ইনিশিয়ালাইজেশন চালু থাকলে, Android ও Apple প্ল্যাটফর্মে অ্যাপের প্রাথমিক স্টার্টআপ এবং রুটিন সিঙ্ক করার সময় অটোমেটিক।
  2. প্রতিবার ম্যানুয়াল register() কল শেষ হলে (এমনকি অ্যাপ ইনস্ট্যান্স আগে থেকে রেজিস্টার করা থাকলেও, onRegistered এখনও আগে থেকে রেজিস্টার করা FID এমিট করে)।
  3. যখনই Firebase ইনস্টলেশন আইডিতে কোনও পরিবর্তন শনাক্ত করা হয় এবং অ্যাপটি FCM-এর সাথে আবার রেজিস্টার করা হয় অথবা ওয়েব ব্রাউজারে কোনও pushsubscriptionchange ইভেন্ট ফায়ার করা হয়।

Firebase ইনস্টলেশন আইডি (FID) পাওয়ার পরে, এটি আপনার অ্যাপ সার্ভারে পাঠান এবং আপনার পছন্দের পদ্ধতি ব্যবহার করে এটি স্টোর করুন।

রেজিস্ট্রেশন টোকেন অ্যাক্সেস করুন (বন্ধ করা হয়েছে)

নির্দিষ্ট ডিভাইসে মেসেজ পাঠাতে, আপনাকে ডিভাইসের রেজিস্ট্রেশন টোকেন জানতে হবে। কোনও অ্যাপ ইনস্ট্যান্সের জন্য রেজিস্ট্রেশন টোকেন পেতে, getToken() কল করুন। বিজ্ঞপ্তির অনুমতি দেওয়া না থাকলে, এই পদ্ধতি ব্যবহারকারীকে বিজ্ঞপ্তির অনুমতি দেওয়ার জন্য অনুরোধ করবে। অন্যথায়, এটি টোকেন রিটার্ন করে অথবা সমস্যার কারণে ফিউচার বাতিল করে।

ওয়েব প্ল্যাটফর্মে, আপনার VAPID পাবলিক কী getToken()-এ পাস করুন:

final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");

টোকেন আপডেট করা হলে বিজ্ঞপ্তি পেতে, onTokenRefresh স্ট্রিমে সাবস্ক্রাইব করুন:

FirebaseMessaging.instance.onTokenRefresh
    .listen((fcmToken) {
      // TODO: If necessary send token to application server.

      // Note: This callback is fired at each app startup and whenever a new
      // token is generated.
    })
    .onError((err) {
      // Error getting token.
    });

অটোমেটিক ইনিশিয়ালাইজেশন আটকান

FCM রেজিস্ট্রেশন তৈরি করা হলে, লাইব্রেরি Firebase-এ শনাক্তকারী এবং কনফিগারেশন ডেটা আপলোড করে। আপনি যদি অটোমেটিক রেজিস্ট্রেশন আটকাতে চান, তাহলে বিল্ড করার সময় অটোমেটিক ইনিশিয়ালাইজেশন বন্ধ করুন।

অটোমেটিক ইনিশিয়ালাইজেশন বন্ধ করা থাকলে, রানটাইমে আপনি register() কল করে অ্যাপ ইনস্ট্যান্স স্পষ্টভাবে রেজিস্টার করতে পারবেন (Firebase ইনস্টলেশন আইডি পেতে onRegistered-এ সাবস্ক্রাইব করতে ভুলবেন না):

await FirebaseMessaging.instance.register();

iOS

iOS-এ, আপনার Info.plist-এ মেটাডেটা ভ্যালু যোগ করুন:

FirebaseMessagingAutoInitEnabled = NO

Android

Android-এ, আপনার AndroidManifest.xml-এ এইসব মেটাডেটা ভ্যালু যোগ করে Analytics সংগ্রহ ও FCM অটো ইনিশিয়ালাইজেশন (আপনাকে দুটিই বন্ধ করতে হবে) বন্ধ করুন:

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

রানটাইমে FCM অটো-ইনিশিয়েট আবার চালু করুন

নির্দিষ্ট অ্যাপ ইনস্ট্যান্সের জন্য অটো-ইনিট চালু করতে, setAutoInitEnabled() কল করুন:

await FirebaseMessaging.instance.setAutoInitEnabled(true);

একবার সেট করা হলে, অ্যাপ রিস্টার্ট করার পরেও এই ভ্যালু থেকে যায়।

একটি টেস্ট বিজ্ঞপ্তি মেসেজ পাঠান

  1. টার্গেট ডিভাইসে অ্যাপ ইনস্টল ও রান করুন। Apple ডিভাইসে, রিমোট বিজ্ঞপ্তি পাওয়ার জন্য আপনাকে অনুমতির অনুরোধ গ্রহণ করতে হবে।

  2. ডিভাইসে অ্যাপটি ব্যাকগ্রাউন্ডে চলছে কিনা তা নিশ্চিত করুন।

  3. Firebase কনসোলে, DevOps ও এনগেজমেন্ট > মেসেজিং বিকল্পে যান।

  4. ক্যাম্পেন তৈরি করুন।

    • এটি আপনার প্রথম মেসেজ হলে:

      1. আপনার প্রথম ক্যাম্পেন তৈরি করুন বিকল্প বেছে নিন।

      2. Firebase বিজ্ঞপ্তি মেসেজ বেছে নিয়ে তৈরি করুন বিকল্প বেছে নিন।

    • আপনি আগে ক্যাম্পেন তৈরি করে থাকলে:

      1. ক্যাম্পেন ট্যাবে গিয়ে নতুন ক্যাম্পেন বিকল্প বেছে নিন।

      2. বিজ্ঞপ্তি বিকল্পে ক্লিক করুন।

  5. মেসেজের টেক্সট লিখুন।

  6. ডানদিকের প্যানেল থেকে টেস্ট মেসেজ পাঠান বিকল্প বেছে নিন।

  7. Firebase ইনস্টলেশন আইডি বা FCM রেজিস্ট্রেশন টোকেন যোগ করুন লেবেলযুক্ত ফিল্ডে, আপনার রেজিস্টার করা Firebase ইনস্টলেশন আইডি বা রেজিস্ট্রেশন টোকেন লিখুন।

  8. পরীক্ষা করুন বিকল্প বেছে নিন।

পরীক্ষা করুন বিকল্প বেছে নেওয়ার পরে, টার্গেট করা ক্লায়েন্ট ডিভাইসে ব্যাকগ্রাউন্ডে অ্যাপ সহ বিজ্ঞপ্তি পাওয়া উচিত।

আপনার অ্যাপে মেসেজ ডেলিভারি সম্পর্কে ইনসাইট পেতে, Firebase কনসোলে DevOps ও এনগেজমেন্ট > মেসেজিং > রিপোর্ট ড্যাশবোর্ড বিকল্পে যান। এই ড্যাশবোর্ড Apple ও Android ডিভাইসে পাঠানো ও খোলা মেসেজের সংখ্যা রেকর্ড করে। এর সাথে Android অ্যাপের জন্য "ইম্প্রেশন" (ব্যবহারকারীদের দেখা বিজ্ঞপ্তি) সংক্রান্ত ডেটাও রেকর্ড করে।

ইন্টার‍্যাকশন ম্যানেজ করা

ব্যবহারকারী কোনও বিজ্ঞপ্তিতে ট্যাপ করলে, Android ও iOS, দুটিতেই ডিফল্ট অ্যাকশন হল অ্যাপ্লিকেশন খোলা। অ্যাপ্লিকেশন বন্ধ হয়ে গেলে, সেটি চালু করা হবে এবং সেটি ব্যাকগ্রাউন্ডে থাকলে, ফোরগ্রাউন্ডে আনা হবে।

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

firebase-messaging প্যাকেজ এই ইন্টার‍্যাকশন ম্যানেজ করার দুটি উপায় প্রদান করে:

  1. getInitialMessage(): অ্যাপ্লিকেশনটি বন্ধ করা অবস্থা থেকে খোলা হলে, এই পদ্ধতি RemoteMessage সহ একটি Future রিটার্ন করে। ব্যবহার করা হয়ে গেলে, RemoteMessage সরিয়ে দেওয়া হবে।
  2. onMessageOpenedApp: AStream যা ব্যাকগ্রাউন্ড স্টেট থেকে অ্যাপ্লিকেশন খোলা হলে RemoteMessage পোস্ট করে।

আপনার ব্যবহারকারীরা যাতে মসৃণ অভিজ্ঞতা পান তা নিশ্চিত করতে, আপনাকে দুটি পরিস্থিতিই সামলাতে হবে। নিচে দেওয়া কোডের উদাহরণ থেকে কীভাবে এটি করা যায় তা জানতে পারবেন:

class Application extends StatefulWidget {
  @override
  State createState() => _Application();
}

class _Application extends State {
  // In this example, suppose that all messages contain a data field with the key 'type'.
  Future setupInteractedMessage() async {
    // Get any messages which caused the application to open from
    // a terminated state.
    RemoteMessage? initialMessage =
        await FirebaseMessaging.instance.getInitialMessage();

    // If the message also contains a data property with a "type" of "chat",
    // navigate to a chat screen
    if (initialMessage != null) {
      _handleMessage(initialMessage);
    }

    // Also handle any interaction when the app is in the background using a
    // Stream listener
    FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
  }

  void _handleMessage(RemoteMessage message) {
    if (message.data['type'] == 'chat') {
      Navigator.pushNamed(context, '/chat',
        arguments: ChatArguments(message),
      );
    }
  }

  @override
  void initState() {
    super.initState();

    // Run code required to handle interacted messages in an async function
    // as initState() must not be async
    setupInteractedMessage();
  }

  @override
  Widget build(BuildContext context) {
    return Text("...");
  }
}

আপনি কীভাবে ইন্টার‍্যাকশন ম্যানেজ করবেন তা আপনার সেট-আপের উপর নির্ভর করে। আগে দেখানো উদাহরণটি StatefulWidget ব্যবহার করার একটি প্রাথমিক উদাহরণ।

পরবর্তী ধাপ

সেট-আপের ধাপগুলি সম্পূর্ণ করার পরে, Flutter-এর জন্য FCM-এর সাথে এগিয়ে যাওয়ার জন্য এখানে কয়েকটি বিকল্প দেওয়া হল: