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

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

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

एंड्रॉयड

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

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

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

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

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

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

  4. एफसीएम को आरंभ करें, ऐप में गुजरें और एक निर्मित श्रोता:

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

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

आईओएस+

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

जब ऐप बिल्कुल भी नहीं चल रहा हो और उपयोगकर्ता अधिसूचना पर टैप करता है, तो संदेश, डिफ़ॉल्ट रूप से, एफसीएम के अंतर्निहित कॉलबैक के माध्यम से रूट नहीं किया जाता है। इस मामले में, संदेश पेलोड एप्लिकेशन को प्रारंभ करने के लिए उपयोग किए गए 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);
  }
}

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

सारांश:

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

एंड्रॉइड पर कस्टम संदेश प्रबंधन

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

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

ListenerService जावा क्लास है जो ऐप पर भेजे गए आने वाले संदेशों को इंटरसेप्ट करती है और उन्हें C++ लाइब्रेरी में रूट करती है। जब ऐप अग्रभूमि में होता है (या जब ऐप पृष्ठभूमि होता है और इसे केवल-डेटा पेलोड प्राप्त होता है), तो संदेश इस क्लास पर दिए गए कॉलबैक में से एक से गुजरेंगे। संदेश प्रबंधन में कस्टम व्यवहार जोड़ने के लिए, आपको FCM की डिफ़ॉल्ट ListenerService विस्तार करना होगा:

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

class MyListenerService extends ListenerService {

विधि ListenerService.onMessageReceived ओवरराइड करके, आप प्राप्त रिमोट मैसेज ऑब्जेक्ट के आधार पर क्रियाएं कर सकते हैं और संदेश डेटा प्राप्त कर सकते हैं:

@Override
public void onMessageReceived(RemoteMessage message) {
  Log.d(TAG, "A message has been received.");
  // Do additional logic...
  super.onMessageReceived(message);
}

ListenerService पास कुछ अन्य विधियाँ भी हैं जिनका उपयोग कम बार किया जाता है। इन्हें ओवरराइड भी किया जा सकता है, अधिक जानकारी के लिए FirebaseMessatingService संदर्भ देखें।

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

फायरबेस 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 डिवाइस लक्ष्यीकरण के लिए एक पंजीकरण टोकन उत्पन्न करता है। जब एक टोकन उत्पन्न होता है, तो लाइब्रेरी पहचानकर्ता और कॉन्फ़िगरेशन डेटा को फायरबेस पर अपलोड करती है। यदि आप टोकन का उपयोग करने से पहले एक स्पष्ट ऑप्ट-इन प्राप्त करना चाहते हैं, तो आप एफसीएम (और एंड्रॉइड, एनालिटिक्स पर) को अक्षम करके कॉन्फ़िगर समय पर पीढ़ी को रोक सकते हैं। ऐसा करने के लिए, 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

एफसीएम को पुनः सक्षम करने के लिए, आप रनटाइम कॉल कर सकते हैं:

::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);

एक बार सेट होने पर यह मान ऐप पुनरारंभ होने पर बना रहता है।

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

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

अगले कदम

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

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

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