C++ के साथ Firebase क्लाउड से मैसेज वाला क्लाइंट ऐप्लिकेशन सेट अप करना

C++ के साथ क्रॉस-प्लैटफ़ॉर्म Firebase क्लाउड से मैसेज वाला क्लाइंट ऐप्लिकेशन लिखने के लिए, Firebase क्लाउड से मैसेज एपीआई का इस्तेमाल करें. C++ SDK टूल, Android और Apple, दोनों प्लैटफ़ॉर्म पर काम करता है. हालांकि, इसके लिए हर प्लैटफ़ॉर्म के लिए कुछ अतिरिक्त सेटअप की ज़रूरत होती है.

Firebase और FCM SDK टूल सेट अप करें

Android

  1. अगर आपने पहले से Firebase को नहीं जोड़ा है, तो अपने C++ प्रोजेक्ट में Firebase जोड़ें.

    • लिंक किए गए सेटअप निर्देशों में, Firebase C++ SDK टूल का इस्तेमाल करने के लिए डिवाइस और ऐप्लिकेशन से जुड़ी ज़रूरी शर्तें देखें. साथ ही, अपना ऐप्लिकेशन बनाने के लिए CMake का इस्तेमाल करने का सुझाव भी दें.

    • प्रोजेक्ट-लेवल की build.gradle फ़ाइल में, पक्का करें कि आपने buildscript और allprojects, दोनों सेक्शन में Google की Maven रिपॉज़िटरी को शामिल किया हो.

  2. एक Firebase ऐप्लिकेशन ऑब्जेक्ट बनाएं, जो जेएनआई एनवायरमेंट और ऐक्टिविटी में पास हो रहा हो:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. firebase::messaging::Listener इंटरफ़ेस लागू करने वाली क्लास तय करें.

  4. FCM को शुरू करें, ऐप्लिकेशन में पास किया जा रहा हो, और बनाया गया लिसनर:

    ::firebase::messaging::Initialize(app, listener);

  5. Google Play services SDK टूल का इस्तेमाल करने वाले ऐप्लिकेशन को सुविधाओं को ऐक्सेस करने से पहले, डिवाइस पर काम करने वाले Google Play services APK की जांच करनी चाहिए. ज़्यादा जानने के लिए, Google Play services APK देखें देखें.

iOS और उसके बाद के वर्शन

  1. आपके पास एक मान्य APNs सर्टिफ़िकेट होना चाहिए. अगर आपके पास पहले से कोई Google खाता नहीं है, तो Apple Developer Member Center में जाकर एक खाता बनाएं.
  2. अगर आपने पहले से Firebase को नहीं जोड़ा है, तो अपने C++ प्रोजेक्ट में Firebase जोड़ें. इसके बाद, FCM के लिए अपना प्रोजेक्ट सेट अप करने के लिए:
    1. अपने प्रोजेक्ट की Podfile में, FCM डिपेंडेंसी जोड़ें:
      pod 'FirebaseMessaging'
    2. Firebase C++ SDK टूल से अपने Xcode प्रोजेक्ट में firebase.framework और firebase_messaging.framework फ़्रेमवर्क खींचें और छोड़ें.
  3. पुश नोटिफ़िकेशन चालू करने के लिए, अपना Xcode प्रोजेक्ट कॉन्फ़िगर करें:

    1. नेविगेटर एरिया से प्रोजेक्ट चुनें.
    2. एडिटर एरिया से प्रोजेक्ट टारगेट चुनें.
    3. एडिटर एरिया से सामान्य टैब चुनें.

      1. नीचे की ओर स्क्रोल करके, लिंक किए गए फ़्रेमवर्क और लाइब्रेरी पर जाएं. इसके बाद, फ़्रेमवर्क जोड़ने के लिए + बटन पर क्लिक करें.
      2. इसके बाद दिखने वाली विंडो में, स्क्रोल करके UserNotifications.framework पर जाएं और फिर उस एंट्री पर क्लिक करें इसके बाद जोड़ें पर क्लिक करें.

        यह फ़्रेमवर्क सिर्फ़ Xcode v8 और इसके बाद के वर्शन में दिखता है और इस लाइब्रेरी के लिए इसकी ज़रूरत होती है.

    4. एडिटर एरिया से क्षमताएं टैब चुनें.

      1. पुश नोटिफ़िकेशन को चालू करें.
      2. नीचे बैकग्राउंड मोड पर स्क्रोल करें, फिर उसे चालू करें.
      3. बैकग्राउंड मोड में जाकर, रिमोट सूचनाएं चुनें.
  4. Firebase ऐप्लिकेशन ऑब्जेक्ट बनाएं:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. firebase::messaging::Listener इंटरफ़ेस लागू करने वाली क्लास तय करें.

  6. Firebase क्लाउड से मैसेज भेजने, ऐप्लिकेशन में पास करने, और बिल्ट-इन लिसनर को शुरू करने के लिए:

    ::firebase::messaging::Initialize(app, listener);

डिवाइस रजिस्ट्रेशन टोकन को ऐक्सेस करना

