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

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

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

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

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

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

  2. JNI एनवायरमेंट और गतिविधि को पास करके, 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 की जांच करना लेख पढ़ें.

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

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

    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 क्लाउड से मैसेज भेजने की सुविधा शुरू करें:

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

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

Firebase Cloud Messaging लाइब्रेरी को शुरू करने पर, क्लाइंट ऐप्लिकेशन इंस्टेंस के लिए रजिस्ट्रेशन टोकन का अनुरोध किया जाता है. ऐप्लिकेशन को 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 में मेटाडेटा वैल्यू जोड़ें:

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

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

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