Catch up on highlights from Firebase at Google I/O 2023. Learn more

C++ के साथ एक फायरबेस क्लाउड मैसेजिंग क्लाइंट ऐप सेट करें

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

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

एंड्रॉयड

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

    • लिंक किए गए सेटअप निर्देशों में, Firebase C++ SDK का उपयोग करने के लिए डिवाइस और ऐप की आवश्यकताओं की समीक्षा करें, जिसमें आपके ऐप को बनाने के लिए CMake का उपयोग करने की सिफारिश भी शामिल है।

    • अपनी प्रोजेक्ट-स्तरीय build.gradle फ़ाइल में, अपने buildscript और allprojects अनुभागों में Google की मावेन रिपॉजिटरी को शामिल करना सुनिश्चित करें।

  2. जेएनआई पर्यावरण और गतिविधि में गुजरने वाला फायरबेस ऐप ऑब्जेक्ट बनाएं:

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

  3. एक वर्ग को परिभाषित करें जो firebase::messaging::Listener इंटरफ़ेस को लागू करता है।

  4. FCM को इनिशियलाइज़ करें, ऐप में पास करें और एक बिल्ट लिसनर:

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

  5. Google Play सेवाओं SDK पर भरोसा करने वाले ऐप्स को सुविधाओं तक पहुंचने से पहले संगत Google Play सेवाओं APK के लिए डिवाइस की जांच करनी चाहिए। अधिक जानने के लिए, Google Play सेवाओं के लिए जांचें APK देखें।

आईओएस+

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

    1. नेविगेटर क्षेत्र से परियोजना का चयन करें।
    2. संपादक क्षेत्र से परियोजना लक्ष्य का चयन करें।
    3. संपादक क्षेत्र से सामान्य टैब का चयन करें।

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

        यह ढांचा केवल Xcode v8 और बाद में दिखाई देता है और इस पुस्तकालय के लिए आवश्यक है।

    4. संपादक क्षेत्र से क्षमताएं टैब चुनें.

      1. पुश नोटिफ़िकेशन को चालू पर स्विच करें.
      2. पृष्ठभूमि मोड तक नीचे स्क्रॉल करें, फिर उसे चालू पर स्विच करें.
      3. पृष्ठभूमि मोड के अंतर्गत दूरस्थ सूचनाएं चुनें.
  4. एक फायरबेस ऐप ऑब्जेक्ट बनाएं:

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

  5. एक वर्ग को परिभाषित करें जो firebase::messaging::Listener इंटरफ़ेस को लागू करता है।

  6. फायरबेस क्लाउड मैसेजिंग को इनिशियलाइज़ करें, ऐप में पास करें और एक निर्मित श्रोता:

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

डिवाइस पंजीकरण टोकन तक पहुंचें

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

यदि आप उस विशिष्ट उपकरण को लक्षित करना चाहते हैं, तो आपको इस टोकन तक पहुंच की आवश्यकता होगी।

Android पर संदेश वितरण के बारे में ध्यान दें

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

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);
  }
}

ऐप पृष्ठभूमि में होने पर प्राप्त संदेशों में सिस्टम ट्रे अधिसूचना को पॉप्युलेट करने के लिए उपयोग की जाने वाली अधिसूचना फ़ील्ड की सामग्री होती है, लेकिन उस अधिसूचना सामग्री को एफसीएम को सूचित नहीं किया जाएगा। यही है, Message::notification शून्य होगी।

सारांश:

ऐप राज्य अधिसूचना आंकड़े दोनों
अग्रभूमि OnMessageReceived OnMessageReceived OnMessageReceived
पृष्ठभूमि सिस्टम ट्रे OnMessageReceived अधिसूचना: सिस्टम ट्रे
डेटा: आशय के अतिरिक्त में।

Android पर कस्टम संदेश हैंडलिंग

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

ListenerService विधियों को ओवरराइड करें।

ListenerService जावा क्लास है जो ऐप पर भेजे गए आने वाले संदेशों को रोकता है और उन्हें सी ++ लाइब्रेरी में रूट करता है। जब ऐप अग्रभूमि में होता है (या जब ऐप पृष्ठभूमि होता है और इसे केवल-डेटा पेलोड प्राप्त होता है), संदेश इस वर्ग पर प्रदान किए गए कॉलबैक में से एक से होकर गुजरेगा। संदेश प्रबंधन में कस्टम व्यवहार जोड़ने के लिए, आपको 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 उपकरण लक्ष्यीकरण के लिए एक पंजीकरण टोकन बनाता है। जब एक टोकन उत्पन्न होता है, तो पुस्तकालय पहचानकर्ता और कॉन्फ़िगरेशन डेटा को फायरबेस पर अपलोड करता है। यदि आप टोकन का उपयोग करने से पहले एक स्पष्ट ऑप्ट-इन प्राप्त करना चाहते हैं, तो आप FCM (और एंड्रॉइड, एनालिटिक्स) को अक्षम करके पीढ़ी को कॉन्फ़िगर समय पर रोक सकते हैं। ऐसा करने के लिए, Apple प्लेटफॉर्म पर अपनी Info.plist (न कि आपकी GoogleService-Info.plist ) या Android पर अपने AndroidManifest.xml में एक मेटाडेटा मान जोड़ें:

एंड्रॉयड

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

जब उपयोगकर्ता आपके द्वारा निर्दिष्ट योजना और होस्ट के लिंक वाली अधिसूचना को टैप करते हैं, तो आपका ऐप लिंक को संभालने के लिए इस आशय फ़िल्टर के साथ गतिविधि शुरू करेगा।

अगले कदम

क्लाइंट ऐप सेट अप करने के बाद, आप फायरबेस के साथ डाउनस्ट्रीम और विषय संदेश भेजने के लिए तैयार हैं। अधिक जानने के लिए, क्विकस्टार्ट नमूने में प्रदर्शित इस कार्यक्षमता को देखें जिसे आप डाउनलोड, चला और समीक्षा कर सकते हैं।

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

ध्यान रखें कि इन सुविधाओं का उपयोग करने के लिए आपको सर्वर कार्यान्वयन की आवश्यकता होगी।