'Firebase क्लाउड से मैसेज' लाइब्रेरी शुरू करने पर, क्लाइंट ऐप्लिकेशन इंस्टेंस के लिए रजिस्ट्रेशन टोकन का अनुरोध किया जाता है. ऐप्लिकेशन को OnTokenReceived कॉलबैक वाला टोकन मिलेगा, जिसे firebase::messaging::Listener को लागू करने वाली क्लास में तय किया जाना चाहिए.

अगर आपको उस डिवाइस को टारगेट करना है, तो आपके पास इस टोकन का ऐक्सेस होना चाहिए.

Android पर मैसेज डिलीवरी के बारे में नोट

अगर ऐप्लिकेशन बिलकुल नहीं चल रहा हो और उपयोगकर्ता किसी सूचना पर टैप करता हो, तो मैसेज को डिफ़ॉल्ट रूप से FCM के पहले से मौजूद कॉलबैक से रूट नहीं किया जाता. इस मामले में, मैसेज पेलोड Intent से मिलते हैं. इसका इस्तेमाल ऐप्लिकेशन को शुरू करने के लिए किया जाता है. FCM इन इनकमिंग मैसेज को C++ लाइब्रेरी कॉलबैक पर फ़ॉरवर्ड करे, इसके लिए आपको अपनी गतिविधि में onNewIntent मेथड को बदलना होगा और Intent को MessageForwardingService को पास करना होगा.

import com.google.firebase.messaging.MessageForwardingService;

class MyActivity extends Activity {
  private static final String TAG = "MyActvity";

  @Override
  protected void onNewIntent(Intent intent) {
    Log.d(TAG, "A message was sent to this app while it was in the background.");
    Intent message = new Intent(this, MessageForwardingService.class);
    message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT);
    message.putExtras(intent);
    message.setData(intent.getData());
    // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`.
    // startService(message);
    MessageForwardingService.enqueueWork(this, message);
  }
}

ऐप्लिकेशन के बैकग्राउंड में चलने के दौरान मिलने वाले मैसेज में, सूचना फ़ील्ड का कॉन्टेंट होता है. इसका इस्तेमाल, सिस्टम ट्रे में सूचना पाने की सुविधा को पॉप्युलेट करने के लिए किया जाता है. हालांकि, FCM को सूचना वाले कॉन्टेंट के बारे में नहीं बताया जाएगा. इसका मतलब है कि Message::notification शून्य होगा.

संक्षेप में:

ऐप्लिकेशन की स्थिति सूचना डेटा दोनों
फ़ोरग्राउंड OnMessageReceived OnMessageReceived OnMessageReceived
बैकग्राउंड सिस्टम ट्रे OnMessageReceived सूचना: सिस्टम ट्रे
डेटा: इंटेंट की दूसरी चीज़ों में.

Android पर पसंद के मुताबिक मैसेज मैनेज करना

डिफ़ॉल्ट रूप से, ऐप्लिकेशन को भेजी गई सूचनाएं ::firebase::messaging::Listener::OnMessageReceived को भेजी जाती हैं. हालांकि, कुछ मामलों में ऐसा हो सकता है कि आप डिफ़ॉल्ट तरीके को बदलना चाहें. Android पर ऐसा करने के लिए, आपको ऐसी कस्टम क्लास लिखनी होंगी जो com.google.firebase.messaging.cpp.ListenerService का विस्तार करती हैं. साथ ही, अपने प्रोजेक्ट के AndroidManifest.xml को भी अपडेट करती हैं.

ListenerService के तरीके बदलें.

ListenerService एक Java क्लास है जो ऐप्लिकेशन पर भेजे गए मैसेज को इंटरसेप्ट करती है और उन्हें C++ लाइब्रेरी पर रूट करती है. जब ऐप्लिकेशन फ़ोरग्राउंड में हो (या जब ऐप्लिकेशन बैकग्राउंड में हो और उसे सिर्फ़-डेटा वाला पेलोड मिलता हो), तो मैसेज इस क्लास पर दिए गए कॉलबैक में से किसी एक से होकर गुज़रेंगे. मैसेज हैंडलिंग में पसंद के मुताबिक व्यवहार जोड़ने के लिए, आपको FCM के डिफ़ॉल्ट ListenerService को बढ़ाना होगा:

import com.google.firebase.messaging.cpp.ListenerService;

class MyListenerService extends ListenerService {

तरीके ListenerService.onMessageReceived को ओवरराइड करके, आप remoteMessage ऑब्जेक्ट के आधार पर कार्रवाइयां कर सकते हैं और मैसेज डेटा पा सकते हैं:

@Override
public void onMessageReceived(RemoteMessage message) {
  Log.d(TAG, "A message has been received.");
  // Do additional logic...
  super.onMessageReceived(message);
}

ListenerService में कुछ ऐसे अन्य तरीके भी हैं जिनका इस्तेमाल कम किया जाता है. इन्हें भी बदला जा सकता है. ज़्यादा जानकारी के लिए, FirebaseMessagingService का रेफ़रंस देखें.

@Override
public void onDeletedMessages() {
  Log.d(TAG, "Messages have been deleted on the server.");
  // Do additional logic...
  super.onDeletedMessages();
}

@Override
public void onMessageSent(String messageId) {
  Log.d(TAG, "An outgoing message has been sent.");
  // Do additional logic...
  super.onMessageSent(messageId);
}

@Override
public void onSendError(String messageId, Exception exception) {
  Log.d(TAG, "An outgoing message encountered an error.");
  // Do additional logic...
  super.onSendError(messageId, exception);
}

AndroidManifest.xml को अपडेट करें

कस्टम क्लास लिखने के बाद, उन्हें AndroidManifest.xml में शामिल करना ज़रूरी है. इसके बाद ही ये क्लास लागू होती हैं. यह पक्का करें कि मेनिफ़ेस्ट में <manifest> टैग में सही एट्रिब्यूट की जानकारी देकर, मर्ज करने वाले टूल शामिल हों. जैसे:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.messaging.cpp.samples"
    xmlns:tools="http://schemas.android.com/tools">

firebase_messaging_cpp.aar संग्रह में एक AndroidManifest.xml फ़ाइल होती है, जो FCM के डिफ़ॉल्ट ListenerService के बारे में बताती है. इस मेनिफ़ेस्ट को आम तौर पर, प्रोजेक्ट के हिसाब से बनाए गए मेनिफ़ेस्ट के साथ मर्ज किया जाता है, ताकि ListenerService चल सके. इस ListenerService को कुसम लिसनर सेवा से बदलना होगा. इसके लिए, डिफ़ॉल्ट ListenerService को हटाकर और कस्टम सेवा को जोड़कर ऐसा किया जा सकता है. कस्टम सेवा को, आपके प्रोजेक्ट AndroidManifest.xml फ़ाइल की इन लाइनों की मदद से पूरा किया जा सकता है:

<service android:name="com.google.firebase.messaging.cpp.ListenerService"
         tools:node="remove" />
<service android:name="com.google.firebase.messaging.cpp.samples.MyListenerService"
         android:exported="false">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT"/>
  </intent-filter>
</service>

Firebase C++ SDK टूल (7.1.0 और उसके बाद के वर्शन) के नए वर्शन में JobIntentService का इस्तेमाल किया जाता है. इसके लिए, AndroidManifest.xml फ़ाइल में कुछ और बदलाव करने की ज़रूरत होती है.

<service android:name="com.google.firebase.messaging.MessageForwardingService"
     android:permission="android.permission.BIND_JOB_SERVICE"
     android:exported="false" >
</service>

अपने-आप शुरू होने से रोकें

FCM, डिवाइस टारगेटिंग के लिए रजिस्ट्रेशन टोकन जनरेट करता है. जब कोई टोकन जनरेट होता है, तब लाइब्रेरी, Firebase में आइडेंटिफ़ायर और कॉन्फ़िगरेशन डेटा अपलोड करती है. अगर आपको टोकन का इस्तेमाल करने से पहले साफ़ तौर पर ऑप्ट-इन करना है, तो FCM (और Android, Analytics) को बंद करके, कॉन्फ़िगर के समय जनरेट होने से रोका जा सकता है. ऐसा करने के लिए, Apple प्लैटफ़ॉर्म पर अपने Info.plist (आपके GoogleService-Info.plist पर नहीं) या Android पर अपने AndroidManifest.xml में मेटाडेटा वैल्यू जोड़ें:

Android

<?xml version="1.0" encoding="utf-8"?>
<application>
  <meta-data android:name="firebase_messaging_auto_init_enabled"
             android:value="false" />
  <meta-data android:name="firebase_analytics_collection_enabled"
             android:value="false" />
</application>

Swift

FirebaseMessagingAutoInitEnabled = NO

FCM को फिर से चालू करने के लिए, रनटाइम कॉल किया जा सकता है:

::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);

यह वैल्यू सेट होने के बाद ऐप्लिकेशन के रीस्टार्ट होने पर भी बनी रहती है.

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

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/>
</intent-filter>

इंटेंट फ़िल्टर को ज़्यादा सुविधाजनक बनाने के लिए, वाइल्डकार्ड की जानकारी भी दी जा सकती है. उदाहरण के लिए:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="*.example.com" android:scheme="http"/>
  <data android:host="*.example.com" android:scheme="https"/>
</intent-filter>

जब लोग आपकी तय की गई स्कीम और होस्ट के लिंक वाली सूचना पर टैप करेंगे, तब आपका ऐप्लिकेशन लिंक को हैंडल करने के लिए, इस इंटेंट फ़िल्टर के साथ गतिविधि शुरू करेगा.

अगले चरण

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

अन्य, बेहतर तरीके से काम करने के लिए, ऐप्लिकेशन सर्वर से मैसेज भेजने की गाइड देखें:

ध्यान रखें कि इन सुविधाओं का इस्तेमाल करने के लिए, आपको सर्वर लागू करना होगा.