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

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


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

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

iOS+

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

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

Android

Google Play পরিষেবা

FCM ক্লায়েন্টদের Android 4.4 বা তার পরবর্তী যেকোনও ভার্সন সহ ডিভাইস প্রয়োজন, এছাড়াও Google Play পরিষেবা ইনস্টল করা থাকতে হবে অথবা Google API সহ Android 4.4 ভার্সন চলে এমন এমুলেটর থাকতে হবে। মনে রাখবেন, 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 ওয়েব ইন্টারফেস, ওয়েব ক্রেডেনশিয়াল ব্যবহার করে, যাকে Voluntary Application Server Identification বা "VAPID" কী বলা হয়। এটি, কাজ করে এমন ওয়েব পুশ পরিষেবায় অনুরোধ পাঠানোর অনুমতি দেয়। আপনার অ্যাপকে পুশ বিজ্ঞপ্তিতে সাবস্ক্রাইব করতে, আপনাকে Firebase প্রোজেক্টের সাথে একটি কী পেয়ার অ্যাসোসিয়েট করতে হবে। আপনি নতুন কী পেয়ার তৈরি করতে পারেন অথবা Firebase কনসোলের মাধ্যমে আগে থেকে থাকা কী পেয়ার ইমপোর্ট করতে পারেন।

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

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

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

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

    flutter run
    

রেজিস্ট্রেশন টোকেন অ্যাক্সেস করা

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

আগে APNs টোকেন পাওয়া যাবেই এমন কোনও গ্যারান্টি নেই।
// 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...
}

ওয়েব প্ল্যাটফর্মে, আপনার 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-এ শনাক্তকারী ও কনফিগারেশন ডেটা আপলোড করে। আপনি যদি টোকেন অটোমেটিক জেনারেশন বন্ধ করতে চান, তাহলে বিল্ড করার সময় অটো-ইনিশিয়ালাইজেশন বন্ধ করুন।

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. FCM রেজিস্ট্রেশন টোকেন যোগ করুন লেবেল করা ফিল্ডে, আপনার রেজিস্ট্রেশন টোকেন লিখুন।

  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-এর সাথে এগিয়ে যাওয়ার জন্য এখানে কয়েকটি বিকল্প দেওয়া হল: