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

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

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

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

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

संदेश प्राप्त करने की अनुमति का अनुरोध करें

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

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

आरंभ करने के लिए, अपने एप्लिकेशन से विधि को कॉल करें (आईओएस पर एक मूल मोडल प्रदर्शित किया जाएगा, वेब पर ब्राउज़र का मूल एपीआई प्रवाह ट्रिगर किया जाएगा):

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 पर अन्य गुण यह दर्शाते हैं कि कोई विशिष्ट अनुमति सक्षम है, अक्षम है या वर्तमान डिवाइस पर समर्थित नहीं है।

एक बार अनुमति मिल जाने और विभिन्न प्रकार की डिवाइस स्थिति को समझ लेने के बाद, आपका एप्लिकेशन अब आने वाले एफसीएम पेलोड को संभालना शुरू कर सकता है।

संदेश प्रबंधन

आपके एप्लिकेशन की वर्तमान स्थिति के आधार पर, विभिन्न संदेश प्रकारों के आने वाले पेलोड को संभालने के लिए अलग-अलग कार्यान्वयन की आवश्यकता होती है:

अग्रभूमि संदेश

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

अग्रभूमि और अधिसूचना संदेश

एप्लिकेशन के अग्रभूमि में होने पर आने वाले अधिसूचना संदेश एंड्रॉइड और आईओएस दोनों पर डिफ़ॉल्ट रूप से दृश्यमान अधिसूचना प्रदर्शित नहीं करेंगे। हालाँकि, इस व्यवहार को ओवरराइड करना संभव है:

  • एंड्रॉइड पर, आपको एक "उच्च प्राथमिकता" अधिसूचना चैनल बनाना होगा।
  • iOS पर, आप एप्लिकेशन के लिए प्रेजेंटेशन विकल्प अपडेट कर सकते हैं.

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

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

Apple प्लेटफ़ॉर्म और Android

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

आपके पृष्ठभूमि संदेश हैंडलर के बारे में ध्यान रखने योग्य कुछ बातें हैं:

  1. यह एक अनाम फ़ंक्शन नहीं होना चाहिए.
  2. यह एक शीर्ष-स्तरीय फ़ंक्शन होना चाहिए (उदाहरण के लिए कोई क्लास विधि नहीं जिसके लिए आरंभीकरण की आवश्यकता होती है)।
  3. फ़्लटर संस्करण 3.3.0 या उच्चतर का उपयोग करते समय, संदेश हैंडलर को फ़ंक्शन घोषणा के ठीक ऊपर @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 सेकंड से अधिक समय तक चलते हैं, तो डिवाइस स्वचालित रूप से प्रक्रिया को समाप्त कर सकता है।

वेब

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

आरंभ करने के लिए, अपनी 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 पोस्ट करती है।

यह अनुशंसा की जाती है कि आपके उपयोगकर्ताओं के लिए एक सहज यूएक्स सुनिश्चित करने के लिए दोनों परिदृश्यों को संभाला जाए। नीचे दिया गया कोड उदाहरण बताता है कि इसे कैसे प्राप्त किया जा सकता है:

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

आप इंटरैक्शन को कैसे संभालते हैं यह आपके एप्लिकेशन सेटअप पर निर्भर करता है। उपरोक्त उदाहरण स्टेटफुलविजेट का उपयोग करके एक बुनियादी चित्रण दिखाता है।

संदेशों को स्थानीयकृत करें

आप स्थानीयकृत स्ट्रिंग्स को दो अलग-अलग तरीकों से भेज सकते हैं:

  • अपने प्रत्येक उपयोगकर्ता की पसंदीदा भाषा को अपने सर्वर में संग्रहीत करें और प्रत्येक भाषा के लिए अनुकूलित सूचनाएं भेजें
  • अपने ऐप में स्थानीयकृत स्ट्रिंग्स एम्बेड करें और ऑपरेटिंग सिस्टम की मूल लोकेल सेटिंग्स का उपयोग करें

यहां दूसरी विधि का उपयोग करने का तरीका बताया गया है:

एंड्रॉयड

  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 में निर्यात में संदेशों के लिए सभी उपलब्ध डेटा शामिल होता है, चाहे संदेश का प्रकार कुछ भी हो या संदेश एपीआई या नोटिफिकेशन कंपोजर के माध्यम से भेजा गया हो।

निर्यात को सक्षम करने के लिए, पहले यहां वर्णित चरणों का पालन करें, फिर इन निर्देशों का पालन करें:

एंड्रॉयड

आप निम्न कोड का उपयोग कर सकते हैं:

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

वेब

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

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

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

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

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

iOS पर सूचनाओं में चित्र प्रदर्शित करें

Apple उपकरणों पर, आने वाली FCM सूचनाओं को FCM पेलोड से छवियां प्रदर्शित करने के लिए, आपको एक अतिरिक्त अधिसूचना सेवा एक्सटेंशन जोड़ना होगा और इसका उपयोग करने के लिए अपने ऐप को कॉन्फ़िगर करना होगा।

यदि आप फायरबेस फोन प्रमाणीकरण का उपयोग कर रहे हैं, तो आपको फायरबेस ऑथेंटिक पॉड को अपने पॉडफाइल में जोड़ना होगा।

चरण 1 - एक अधिसूचना सेवा एक्सटेंशन जोड़ें

  1. Xcode में, फ़ाइल > नया > लक्ष्य... पर क्लिक करें
  2. एक मॉडल संभावित लक्ष्यों की एक सूची प्रस्तुत करेगा; अधिसूचना सेवा एक्सटेंशन का चयन करने के लिए नीचे स्क्रॉल करें या फ़िल्टर का उपयोग करें। अगला पर क्लिक करें ।
  3. एक उत्पाद का नाम जोड़ें (इस ट्यूटोरियल के साथ अनुसरण करने के लिए "इमेजनोटिफिकेशन" का उपयोग करें), भाषा को ऑब्जेक्टिव-सी पर सेट करें, और समाप्त पर क्लिक करें।
  4. सक्रिय करें पर क्लिक करके योजना को सक्षम करें।

चरण 2 - पॉडफ़ाइल में लक्ष्य जोड़ें

सुनिश्चित करें कि आपके नए एक्सटेंशन को पॉडफाइल में जोड़कर Firebase/Messaging पॉड तक पहुंच प्राप्त है:

  1. नेविगेटर से, पॉडफ़ाइल खोलें: पॉड्स > पॉडफ़ाइल

  2. फ़ाइल के नीचे तक स्क्रॉल करें और जोड़ें:

    target 'ImageNotification' do
      use_frameworks!
      pod 'Firebase/Auth' # Add this line if you are using FirebaseAuth phone authentication
      pod 'Firebase/Messaging'
    end
    
  3. ios या macos निर्देशिका से pod install उपयोग करके अपने पॉड इंस्टॉल या अपडेट करें।

चरण 3 - एक्सटेंशन हेल्पर का उपयोग करें

इस बिंदु पर, सब कुछ अभी भी सामान्य रूप से चलना चाहिए। अंतिम चरण एक्सटेंशन हेल्पर को लागू करना है।

  1. नेविगेटर से, अपना इमेजनोटिफिकेशन एक्सटेंशन चुनें

  2. NotificationService.m फ़ाइल खोलें।

  3. फ़ाइल के शीर्ष पर, जैसा कि नीचे दिखाया गया है, NotificationService.h ठीक बाद FirebaseMessaging.h आयात करें।

    NotificationService.m की सामग्री को इसके साथ बदलें:

    #import "NotificationService.h"
    #import "FirebaseMessaging.h"
    #import "FirebaseAuth.h" // Add this line if you are using FirebaseAuth phone authentication
    #import <UIKit/UIKit.h> // Add this line if you are using FirebaseAuth phone authentication
    
    @interface NotificationService ()
    
    @property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
    @property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
    
    @end
    
    @implementation NotificationService
    
    /* Uncomment this if you are using Firebase Auth
    - (BOOL)application:(UIApplication *)app
                openURL:(NSURL *)url
                options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
      if ([[FIRAuth auth] canHandleURL:url]) {
        return YES;
      }
      return NO;
    }
    
    - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
      for (UIOpenURLContext *urlContext in URLContexts) {
        [FIRAuth.auth canHandleURL:urlContext.URL];
      }
    }
    */
    
    - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
        self.contentHandler = contentHandler;
        self.bestAttemptContent = [request.content mutableCopy];
    
        // Modify the notification content here...
        [[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent withContentHandler:contentHandler];
    }
    
    - (void)serviceExtensionTimeWillExpire {
        // Called just before the extension will be terminated by the system.
        // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
        self.contentHandler(self.bestAttemptContent);
    }
    
    @end
    

चरण 4 - छवि को पेलोड में जोड़ें

अपने अधिसूचना पेलोड में, अब आप एक छवि जोड़ सकते हैं। भेजने का अनुरोध कैसे करें, इस पर iOS दस्तावेज़ देखें। ध्यान रखें कि डिवाइस द्वारा 300KB अधिकतम छवि आकार लागू किया जाता है।