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

डिवाइस की स्थिति के आधार पर, आने वाले संदेशों को अलग तरह से नियंत्रित किया जाता है। इन परिदृश्यों को समझने के लिए और 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. यह एक शीर्ष-स्तरीय फ़ंक्शन होना चाहिए (उदाहरण के लिए एक वर्ग विधि नहीं है जिसके लिए आरंभीकरण की आवश्यकता होती है)।
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>

अगला अपने फ़्लटर एप्लिकेशन को पुनरारंभ करें। कार्यकर्ता को पंजीकृत किया जाएगा और किसी भी पृष्ठभूमि संदेश को इस फ़ाइल के माध्यम से नियंत्रित किया जाएगा।