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. JNI एनवायरमेंट और ऐक्टिविटी को पास करके, 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 पर अपलोड करें. अगर आपके पास पहले से एपीएन की पुष्टि करने वाली कुंजी नहीं है, तो पक्का करें कि आपने Apple Developer सदस्य केंद्र.

    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 Cloud Messaging लाइब्रेरी को शुरू करने पर, क्लाइंट ऐप्लिकेशन इंस्टेंस के लिए रजिस्ट्रेशन टोकन का अनुरोध किया जाता है. ऐप्लिकेशन को OnTokenReceived कॉलबैक के साथ टोकन मिलेगा. इसे firebase::messaging::Listener को लागू करने वाली क्लास में तय किया जाना चाहिए.

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

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

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

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

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