Flutter ऐप्लिकेशन में Firebase Cloud Messaging का इस्तेमाल शुरू करना

प्लैटफ़ॉर्म चुनें: iOS+ Android वेब Flutter Unity C++


इस गाइड में, Flutter क्लाइंट ऐप्लिकेशन में Firebase Cloud Messaging का इस्तेमाल शुरू करने का तरीका बताया गया है, ताकि आप भरोसेमंद तरीके से मैसेज भेज सकें.

जिस प्लैटफ़ॉर्म को टारगेट किया जा रहा है उसके हिसाब से, सेटअप के कुछ और ज़रूरी चरण हैं जिन्हें आपको पूरा करना होगा.

iOS+

मेथड स्विज़लिंग

Apple डिवाइसों पर FCM Flutter प्लगिन का इस्तेमाल करने के लिए, मेथड स्विज़लिंग ज़रूरी है. इसके बिना, Firebase की मुख्य सुविधाएं ठीक से काम नहीं करेंगी. जैसे, FCM रजिस्ट्रेशन को मैनेज करना.

Android

Google Play सेवाएं

FCM क्लाइंट को Android 7.0 या इसके बाद के वर्शन वाले ऐसे डिवाइसों की ज़रूरत होती है जिन पर Google Play services इंस्टॉल हो. इसके अलावा, Android 7.0 पर काम करने वाले ऐसे एम्युलेटर की भी ज़रूरत होती है जिन पर Google APIs मौजूद हों. ध्यान दें कि आपके पास Google Play Store के अलावा, अन्य प्लैटफ़ॉर्म से भी Android ऐप्लिकेशन डिप्लॉय करने का विकल्प होता है.

Play Services SDK टूल का इस्तेमाल करने वाले ऐप्लिकेशन को Google Play services की सुविधाओं को ऐक्सेस करने से पहले, हमेशा डिवाइस पर यह जांच करनी चाहिए कि Google Play services का APK, डिवाइस के साथ काम करता है या नहीं. हमारा सुझाव है कि ऐसा दो जगहों पर करें: मुख्य गतिविधि के onCreate() तरीके में और उसके onResume() तरीके में. onCreate() में की जाने वाली जांच से यह पक्का होता है कि जांच पूरी हुए बिना ऐप्लिकेशन का इस्तेमाल नहीं किया जा सकता. onResume() में मौजूद जांच से यह पक्का होता है कि अगर उपयोगकर्ता किसी अन्य तरीके से, जैसे कि 'वापस जाएं' बटन का इस्तेमाल करके, चल रहे ऐप्लिकेशन पर वापस आता है, तो भी जांच की जाती है.

अगर डिवाइस में Google Play services का ऐसा वर्शन मौजूद नहीं है जो आपके ऐप्लिकेशन के साथ काम करता हो, तो आपका ऐप्लिकेशन GoogleApiAvailability.makeGooglePlayServicesAvailable() को कॉल कर सकता है. इससे उपयोगकर्ता, Play Store से Google Play services को डाउनलोड कर पाएंगे.

वेब

FCM के साथ वेब क्रेडेंशियल कॉन्फ़िगर करना

FCM वेब इंटरफ़ेस, वेब क्रेडेंशियल का इस्तेमाल करता है. इन्हें वॉलंटरी ऐप्लिकेशन सर्वर आइडेंटिफ़िकेशन या "VAPID" कुंजियां कहा जाता है. इनका इस्तेमाल, वेब पुश की सुविधा देने वाली सेवाओं को अनुरोध भेजने की अनुमति देने के लिए किया जाता है. अपने ऐप्लिकेशन को पुश नोटिफ़िकेशन पाने के लिए रजिस्टर करने के लिए, आपको अपने Firebase प्रोजेक्ट से कुंजियों का एक जोड़ा जोड़ना होगा. Firebase कंसोल की मदद से, कुंजी का नया जोड़ा जनरेट किया जा सकता है या कुंजी का मौजूदा जोड़ा इंपोर्ट किया जा सकता है.

FCM प्लगिन इंस्टॉल करना

  1. अगर आपने अब तक Flutter के लिए Firebase प्लगिन इंस्टॉल और शुरू नहीं किए हैं, तो उन्हें इंस्टॉल और शुरू करें.

  2. प्लगिन इंस्टॉल करने के लिए, अपने Flutter प्रोजेक्ट के रूट से यह कमांड चलाएं:

    flutter pub add firebase_messaging
    
  3. यह प्रोसेस पूरी होने के बाद, अपने Flutter ऐप्लिकेशन को फिर से बनाएं:

    flutter run
    

सूचना की अनुमति का अनुरोध करें

किसी डिवाइस पर सूचना भेजने के लिए, आपको उस डिवाइस को FCM के साथ रजिस्टर करना होगा. इसके लिए, register() का इस्तेमाल करें. अगर सूचना की अनुमति नहीं दी गई है, तो यह तरीका उपयोगकर्ता से सूचना की अनुमति मांगेगा. ऐसा न होने पर, यह कार्रवाई पूरी होने पर onRegistered के ज़रिए एफ़आईडी डिलीवर करता है या किसी गड़बड़ी की वजह से फ़्यूचर को अस्वीकार कर देता है.

// 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 इंस्टॉलेशन आईडी (एफ़आईडी) का इस्तेमाल करके, FCM के साथ अपने ऐप्लिकेशन इंस्टेंस को रजिस्टर करने की सुविधा चालू करने के लिए, आपको सबसे पहले Android और Apple प्लैटफ़ॉर्म के लिए, अपने ऐप्लिकेशन के कॉन्फ़िगरेशन में एफ़आईडी चालू करने होंगे. वेब पर, स्टैटिक ऑप्ट-इन कॉन्फ़िगरेशन की ज़रूरत नहीं होती:

Android

अपने AndroidManifest.xml के <application> एलिमेंट में, यह <meta-data> एलिमेंट जोड़ें:

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

iOS+

FirebaseMessagingInstallationIdEnabled की को Info.plist में जोड़ें और उसे true (YES) पर सेट करें:

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

onRegistered स्ट्रीम की सदस्यता लेना

किसी डिवाइस पर मौजूद अपने ऐप्लिकेशन इंस्टेंस को मैसेज भेजने के लिए, आपको उस ऐप्लिकेशन इंस्टेंस के Firebase इंस्टॉलेशन आईडी (एफ़आईडी) की ज़रूरत होगी. यह आईडी, FCM के साथ रजिस्टर होने के बाद मिलता है. onRegistered स्ट्रीम के ज़रिए, एफ़आईडी को एसिंक्रोनस तरीके से डिलीवर किया जाता है.

Android और Apple प्लैटफ़ॉर्म पर, FCM अपने-आप शुरू होने की सुविधा चालू होने पर, स्टार्टअप के समय ऐप्लिकेशन इंस्टेंस को अपने-आप रजिस्टर कर देता है. यह सुविधा डिफ़ॉल्ट रूप से चालू होती है. हालांकि, register() को साफ़ तौर पर कॉल करना ज़रूरी है:

  • वेब पर. आपके पास vapidKey और serviceWorkerScriptPath को पास करने का विकल्प होता है.
  • Android और Apple प्लैटफ़ॉर्म पर, अगर अपने-आप शुरू होने की सुविधा बंद है या unregister() को कॉल करने के बाद. पहले से रजिस्टर किए गए एफ़आईडी के साथ onRegistered को ट्रिगर करने के लिए, किसी भी समय register() पर कॉल किया जा सकता है.

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 पर, Analytics कलेक्शन और FCM के अपने-आप शुरू होने की सुविधा को बंद करें. इसके लिए, आपको अपने AndroidManifest.xml में ये मेटाडेटा वैल्यू जोड़नी होंगी:

<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 console में, DevOps & Engagement > Messaging पर जाएं.

  4. कैंपेन बनाएं.

    • अगर यह आपका पहला मैसेज है, तो:

      1. अपना पहला कैंपेन बनाएं को चुनें.

      2. Firebase सूचना के मैसेज को चुनें. इसके बाद, बनाएं को चुनें.

    • अगर आपने पहले कैंपेन बनाए हैं, तो:

      1. कैंपेन टैब में, नया कैंपेन चुनें.

      2. सूचनाएं पर क्लिक करें.

  5. मैसेज का टेक्स्ट डालें.

  6. दाएं पैनल में जाकर, टेस्ट मैसेज भेजें को चुनें.

  7. Firebase इंस्टॉलेशन आईडी या FCM रजिस्ट्रेशन टोकन जोड़ें लेबल वाले फ़ील्ड में, रजिस्टर किया गया Firebase इंस्टॉलेशन आईडी या रजिस्ट्रेशन टोकन डालें.

  8. जांचें को चुनें.

जांच करें को चुनने के बाद, टारगेट किए गए क्लाइंट डिवाइस को सूचना मिलनी चाहिए. इसके लिए, ऐप्लिकेशन को बैकग्राउंड में चालू होना चाहिए.

आपके ऐप्लिकेशन पर मैसेज डिलीवर होने की जानकारी पाने के लिए, Firebase कंसोल में DevOps और जुड़ाव > मैसेज सेवा > रिपोर्ट डैशबोर्ड पर जाएं. यह डैशबोर्ड, Apple और Android डिवाइसों पर भेजे गए और खोले गए मैसेज की संख्या रिकॉर्ड करता है. साथ ही, Android ऐप्लिकेशन के लिए "इंप्रेशन" (उपयोगकर्ताओं को दिखने वाली सूचनाएं) का डेटा भी रिकॉर्ड करता है.

इंटरैक्शन को मैनेज करना

जब उपयोगकर्ता किसी सूचना पर टैप करते हैं, तो Android और iOS, दोनों पर डिफ़ॉल्ट रूप से ऐप्लिकेशन खुलता है. अगर ऐप्लिकेशन बंद है, तो उसे चालू किया जाएगा. अगर वह बैकग्राउंड में चल रहा है, तो उसे फ़ोरग्राउंड में लाया जाएगा.

सूचना के कॉन्टेंट के आधार पर, ऐप्लिकेशन खुलने पर उपयोगकर्ता के इंटरैक्शन को मैनेज किया जा सकता है. उदाहरण के लिए, अगर सूचना का इस्तेमाल करके कोई नया चैट मैसेज भेजा जाता है और उपयोगकर्ता उसे चुनता है, तो ऐप्लिकेशन खुलने पर आपको उस बातचीत को खोलना पड़ सकता है.

firebase-messaging पैकेज, इस इंटरैक्शन को मैनेज करने के दो तरीके उपलब्ध कराता है:

  1. getInitialMessage(): अगर ऐप्लिकेशन को बंद होने की स्थिति से खोला जाता है, तो यह तरीका Future दिखाता है, जिसमें RemoteMessage शामिल होता है. इस्तेमाल करने के बाद, RemoteMessage को हटा दिया जाएगा.
  2. onMessageOpenedApp: एकStream जो ऐप्लिकेशन को बैकग्राउंड से खोले जाने पर, 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 का इस्तेमाल करने के लिए, यहां कुछ विकल्प दिए गए हैं: