Firebase is back at Google I/O on May 10! Register now

একটি Flutter অ্যাপে বার্তা গ্রহণ করুন

সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।

একটি ডিভাইসের অবস্থার উপর নির্ভর করে, আগত বার্তাগুলি ভিন্নভাবে পরিচালনা করা হয়। এই পরিস্থিতিগুলি বুঝতে এবং কীভাবে আপনার নিজের অ্যাপ্লিকেশনে এফসিএমকে একীভূত করতে হয়, ডিভাইসটি যে বিভিন্ন রাজ্যে থাকতে পারে তা স্থাপন করা প্রথমে গুরুত্বপূর্ণ:

অবস্থা বর্ণনা
ফোরগ্রাউন্ড যখন অ্যাপ্লিকেশন খোলা থাকে, দৃশ্যে এবং ব্যবহারে।
পটভূমি যখন অ্যাপ্লিকেশনটি খোলা থাকে তবে পটভূমিতে (মিনিমাইজড)। এটি সাধারণত ঘটে যখন ব্যবহারকারী ডিভাইসে "হোম" বোতাম টিপে, অ্যাপ সুইচার ব্যবহার করে অন্য অ্যাপে স্যুইচ করে, বা একটি ভিন্ন ট্যাবে (ওয়েব) অ্যাপ্লিকেশন খোলা থাকে।
সমাপ্ত যখন ডিভাইসটি লক থাকে বা অ্যাপ্লিকেশনটি চলছে না।

FCM এর মাধ্যমে অ্যাপ্লিকেশনটি বার্তা পেলোড গ্রহণ করার আগে কয়েকটি পূর্বশর্ত পূরণ করতে হবে:

  • অ্যাপ্লিকেশনটি অন্তত একবার খোলা থাকতে হবে (FCM-এর সাথে নিবন্ধনের অনুমতি দেওয়ার জন্য)।
  • iOS-এ, ব্যবহারকারী অ্যাপ সুইচার থেকে অ্যাপ্লিকেশনটি সোয়াইপ করলে, আবার কাজ শুরু করার জন্য ব্যাকগ্রাউন্ড বার্তাগুলির জন্য এটিকে ম্যানুয়ালি পুনরায় খুলতে হবে।
  • অ্যান্ড্রয়েডে, ব্যবহারকারী যদি ডিভাইস সেটিংস থেকে অ্যাপটিকে জোর করে ছেড়ে দেয়, তাহলে বার্তাগুলি কাজ শুরু করার জন্য এটি ম্যানুয়ালি পুনরায় খুলতে হবে।
  • ওয়েবে, আপনি অবশ্যই আপনার ওয়েব পুশ সার্টিফিকেট সহ একটি টোকেন ( getToken() ব্যবহার করে) অনুরোধ করেছেন৷

বার্তা পাওয়ার জন্য অনুমতির অনুরোধ করুন (অ্যাপল এবং ওয়েব)

iOS, macOS এবং ওয়েবে, আপনার ডিভাইসে FCM পেলোড গ্রহণ করার আগে, আপনাকে প্রথমে ব্যবহারকারীর অনুমতি চাইতে হবে।

firebase_messaging প্যাকেজ requestPermission পদ্ধতির মাধ্যমে অনুমতির অনুরোধ করার জন্য একটি সহজ API প্রদান করে। এই API অনেকগুলি নামযুক্ত আর্গুমেন্ট গ্রহণ করে যা আপনি যে ধরনের অনুমতির অনুরোধ করতে চান তা সংজ্ঞায়িত করে, যেমন নোটিফিকেশন পেলোড ধারণকারী মেসেজিং একটি শব্দ ট্রিগার করতে পারে বা Siri এর মাধ্যমে বার্তা পড়তে পারে কিনা। ডিফল্টরূপে, পদ্ধতিটি বুদ্ধিমান ডিফল্ট অনুমতির অনুরোধ করে। প্রতিটি অনুমতি কিসের জন্য রেফারেন্স API সম্পূর্ণ ডকুমেন্টেশন প্রদান করে।

শুরু করতে, আপনার অ্যাপ্লিকেশন থেকে পদ্ধতিটি কল করুন (iOS-এ একটি নেটিভ মডেল প্রদর্শিত হবে, ওয়েবে ব্রাউজারের নেটিভ API ফ্লো ট্রিগার হবে):

FirebaseMessaging messaging = FirebaseMessaging.instance;

NotificationSettings settings = await messaging.requestPermission(
  alert: true,
  announcement: false,
  badge: true,
  carPlay: false,
  criticalAlert: false,
  provisional: false,
  sound: true,
);

print('User granted permission: ${settings.authorizationStatus}');

অনুরোধ থেকে ফিরে আসা NotificationSettings অবজেক্টের authorizationStatus বৈশিষ্ট্য ব্যবহারকারীর সামগ্রিক সিদ্ধান্ত নির্ধারণ করতে ব্যবহার করা যেতে পারে:

  • authorized : ব্যবহারকারী অনুমতি দিয়েছেন।
  • denied : ব্যবহারকারী অনুমতি অস্বীকার করেছেন।
  • notDetermined : ব্যবহারকারী এখনও অনুমতি দিতে হবে কিনা তা বেছে নেননি।
  • provisional : ব্যবহারকারী অস্থায়ী অনুমতি দিয়েছেন

NotificationSettings অন্যান্য বৈশিষ্ট্যগুলি বর্তমান ডিভাইসে একটি নির্দিষ্ট অনুমতি সক্ষম, অক্ষম বা সমর্থিত কিনা তা ফেরত দেয়।

একবার অনুমতি দেওয়া হয়ে গেলে এবং বিভিন্ন ধরনের ডিভাইসের অবস্থা বোঝা হয়ে গেলে, আপনার অ্যাপ্লিকেশন এখন আগত FCM পেলোডগুলি পরিচালনা করা শুরু করতে পারে।

বার্তা পরিচালনা

আপনার অ্যাপ্লিকেশানের বর্তমান অবস্থার উপর ভিত্তি করে, বিভিন্ন ধরনের বার্তার ইনকামিং পেলোডগুলিকে পরিচালনা করার জন্য বিভিন্ন বাস্তবায়নের প্রয়োজন হয়:

ফোরগ্রাউন্ড বার্তা

আপনার অ্যাপ্লিকেশনটি অগ্রভাগে থাকাকালীন বার্তাগুলি পরিচালনা করতে, onMessage স্ট্রীমটি শুনুন৷

FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  print('Got a message whilst in the foreground!');
  print('Message data: ${message.data}');

  if (message.notification != null) {
    print('Message also contained a notification: ${message.notification}');
  }
});

স্ট্রীমটিতে একটি RemoteMessage রয়েছে, পেলোড সম্পর্কে বিভিন্ন তথ্য যেমন এটি কোথা থেকে এসেছে, অনন্য আইডি, পাঠানোর সময়, এটিতে একটি বিজ্ঞপ্তি রয়েছে কিনা এবং আরও অনেক কিছুর বিশদ বিবরণ রয়েছে৷ যেহেতু আপনার অ্যাপ্লিকেশনটি ফোরগ্রাউন্ডে থাকাকালীন বার্তাটি পুনরুদ্ধার করা হয়েছিল, আপনি সরাসরি আপনার ফ্লাটার অ্যাপ্লিকেশনটির অবস্থা এবং প্রসঙ্গ অ্যাক্সেস করতে পারেন।

ফোরগ্রাউন্ড এবং বিজ্ঞপ্তি বার্তা

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

  • অ্যান্ড্রয়েডে, আপনাকে অবশ্যই একটি "উচ্চ অগ্রাধিকার" বিজ্ঞপ্তি চ্যানেল তৈরি করতে হবে৷
  • iOS-এ, আপনি অ্যাপ্লিকেশনের জন্য উপস্থাপনা বিকল্পগুলি আপডেট করতে পারেন।

পটভূমি বার্তা

নেটিভ (অ্যান্ড্রয়েড এবং অ্যাপল) এবং ওয়েব ভিত্তিক প্ল্যাটফর্মে ব্যাকগ্রাউন্ড মেসেজ পরিচালনার প্রক্রিয়া ভিন্ন।

অ্যাপল প্ল্যাটফর্ম এবং অ্যান্ড্রয়েড

একটি onBackgroundMessage হ্যান্ডলার নিবন্ধন করে পটভূমি বার্তাগুলি পরিচালনা করুন৷ যখন বার্তাগুলি প্রাপ্ত হয়, তখন একটি বিচ্ছিন্নতা তৈরি হয় (শুধুমাত্র Android, iOS/macOS-এর জন্য আলাদা আলাদা করার প্রয়োজন হয় না) আপনার অ্যাপ্লিকেশনটি চলমান না থাকলেও আপনাকে বার্তাগুলি পরিচালনা করতে দেয়৷

আপনার ব্যাকগ্রাউন্ড মেসেজ হ্যান্ডলার সম্পর্কে কিছু জিনিস মাথায় রাখতে হবে:

  1. এটি একটি বেনামী ফাংশন হতে হবে না.
  2. এটি অবশ্যই একটি শীর্ষ-স্তরের ফাংশন হতে হবে (যেমন একটি ক্লাস পদ্ধতি নয় যার জন্য আরম্ভ করার প্রয়োজন হয়)।
  3. এটি অবশ্যই ফাংশন ঘোষণার ঠিক উপরে @pragma('vm:entry-point') দিয়ে টীকা দিতে হবে (অন্যথায় এটি রিলিজ মোডের জন্য ট্রি কাঁপানোর সময় সরানো হতে পারে)।
@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  // If you're going to use other Firebase services in the background, such as Firestore,
  // make sure you call `initializeApp` before using other Firebase services.
  await Firebase.initializeApp();

  print("Handling a background message: ${message.messageId}");
}

void main() {
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  runApp(MyApp());
}

যেহেতু হ্যান্ডলারটি আপনার অ্যাপ্লিকেশনের প্রেক্ষাপটের বাইরে তার নিজস্ব বিচ্ছিন্নভাবে চলে, তাই অ্যাপ্লিকেশনের অবস্থা আপডেট করা বা কোনো UI প্রভাবিত যুক্তি কার্যকর করা সম্ভব নয়। যাইহোক, আপনি HTTP অনুরোধের মতো যুক্তি সম্পাদন করতে পারেন, IO ক্রিয়াকলাপ সম্পাদন করতে পারেন (যেমন স্থানীয় স্টোরেজ আপডেট করা), অন্যান্য প্লাগইনগুলির সাথে যোগাযোগ করা ইত্যাদি।

যত তাড়াতাড়ি সম্ভব আপনার যুক্তি সম্পূর্ণ করার সুপারিশ করা হয়। দীর্ঘ, নিবিড় কাজগুলি চালানো ডিভাইসের কার্যকারিতাকে প্রভাবিত করে এবং OS প্রক্রিয়াটি বন্ধ করতে পারে। যদি কাজগুলি 30 সেকেন্ডের বেশি সময় ধরে চলতে থাকে, তাহলে ডিভাইসটি স্বয়ংক্রিয়ভাবে প্রক্রিয়াটিকে মেরে ফেলতে পারে।

ওয়েব

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

শুরু করতে, আপনার web ডিরেক্টরিতে একটি নতুন ফাইল তৈরি করুন এবং এটিকে firebase-messaging-sw.js বলুন :

importScripts("https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js");
importScripts("https://www.gstatic.com/firebasejs/8.10.0/firebase-messaging.js");

firebase.initializeApp({
  apiKey: "...",
  authDomain: "...",
  databaseURL: "...",
  projectId: "...",
  storageBucket: "...",
  messagingSenderId: "...",
  appId: "...",
});

const messaging = firebase.messaging();

// Optional:
messaging.onBackgroundMessage((message) => {
  console.log("onBackgroundMessage", message);
});

ফাইলটিকে অবশ্যই অ্যাপ এবং মেসেজিং SDK উভয়ই আমদানি করতে হবে, Firebase শুরু করতে হবে এবং messaging ভেরিয়েবলটি প্রকাশ করতে হবে।

পরবর্তী, কর্মী নিবন্ধিত করা আবশ্যক. এন্ট্রি ফাইলের মধ্যে, main.dart.js ফাইলটি লোড হওয়ার পরে , আপনার কর্মীকে নিবন্ধন করুন:

<html>
<body>
  ...
  <script src="main.dart.js" type="application/javascript"></script>
  <script>
       if ('serviceWorker' in navigator) {
          // Service workers are supported. Use them.
          window.addEventListener('load', function () {
            // ADD THIS LINE
            navigator.serviceWorker.register('/firebase-messaging-sw.js');

            // Wait for registration to finish before dropping the <script> tag.
            // Otherwise, the browser will load the script multiple times,
            // potentially different versions.
            var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;

            //  ...
          });
      }
  </script>

এরপর আপনার ফ্লটার অ্যাপ্লিকেশন পুনরায় চালু করুন। কর্মী নিবন্ধিত হবে এবং যেকোন ব্যাকগ্রাউন্ড বার্তা এই ফাইলের মাধ্যমে পরিচালনা করা হবে।

হ্যান্ডলিং ইন্টারঅ্যাকশন

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

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

firebase-messaging প্যাকেজ এই মিথস্ক্রিয়া পরিচালনা করার দুটি উপায় প্রদান করে:

  • getInitialMessage() : যদি একটি সমাপ্ত অবস্থা থেকে অ্যাপ্লিকেশনটি খোলা হয় তাহলে একটি RemoteMessage সম্বলিত একটি Future ফেরত দেওয়া হবে। একবার সেবন করলে, RemoteMessage সরানো হবে।
  • onMessageOpenedApp : একটি Stream যা একটি RemoteMessage পোস্ট করে যখন অ্যাপ্লিকেশনটি একটি ব্যাকগ্রাউন্ড অবস্থা থেকে খোলা হয়।

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

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

class _Application extends State<Application> {
  // It is assumed that all messages contain a data field with the key 'type'
  Future<void> 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 via 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 ব্যবহার করে একটি মৌলিক চিত্র দেখায়।

বার্তা স্থানীয়করণ

আপনি দুটি ভিন্ন উপায়ে স্থানীয় স্ট্রিং পাঠাতে পারেন:

  • আপনার সার্ভারে আপনার প্রতিটি ব্যবহারকারীর পছন্দের ভাষা সংরক্ষণ করুন এবং প্রতিটি ভাষার জন্য কাস্টমাইজড বিজ্ঞপ্তি পাঠান
  • আপনার অ্যাপে স্থানীয়কৃত স্ট্রিং এম্বেড করুন এবং অপারেটিং সিস্টেমের স্থানীয় লোকেল সেটিংস ব্যবহার করুন

দ্বিতীয় পদ্ধতিটি কীভাবে ব্যবহার করবেন তা এখানে:

অ্যান্ড্রয়েড

  1. resources/values/strings.xml এ আপনার ডিফল্ট-ভাষা বার্তা নির্দিষ্ট করুন:

    <string name="notification_title">Hello world</string>
    <string name="notification_message">This is a message</string>
    
  2. values- language ডিরেক্টরিতে অনুবাদিত বার্তাগুলি নির্দিষ্ট করুন। উদাহরণস্বরূপ, resources/values-fr/strings.xml এ ফরাসি বার্তা নির্দিষ্ট করুন:

    <string name="notification_title">Bonjour le monde</string>
    <string name="notification_message">C'est un message</string>
    
  3. সার্ভার পেলোডে, title , message , এবং body কীগুলি ব্যবহার করার পরিবর্তে, আপনার স্থানীয় বার্তার জন্য title_loc_key এবং body_loc_key ব্যবহার করুন এবং আপনি যে বার্তাটি প্রদর্শন করতে চান তার name বৈশিষ্ট্যে সেগুলি সেট করুন৷

    বার্তা পেলোড এই মত দেখাবে:

    {
      "data": {
        "title_loc_key": "notification_title",
        "body_loc_key": "notification_message"
      },
    }
    

iOS

  1. Base.lproj/Localizable.strings এ আপনার ডিফল্ট-ভাষা বার্তা নির্দিষ্ট করুন:

    "NOTIFICATION_TITLE" = "Hello World";
    "NOTIFICATION_MESSAGE" = "This is a message";
    
  2. language .lproj ডিরেক্টরিতে অনুবাদিত বার্তাগুলি নির্দিষ্ট করুন। উদাহরণস্বরূপ, fr.lproj/Localizable.strings এ ফরাসি বার্তা উল্লেখ করুন:

    "NOTIFICATION_TITLE" = "Bonjour le monde";
    "NOTIFICATION_MESSAGE" = "C'est un message";
    

    বার্তা পেলোড এই মত দেখাবে:

    {
      "data": {
        "title_loc_key": "NOTIFICATION_TITLE",
        "body_loc_key": "NOTIFICATION_MESSAGE"
      },
    }
    

বার্তা বিতরণ ডেটা রপ্তানি সক্ষম করুন৷

আপনি আরও বিশ্লেষণের জন্য আপনার মেসেজ ডেটা BigQuery-এ এক্সপোর্ট করতে পারেন। BigQuery আপনাকে BigQuery SQL ব্যবহার করে ডেটা বিশ্লেষণ করতে, অন্য ক্লাউড প্রদানকারীর কাছে রপ্তানি করতে বা আপনার কাস্টম ML মডেলের জন্য ডেটা ব্যবহার করতে দেয়। BigQuery-এ রপ্তানি করা বার্তাগুলির জন্য সমস্ত উপলব্ধ ডেটা অন্তর্ভুক্ত করে, বার্তার ধরন নির্বিশেষে বা বার্তাটি API বা বিজ্ঞপ্তি কম্পোজারের মাধ্যমে পাঠানো হয়েছে কিনা।

রপ্তানি সক্ষম করতে, প্রথমে এখানে বর্ণিত পদক্ষেপগুলি অনুসরণ করুন, তারপর এই নির্দেশাবলী অনুসরণ করুন:

অ্যান্ড্রয়েড

আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন: dart await FirebaseMessaging.instance.setDeliveryMetricsExportToBigQuery(true);

iOS

iOS এর জন্য, আপনাকে নিম্নলিখিত বিষয়বস্তু সহ AppDelegate.m পরিবর্তন করতে হবে।

#import "AppDelegate.h"
#import "GeneratedPluginRegistrant.h"
#import <Firebase/Firebase.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [GeneratedPluginRegistrant registerWithRegistry:self];
  // Override point for customization after application launch.
  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  [[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:userInfo];
}

@end

ওয়েব

ওয়েবের জন্য, SDK-এর v9 সংস্করণ ব্যবহার করার জন্য আপনাকে আপনার পরিষেবা কর্মী পরিবর্তন করতে হবে। v9 সংস্করণটি বান্ডিল করা দরকার, তাই পরিষেবা কর্মীকে কাজ করার জন্য আপনাকে esbuild এর মতো একটি বান্ডলার ব্যবহার করতে হবে। এটি কীভাবে অর্জন করা যায় তা দেখতে উদাহরণ অ্যাপটি দেখুন।

একবার আপনি v9 SDK-এ স্থানান্তরিত হয়ে গেলে, আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

import {
  experimentalSetDeliveryMetricsExportedToBigQueryEnabled,
  getMessaging,
} from 'firebase/messaging/sw';

...

const messaging = getMessaging(app);
experimentalSetDeliveryMetricsExportedToBigQueryEnabled(messaging, true);

web ফোল্ডারে আপনার পরিষেবা কর্মীর নতুন সংস্করণ রপ্তানি করার জন্য yarn build চালাতে ভুলবেন না।