| প্ল্যাটফর্ম নির্বাচন করুন: | iOS+ অ্যান্ড্রয়েড ওয়েব ফ্লাটার ইউনিটি C++ |
এই নির্দেশিকায় বর্ণনা করা হয়েছে কীভাবে আপনার C++ ক্লায়েন্ট অ্যাপে Firebase Cloud Messaging ব্যবহার শুরু করবেন, যাতে আপনি নির্ভরযোগ্যভাবে বার্তা পাঠাতে পারেন।
C++ ব্যবহার করে আপনার ক্রস-প্ল্যাটফর্ম Firebase Cloud Messaging ক্লায়েন্ট অ্যাপ তৈরি করতে, Firebase Cloud Messaging এপিআই (API) ব্যবহার করুন। C++ এসডিকে (SDK) অ্যান্ড্রয়েড এবং অ্যাপল উভয় প্ল্যাটফর্মের জন্যই কাজ করে, তবে প্রতিটি প্ল্যাটফর্মের জন্য কিছু অতিরিক্ত সেটআপের প্রয়োজন হয়। আইওএস (iOS) এবং অ্যান্ড্রয়েডের (Android) জন্য C++ এসডিকে কীভাবে FCM সাথে কাজ করে সে সম্পর্কে আরও জানতে, "আন্ডারস্ট্যান্ড ফায়ারবেস ফর সি++" (Understand Firebase for C++) দেখুন।
Firebase এবং FCM SDK সেট আপ করুন
অ্যান্ড্রয়েড
যদি আগে থেকে না করে থাকেন, তাহলে আপনার C++ প্রজেক্টে Firebase যোগ করুন ।
সংযুক্ত সেটআপ নির্দেশাবলীতে, Firebase C++ SDK ব্যবহারের জন্য ডিভাইস এবং অ্যাপের প্রয়োজনীয়তাগুলো পর্যালোচনা করুন, যার মধ্যে আপনার অ্যাপ বিল্ড করার জন্য CMake ব্যবহারের সুপারিশও রয়েছে।
আপনার প্রোজেক্ট-স্তরের
build.gradleফাইলে,buildscriptএবংallprojectsউভয় সেকশনেই গুগলের মেভেন রিপোজিটরি অন্তর্ভুক্ত করা নিশ্চিত করুন।
JNI এনভায়রনমেন্ট এবং অ্যাক্টিভিটি পাস করে একটি Firebase App অবজেক্ট তৈরি করুন:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
এমন একটি ক্লাস সংজ্ঞায়িত করুন যা `
firebase::messaging::Listenerইন্টারফেসটি ইমপ্লিমেন্ট করে।App এবং একটি নির্মিত Listener পাস করে FCM শুরু করুন:
::firebase::messaging::Initialize(app, listener);
যেসব অ্যাপ Google Play services SDK-এর উপর নির্ভর করে, তাদের ফিচারগুলো ব্যবহার করার আগে ডিভাইসে একটি সামঞ্জস্যপূর্ণ Google Play services APK আছে কিনা তা পরীক্ষা করে দেখা উচিত। আরও জানতে, "Google Play services APK পরীক্ষা করুন" অংশটি দেখুন।
iOS+
- যদি আগে থেকে না করে থাকেন, তাহলে আপনার C++ প্রজেক্টে Firebase যোগ করুন । এরপর, FCM এর জন্য আপনার প্রজেক্ট সেট আপ করতে:
- আপনার প্রোজেক্টের Podfile-এ FCM ডিপেন্ডেন্সিটি যোগ করুন:
pod 'FirebaseMessaging'
- Firebase C++ SDK থেকে
firebase.frameworkএবংfirebase_messaging.frameworkফ্রেমওয়ার্ক দুটি আপনার Xcode প্রজেক্টে ড্র্যাগ করে আনুন।
- আপনার প্রোজেক্টের Podfile-এ FCM ডিপেন্ডেন্সিটি যোগ করুন:
আপনার APNs অথেন্টিকেশন কী Firebase-এ আপলোড করুন। যদি আপনার আগে থেকে কোনো APNs অথেন্টিকেশন কী না থাকে, তবে Apple Developer Member Center থেকে একটি তৈরি করে নিন।
আপনার প্রোজেক্টের ভিতরে Firebase কনসোলে, গিয়ার আইকনটি নির্বাচন করুন, প্রোজেক্ট সেটিংস নির্বাচন করুন এবং তারপরে ক্লাউড মেসেজিং ট্যাবটি নির্বাচন করুন।
iOS অ্যাপ কনফিগারেশনের অধীনে APNs অথেন্টিকেশন কী- তে, আপনার ডেভেলপমেন্ট অথেন্টিকেশন কী, অথবা প্রোডাকশন অথেন্টিকেশন কী, অথবা উভয়ই আপলোড করতে আপলোড বোতামে ক্লিক করুন। এর মধ্যে অন্তত একটি থাকা আবশ্যক।
যেখানে আপনি আপনার কী (key) সংরক্ষণ করেছেন সেই অবস্থানে যান, সেটি নির্বাচন করুন এবং 'Open'-এ ক্লিক করুন। কী-টির জন্য কী আইডি (যা Apple Developer Member Center- এ পাওয়া যাবে) যোগ করুন এবং 'Upload'-এ ক্লিক করুন।
পুশ নোটিফিকেশন চালু করতে আপনার Xcode প্রজেক্টটি কনফিগার করুন:
- নেভিগেটর এলাকা থেকে প্রকল্পটি নির্বাচন করুন।
- এডিটর এলাকা থেকে প্রজেক্টের লক্ষ্যবস্তু নির্বাচন করুন।
এডিটর এলাকা থেকে জেনারেল ট্যাবটি নির্বাচন করুন।
- ‘Linked Frameworks and Libraries’ পর্যন্ত স্ক্রোল করুন, তারপর ফ্রেমওয়ার্ক যোগ করতে + বোতামে ক্লিক করুন।
যে উইন্ডোটি প্রদর্শিত হবে, সেখানে স্ক্রল করে UserNotifications.framework পর্যন্ত যান, এন্ট্রিটিতে ক্লিক করুন, তারপর Add-এ ক্লিক করুন।
এই ফ্রেমওয়ার্কটি শুধুমাত্র Xcode v8 এবং তার পরবর্তী সংস্করণগুলোতে পাওয়া যায় এবং এই লাইব্রেরিটির জন্য এটি আবশ্যক।
এডিটর এলাকা থেকে ক্যাপাবিলিটিস ট্যাবটি নির্বাচন করুন।
- পুশ নোটিফিকেশন চালু করুন।
- ব্যাকগ্রাউন্ড মোড -এ স্ক্রোল করুন, তারপর এটিকে অন- এ পরিবর্তন করুন।
- ব্যাকগ্রাউন্ড মোড-এর অধীনে রিমোট নোটিফিকেশন নির্বাচন করুন।
একটি Firebase App অবজেক্ট তৈরি করুন:
app = ::firebase::App::Create(::firebase::AppOptions());
এমন একটি ক্লাস সংজ্ঞায়িত করুন যা `
firebase::messaging::Listenerইন্টারফেসটি ইমপ্লিমেন্ট করে।অ্যাপ এবং একটি নির্মিত লিসেনার পাস করে ফায়ারবেস ক্লাউড মেসেজিং শুরু করুন:
::firebase::messaging::Initialize(app, listener);
FCM রেজিস্ট্রেশন টোকেন অ্যাক্সেস করুন
Firebase Cloud Messaging লাইব্রেরিটি চালু করার সময়, ক্লায়েন্ট অ্যাপ ইনস্ট্যান্সের জন্য একটি রেজিস্ট্রেশন টোকেন অনুরোধ করা হয়। অ্যাপটি OnTokenReceived কলব্যাকের মাধ্যমে টোকেনটি পাবে, যা firebase::messaging::Listener ইমপ্লিমেন্ট করা ক্লাসে সংজ্ঞায়িত করা উচিত।
আপনি যদি ওই নির্দিষ্ট অ্যাপ ইনস্ট্যান্সটিকে টার্গেট করতে চান, তাহলে আপনার এই টোকেনটিতে অ্যাক্সেস প্রয়োজন হবে।
অ্যান্ড্রয়েডে বার্তা বিতরণ সম্পর্কে নোট
যখন অ্যাপটি একেবারেই চালু থাকে না এবং কোনো ব্যবহারকারী একটি নোটিফিকেশনে ট্যাপ করেন, তখন মেসেজটি ডিফল্টভাবে FCM এর বিল্ট-ইন কলব্যাকের মাধ্যমে রাউট করা হয় না। এই ক্ষেত্রে, অ্যাপ্লিকেশনটি চালু করার জন্য ব্যবহৃত একটি Intent মাধ্যমে মেসেজ পেলোডগুলো গ্রহণ করা হয়। FCM দিয়ে এই ইনকামিং মেসেজগুলো C++ লাইব্রেরি কলব্যাকে ফরোয়ার্ড করাতে হলে, আপনাকে আপনার Activity-তে 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 null থাকবে।
সারসংক্ষেপে:
| অ্যাপের অবস্থা | বিজ্ঞপ্তি | ডেটা | উভয় |
|---|---|---|---|
| সম্মুখভাগ | 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 মেথডটি ওভাররাইড করার মাধ্যমে, আপনি প্রাপ্ত 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-এর নতুন সংস্করণগুলো (৭.১.০ ও তার পরবর্তী সংস্করণগুলো) JobIntentService ব্যবহার করে, যার জন্য AndroidManifest.xml ফাইলে অতিরিক্ত পরিবর্তনের প্রয়োজন হয়।
<service android:name="com.google.firebase.messaging.MessageForwardingService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" > </service>
স্বয়ংক্রিয় প্রারম্ভিকীকরণ প্রতিরোধ করুন
FCM অ্যাপ ইনস্ট্যান্স টার্গেটিং-এর জন্য একটি রেজিস্ট্রেশন টোকেন তৈরি করে। যখন একটি টোকেন তৈরি হয়, লাইব্রেরিটি আইডেন্টিফায়ার এবং কনফিগারেশন ডেটা ফায়ারবেসে আপলোড করে। আপনি যদি টোকেন ব্যবহার করার আগে একটি সুস্পষ্ট অপ্ট-ইন পেতে চান, তাহলে কনফিগার করার সময় FCM (এবং অ্যান্ড্রয়েডে, অ্যানালিটিক্স) নিষ্ক্রিয় করে এর জেনারেশন প্রতিরোধ করতে পারেন। এটি করার জন্য, অ্যাপল প্ল্যাটফর্মে আপনার Info.plist এ (আপনার GoogleService-Info.plist নয়), অথবা অ্যান্ড্রয়েডে আপনার 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>
যখন ব্যবহারকারীরা আপনার নির্দিষ্ট করা স্কিম এবং হোস্টের লিঙ্ক সম্বলিত কোনো নোটিফিকেশনে ট্যাপ করেন, তখন আপনার অ্যাপ লিঙ্কটি পরিচালনা করার জন্য এই ইন্টেন্ট ফিল্টারসহ অ্যাক্টিভিটিটি চালু করবে।
পরবর্তী পদক্ষেপ
সেটআপ ধাপগুলো সম্পন্ন করার পর, FCM for C++ নিয়ে এগিয়ে যাওয়ার জন্য এখানে কয়েকটি বিকল্প দেওয়া হলো: