获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

फ़्लटर ऐप में संदेश प्राप्त करें

डिवाइस की स्थिति के आधार पर, आने वाले संदेशों को अलग तरह से नियंत्रित किया जाता है। इन परिदृश्यों को समझने के लिए और FCM को अपने स्वयं के अनुप्रयोग में कैसे एकीकृत किया जाए, यह सबसे पहले उन विभिन्न राज्यों को स्थापित करना महत्वपूर्ण है जिनमें एक उपकरण हो सकता है:

राज्य विवरण
अग्रभूमि जब एप्लिकेशन खुला हो, देखने में और उपयोग में हो।
पार्श्वभूमि जब एप्लिकेशन खुला हो, लेकिन पृष्ठभूमि में (न्यूनतम)। यह आमतौर पर तब होता है जब उपयोगकर्ता ने डिवाइस पर "होम" बटन दबाया है, ऐप स्विचर का उपयोग करके किसी अन्य ऐप पर स्विच किया है, या एप्लिकेशन एक अलग टैब (वेब) में खुला है।
समाप्त जब डिवाइस लॉक हो या एप्लिकेशन नहीं चल रहा हो।

एफसीएम के माध्यम से संदेश पेलोड प्राप्त करने से पहले कुछ पूर्व शर्ते पूरी की जानी चाहिए:

  • आवेदन कम से कम एक बार खुला होना चाहिए (FCM के साथ पंजीकरण की अनुमति देने के लिए)।
  • IOS पर, यदि उपयोगकर्ता ऐप स्विचर से एप्लिकेशन को स्वाइप करता है, तो पृष्ठभूमि संदेशों को फिर से काम करना शुरू करने के लिए इसे मैन्युअल रूप से फिर से खोलना होगा।
  • एंड्रॉइड पर, यदि उपयोगकर्ता डिवाइस सेटिंग्स से ऐप को बलपूर्वक छोड़ देता है, तो संदेशों को काम करना शुरू करने के लिए इसे मैन्युअल रूप से फिर से खोलना होगा।
  • वेब पर, आपने अपने वेब पुश प्रमाणपत्र के साथ एक टोकन ( getToken() का उपयोग करके) का अनुरोध किया होगा।

संदेश प्राप्त करने की अनुमति का अनुरोध करें (Apple और वेब)

iOS, macOS और वेब पर, आपके डिवाइस पर FCM पेलोड प्राप्त होने से पहले, आपको पहले उपयोगकर्ता की अनुमति लेनी होगी।

firebase_messaging पैकेज अनुरोध अनुमति विधि के माध्यम से अनुमति का अनुरोध करने के लिए एक सरल एपीआई प्रदान requestPermission है। यह एपीआई कई नामित तर्कों को स्वीकार करता है जो आपके द्वारा अनुरोध की जाने वाली अनुमतियों के प्रकार को परिभाषित करते हैं, जैसे कि सूचना पेलोड वाले संदेश ध्वनि को ट्रिगर कर सकते हैं या सिरी के माध्यम से संदेशों को पढ़ सकते हैं। डिफ़ॉल्ट रूप से, विधि समझदार डिफ़ॉल्ट अनुमतियों का अनुरोध करती है। संदर्भ 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 पर, आप एप्लिकेशन के लिए प्रस्तुतीकरण विकल्पों को अपडेट कर सकते हैं।

पृष्ठभूमि संदेश

देशी (एंड्रॉइड और ऐप्पल) और वेब आधारित प्लेटफॉर्म पर पृष्ठभूमि संदेशों को संभालने की प्रक्रिया अलग है।

ऐप्पल प्लेटफॉर्म और एंड्रॉइड

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());
}

चूंकि हैंडलर आपके एप्लिकेशन संदर्भ के बाहर अपने स्वयं के अलगाव में चलता है, इसलिए एप्लिकेशन स्थिति को अपडेट करना या यूआई को प्रभावित करने वाले किसी भी तर्क को निष्पादित करना संभव नहीं है। हालाँकि, आप HTTP अनुरोध जैसे तर्क कर सकते हैं, IO संचालन कर सकते हैं (जैसे स्थानीय भंडारण को अपडेट करना), अन्य प्लगइन्स के साथ संवाद करना आदि।

अपने तर्क को जल्द से जल्द पूरा करने की भी सिफारिश की जाती है। लंबे समय तक चलने वाले, गहन कार्य डिवाइस के प्रदर्शन को प्रभावित करते हैं और ओएस को प्रक्रिया को समाप्त करने का कारण बन सकता है। यदि कार्य 30 सेकंड से अधिक समय तक चलते हैं, तो डिवाइस स्वचालित रूप से प्रक्रिया को समाप्त कर सकता है।

वेब

वेब पर, एक JavaScript सेवा कार्यकर्ता लिखें जो पृष्ठभूमि में चलता है। पृष्ठभूमि संदेशों को संभालने के लिए सेवा कार्यकर्ता का उपयोग करें।

आरंभ करने के लिए, अपनी 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);
});

फ़ाइल को ऐप और मैसेजिंग एसडीके दोनों को आयात करना चाहिए, फायरबेस को इनिशियलाइज़ करना चाहिए और 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"
      },
    }
    

आईओएस

  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 के लिए, आपको निम्न सामग्री के साथ 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

वेब

वेब के लिए, आपको एसडीके के v9 संस्करण का उपयोग करने के लिए अपने सेवा कार्यकर्ता को बदलना होगा। v9 संस्करण को बंडल करने की आवश्यकता है, इसलिए आपको सेवा कार्यकर्ता को काम करने के लिए उदाहरण के लिए esbuild जैसे बंडलर का उपयोग करने की आवश्यकता है। इसे कैसे प्राप्त किया जाए, यह देखने के लिए उदाहरण ऐप देखें।

एक बार जब आप v9 SDK में माइग्रेट हो जाते हैं, तो आप निम्न कोड का उपयोग कर सकते हैं:

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

...

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

अपने सेवा कार्यकर्ता के नए संस्करण को web फ़ोल्डर में निर्यात करने के लिए yarn build चलाना न भूलें।