C++ ऐप्लिकेशन में Firebase Cloud Messaging का इस्तेमाल शुरू करना

प्लैटफ़ॉर्म चुनें: iOS+ Android वेब Flutter Unity C++


इस गाइड में, Firebase Cloud Messaging का इस्तेमाल शुरू करने का तरीका बताया गया है. इससे, भरोसेमंद तरीके से मैसेज भेजे जा सकते हैं.

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

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

Android

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

    • लिंक किए गए सेटअप के निर्देशों में, Firebase C++ SDK टूल का इस्तेमाल करने के लिए, डिवाइस और ऐप्लिकेशन की ज़रूरी शर्तें देखें. साथ ही, अपना ऐप्लिकेशन बनाने के लिए 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 देखें लेख पढ़ें.

iOS+

  1. अगर आपने पहले से ही C++ प्रोजेक्ट में Firebase नहीं जोड़ा है, तो उसे जोड़ें. इसके बाद, अपने प्रोजेक्ट को FCM के लिए सेट अप करने के लिए:
    1. अपने प्रोजेक्ट की Podfile में, एफ़सीएम की डिपेंडेंसी जोड़ें:
      pod 'FirebaseMessaging'
    2. Firebase C++ SDK टूल से, firebase.framework और firebase_messaging.framework फ़्रेमवर्क को अपने Xcode प्रोजेक्ट में खींचें और छोड़ें.
  2. APNs की पुष्टि करने वाली कुंजी को Firebase पर अपलोड करें. अगर आपके पास पहले से 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 क्लाउड से मैसेज भेजने की सुविधा (एफ़सीएम) को शुरू करें:

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

FCM रजिस्ट्रेशन टोकन को ऐक्सेस करना

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

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

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

अगर ऐप्लिकेशन बिलकुल भी नहीं चल रहा है और कोई उपयोगकर्ता किसी सूचना पर टैप करता है, तो डिफ़ॉल्ट रूप से मैसेज को FCM's बिल्ट-इन कॉलबैक के ज़रिए रूट नहीं किया जाता है. इस मामले में, मैसेज पेलोड, ऐप्लिकेशन शुरू करने के लिए इस्तेमाल किए गए Intent के ज़रिए मिलते हैं. इन आने वाले मैसेज को C++ लाइब्रेरी कॉलबैक पर फ़ॉरवर्ड कराने के लिए, आपको अपनी ऐक्टिविटी में तरीके को ओवरराइड करना होगा. साथ ही, को पर पास करना होगा.FCMonNewIntentIntentMessageForwardingService

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's डिफ़ॉल्ट 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 पर अपलोड करती है. अगर आपको टोकन का इस्तेमाल करने से पहले, साफ़ तौर पर ऑप्ट-इन करना है, तो कॉन्फ़िगरेशन के समय, एफ़सीएम (और 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

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

::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>

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

अगले चरण

सेटअप के चरण पूरे करने के बाद, C++ के लिए FCM का इस्तेमाल जारी रखने के कुछ विकल्प यहां दिए गए हैं: