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

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

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

Android

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

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

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

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

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

  3. ऐसी क्लास तय करें जो firebase::messaging::Listener इंटरफ़ेस को लागू करती हो.

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

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

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

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

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

    1. Firebase कंसोल में अपने प्रोजेक्ट में, गियर आइकॉन चुनें. इसके बाद, प्रोजेक्ट सेटिंग चुनें और फिर क्लाउड मैसेजिंग टैब चुनें.

    2. iOS ऐप्लिकेशन कॉन्फ़िगरेशन में जाकर, APNs की पुष्टि करने वाली कुंजी में, अपलोड करें बटन पर क्लिक करें.

    3. उस जगह पर ब्राउज़ करें जहां आपने अपनी पासकोड सेव किया है. इसके बाद, उसे चुनें और खोलें पर क्लिक करें. पासकोड के लिए पासकोड आईडी जोड़ें. यह आईडी, Apple Developer Member Center में उपलब्ध होता है. इसके बाद, अपलोड करें पर क्लिक करें.

  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 Cloud Messaging को शुरू करने के लिए, ऐप्लिकेशन और बनाया गया Listener पास करें:

    ::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 की मदद से डाउनस्ट्रीम और विषय के हिसाब से मैसेज भेजे जा सकते हैं. ज़्यादा जानने के लिए, क्विकस्टार्ट सैंपल में दी गई यह सुविधा देखें. इसे डाउनलोड किया जा सकता है, चलाया जा सकता है, और इसकी समीक्षा की जा सकती है.

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

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