| প্ল্যাটফর্ম বেছে নিন: | iOS+ Android ওয়েব Flutter Unity C++ |
এই নির্দেশিকায় আপনার C++ ক্লায়েন্ট অ্যাপে Firebase Cloud Messaging কীভাবে ব্যবহার শুরু করবেন তা বর্ণনা করা হয়েছে, যাতে আপনি নির্ভরযোগ্যভাবে মেসেজ পাঠাতে পারেন।
C++-এর মাধ্যমে আপনার ক্রস-প্ল্যাটফর্ম Firebase Cloud Messaging ক্লায়েন্ট অ্যাপ লিখতে, Firebase Cloud Messaging API ব্যবহার করুন। C++ SDK, Android ও Apple, দুটি প্ল্যাটফর্মেই কাজ করে, তবে প্রতিটি প্ল্যাটফর্মের জন্য কিছু অতিরিক্ত সেট-আপ প্রয়োজন। iOS ও Android-এর জন্য C++ SDK কীভাবে FCM-এর সাথে কাজ করে সেই সম্পর্কে আরও জানতে, C++-এর জন্য Firebase সম্পর্কে জানুন দেখুন।
Firebase ও FCM SDK সেট-আপ করা
Android
আপনি আগে থেকে না করে থাকলে, আপনার C++ প্রোজেক্টে Firebase যোগ করুন।
লিঙ্ক করা সেট-আপ সংক্রান্ত নির্দেশাবলীতে, Firebase C++ SDK ব্যবহার করার জন্য ডিভাইস ও অ্যাপের প্রয়োজনীয়তা পর্যালোচনা করুন, এর মধ্যে আপনার অ্যাপ তৈরি করার জন্য CMake ব্যবহার করার সুপারিশ অন্তর্ভুক্ত।
আপনার প্রোজেক্ট-লেভেল
build.gradleফাইলে,buildscriptএবংallprojects, দুটি বিভাগেই Google-এর Maven রিপোজিটরি অন্তর্ভুক্ত করতে ভুলবেন না।
JNI এনভায়রনমেন্ট ও অ্যাক্টিভিটি পাস করে Firebase অ্যাপ অবজেক্ট তৈরি করুন:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
firebase::messaging::Listenerইন্টারফেস প্রয়োগ করে এমন একটি ক্লাসকে সংজ্ঞায়িত করুন।অ্যাপ ও তৈরি করা লিসনার সহ FCM ইনিশিয়ালাইজ করুন:
::firebase::messaging::Initialize(app, listener);
যেসব অ্যাপ Google Play পরিষেবা SDK-এর উপর নির্ভর করে, সেগুলিকে ফিচার অ্যাক্সেস করার আগে ডিভাইসে মানানসই Google Play পরিষেবা APK আছে কিনা তা চেক করে নিতে হবে। আরও জানতে, Google Play পরিষেবা APK চেক করুন লিঙ্কে যান।
iOS+
- আপনি আগে থেকে না করে থাকলে,
আপনার C++ প্রোজেক্টে Firebase যোগ করুন। তারপর,
FCM-এর জন্য আপনার প্রোজেক্ট সেট-আপ করতে:
- আপনার প্রোজেক্টের Podfile-এ, FCM ডিপেন্ডেন্সি যোগ করুন:
pod 'FirebaseMessaging'
- Firebase C++ SDK থেকে আপনার Xcode প্রোজেক্টে
firebase.frameworkএবংfirebase_messaging.frameworkফ্রেমওয়ার্ক ড্র্যাগ করুন।
- আপনার প্রোজেক্টের Podfile-এ, FCM ডিপেন্ডেন্সি যোগ করুন:
Firebase-এ আপনার APNs যাচাইকরণ কী আপলোড করুন। আপনার কাছে আগে থেকেই APNs যাচাইকরণ কী না থাকলে, নিশ্চিত করুন যে আপনি Apple Developer মেম্বার সেন্টারে একটি তৈরি করেছেন।
-
Firebase কনসোলে গিয়ে
সেটিংস > সাধারণ বিকল্পে যান। তারপর, ক্লাউড মেসেজিং ট্যাব বিকল্পে ক্লিক করুন। - iOS অ্যাপ কনফিগারেশন-এর মধ্যে APNs যাচাইকরণ কী বিকল্পে গিয়ে, আপনার ডেভেলপমেন্ট যাচাইকরণ কী অথবা প্রোডাকশন যাচাইকরণ কী অথবা দু'টিই আপলোড করতে আপলোড করুন বিকল্পে ক্লিক করুন। অন্তত একটি প্রয়োজন।
- আপনি যেখানে কী সেভ করেছেন সেই লোকেশনে ব্রাউজ করুন, এটি বেছে নিন এবং খুলুন বিকল্পে ক্লিক করুন। কী-এর জন্য কী আইডি যোগ করুন (এটি Apple Developer Member Center-এ উপলভ্য) এবং আপলোড করুন বিকল্পে ক্লিক করুন।
-
Firebase কনসোলে গিয়ে
পুশ বিজ্ঞপ্তি চালু করতে আপনার Xcode প্রোজেক্ট কনফিগার করুন:
- নেভিগেটর এরিয়া থেকে প্রোজেক্ট বেছে নিন।
- এডিটর এরিয়া থেকে প্রোজেক্ট টার্গেট বেছে নিন।
এডিটর এরিয়া থেকে সাধারণ ট্যাব বেছে নিন।
- স্ক্রল করে লিঙ্ক করা ফ্রেমওয়ার্ক ও লাইব্রেরি বিকল্পে যান, তারপর ফ্রেমওয়ার্ক যোগ করতে + বোতামে ক্লিক করুন।
যে উইন্ডোটি দেখা যাবে, সেটিতে স্ক্রল করে UserNotifications.framework-এ যান, এন্ট্রিটিতে ক্লিক করুন, তারপর যোগ করুন বিকল্পে ক্লিক করুন।
এই ফ্রেমওয়ার্ক শুধুমাত্র Xcode v8 ও তার পরের যেকোনও ভার্সনে দেখা যায় এবং এই লাইব্রেরির জন্য এটি প্রয়োজনীয়।
এডিটর এরিয়া থেকে ক্ষমতা ট্যাব বেছে নিন।
- পুশ বিজ্ঞপ্তি বিকল্পটি পরিবর্তন করে চালু করুন হিসেবে সেট করুন।
- স্ক্রল করে ব্যাকগ্রাউন্ড মোড বিকল্পে যান, তারপর এটি চালু করুন বিকল্পে পরিবর্তন করুন।
- ব্যাকগ্রাউন্ড মোড বিকল্পের মধ্যে রিমোট বিজ্ঞপ্তি বিকল্প বেছে নিন।
Firebase অ্যাপ অবজেক্ট তৈরি করুন:
app = ::firebase::App::Create(::firebase::AppOptions());
firebase::messaging::Listenerইন্টারফেস প্রয়োগ করে এমন একটি ক্লাসকে সংজ্ঞায়িত করুন।অ্যাপ ও তৈরি করা লিসনার পাস করে Firebase Cloud Messaging ইনিশিয়ালাইজ করুন:
::firebase::messaging::Initialize(app, listener);
Firebase ইনস্টলেশন আইডি অ্যাক্সেস করা
Firebase ইনস্টলেশন আইডি ব্যবহার করে রেজিস্ট্রেশন চালু করা
Firebase ইনস্টলেশন আইডি (FID) ব্যবহার করে FCM-এর সাথে আপনার অ্যাপ ইনস্ট্যান্স রেজিস্টার করার সুবিধা চালু করতে, আপনাকে প্রথমে Android এবং Apple প্ল্যাটফর্ম, দু'টির জন্যই আপনার অ্যাপের কনফিগারেশনে FID চালু করতে হবে:
Android
আপনার AndroidManifest.xml-এর <application> এলিমেন্টের মধ্যে নিম্নলিখিত <meta-data> এলিমেন্ট যোগ করুন:
<meta-data android:name="firebase_messaging_installation_id_enabled" android:value="true" />
Swift
আপনার Info.plist-এ FirebaseMessagingInstallationIdEnabled কী যোগ করুন এবং এটি YES হিসেবে সেট করুন:
FirebaseMessagingInstallationIdEnabled = YES
onRegistrationReceived Listener প্রয়োগ করুন
Firebase Cloud Messaging লাইব্রেরি ইনিশিয়ালাইজ করার সময়, এটি Firebase ইনস্টলেশন আইডি
(FID) ব্যবহার করে মেসেজ পাওয়ার জন্য ক্লায়েন্ট
অ্যাপ ইনস্ট্যান্স রেজিস্টার করে। অ্যাপটি OnRegistrationReceived কলব্যাক সহ FID পাবে, যা আপনার
firebase::messaging::Listener ইমপ্লিমেন্টেশনে
সংজ্ঞায়িত করা উচিত:
class MyListener : public firebase::messaging::Listener { public: void OnRegistrationReceived(const char* installation_id) override { LogMessage("Received Firebase Installation ID: %s", installation_id); // TODO: Send the Firebase Installation ID (FID) to your app server to // target this device for messages. } };
আপনি যদি সেই নির্দিষ্ট অ্যাপ ইনস্ট্যান্সকে টার্গেট করতে চান, তাহলে আপনার অ্যাপ সার্ভারে FID পাঠান এবং আপনার পছন্দের পদ্ধতি ব্যবহার করে এটি স্টোর করুন।
অটোমেটিক ইনিশিয়ালাইজেশন বন্ধ করা থাকলে ম্যানুয়ালি রেজিস্টার করা
এছাড়াও, আপনি রানটাইমে FCM ব্যবহার করে ম্যানুয়ালি রেজিস্ট্রেশন ট্রিগার করতে পারবেন
Register():
// Manually register with FCM firebase::Future<void> register_future = firebase::messaging::Register(); register_future.OnCompletion([](const firebase::Future<void>& future) { if (future.status() == firebase::kFutureStatusComplete && future.error() == 0) { // Note: The registered Firebase Installation ID is delivered to the // OnRegistrationReceived callback. LogMessage("Registered with FCM"); } });
FCM রেজিস্ট্রেশন টোকেন (সচল নয়) অ্যাক্সেস করা
Firebase Cloud Messaging লাইব্রেরি ইনিশিয়ালাইজ করার পরে, ক্লায়েন্ট অ্যাপ ইনস্ট্যান্সের জন্য একটি রেজিস্ট্রেশন টোকেন
অনুরোধ করা হয়। অ্যাপটি
OnTokenReceived কলব্যাক সহ টোকেন পাবে, যা
firebase::messaging::Listener প্রয়োগকারী ক্লাসে সংজ্ঞায়িত করা উচিত।
আপনি যদি সেই নির্দিষ্ট অ্যাপ ইনস্ট্যান্সকে টার্গেট করতে চান, তাহলে এই টোকেনে আপনার অ্যাক্সেস থাকতে হবে।
Android-এ মেসেজ ডেলিভারি সংক্রান্ত তথ্য
অ্যাপ একেবারেই না চললে এবং কোনও ব্যবহারকারী বিজ্ঞপ্তিতে ট্যাপ করলে,
মেসেজটি ডিফল্ট হিসেবে FCM-এর বিল্ট-ইন
কলব্যাকের মাধ্যমে রাউট করা হয় না। এই ক্ষেত্রে, Intent
ব্যবহার করে অ্যাপ্লিকেশন শুরু করার মাধ্যমে মেসেজ পেলোড পাওয়া যায়। C++ লাইব্রেরি কলব্যাকে 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 হল জাভা ক্লাস যা অ্যাপে আসা মেসেজ ইন্টারসেপ্ট করে
এবং সেগুলি 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-এ
আইডেন্টিফায়ার ও কনফিগারেশন ডেটা আপলোড করে। টোকেন ব্যবহার করার আগে আপনি যদি স্পষ্ট
সম্মতি পেতে চান, তাহলে কনফিগার করার সময় 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::SetRegistrationOnInitEnabled(true);
একবার সেট করা হয়ে গেলে, অ্যাপ রিস্টার্ট করা হলেও এই ভ্যালু থেকে যায়।
Android-এ ডিপ লিঙ্ক সহ মেসেজ
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-এর সাথে এগিয়ে যাওয়ার কয়েকটি বিকল্প এখানে দেওয়া হল: