欢迎参加我们将于 2022 年 10 月 18 日举办的 Firebase 峰会(线上线下同时进行),了解 Firebase 如何帮助您加快应用开发速度、满怀信心地发布应用并在之后需要时轻松地扩大应用规模。立即报名

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

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

फायरबेस और एफसीएम एसडीके सेट करें

एंड्रॉयड

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

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

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

  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 सेवाओं SDK पर भरोसा करने वाले ऐप्स को सुविधाओं तक पहुंचने से पहले डिवाइस को संगत Google Play सेवाओं APK के लिए जांचना चाहिए। अधिक जानने के लिए, Google Play सेवाओं की जांच करें APK देखें।

आईओएस+

  1. आपको एक मान्य APN प्रमाणपत्र की आवश्यकता है। यदि आपके पास पहले से एक नहीं है, तो Apple डेवलपर सदस्य केंद्र में एक बनाना सुनिश्चित करें।
  2. यदि आपने पहले से ऐसा नहीं किया है, तो अपने C++ प्रोजेक्ट में Firebase जोड़ें । फिर, FCM के लिए अपना प्रोजेक्ट सेट करने के लिए:
    1. अपने प्रोजेक्ट के पॉडफाइल में, FCM निर्भरता जोड़ें:
      pod 'FirebaseMessaging'
    2. firebase_messaging.framework firebase.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 विधि को ओवरराइड करना होगा और 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 सेवा जावा क्लास है जो ऐप पर भेजे गए आने वाले संदेशों को रोकता है और उन्हें सी ++ लाइब्रेरी में रूट करता है। जब ऐप अग्रभूमि में होता है (या जब ऐप पृष्ठभूमि होता है और इसे केवल डेटा पेलोड प्राप्त होता है), संदेश इस वर्ग पर प्रदान किए गए कॉलबैक में से एक के माध्यम से गुजरेंगे। संदेश प्रबंधन में कस्टम व्यवहार जोड़ने के लिए, आपको FCM की डिफ़ॉल्ट ListenerService सेवा का विस्तार करना होगा:

import com.google.firebase.messaging.cpp.ListenerService;

class MyListenerService extends ListenerService {

विधि ListenerService.onMessageReceived सेवा को ओवरराइड करके। 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>

फायरबेस सी ++ एसडीके (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 में मेटाडेटा मान जोड़ें:

एंड्रॉयड

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

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

अगले कदम

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

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

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