পুশ নোটিফিকেশন
অ্যাপ বন্ধ থাকা অবস্থাতেও সহায়তা কর্মীর উত্তর ও ক্যাম্পেইন পৌঁছে দিন, সরাসরি সঠিক কথোপকথনে নিয়ে যাওয়া ডিপ লিংকসহ। পুশ সাবসিস্টেম আপনার অ্যাপের হাতে; SDK শুধু টোকেন নিবন্ধন করে আর কথোপকথন খোলে।
Respondo কী কী পাঠায়#
- বার্তার পুশ — ভিজিটর যে কথোপকথনের অংশ, সেখানে কোনো সহায়তা কর্মী বা AI-এর উত্তর।
- ক্যাম্পেইনের পুশ — বাইরের দিকে পাঠানো পুশ ক্যাম্পেইন, যা খোলার সংকেতও জানায়।
বার্তার পুশে সবসময় এই ধরনের একটি ডিপ লিংক থাকে: respondo://conversation/<id>। ক্যাম্পেইনের পুশে থাকে ক্যাম্পেইনে কনফিগার করা ডিপ লিংক — এটি ঐচ্ছিক, আর সেট করা না থাকলে পুশে কোনো ডিপ লিংক থাকে না।
Apple (APNs)#
iOS-এর পুশ সরাসরি APNs দিয়ে চলে — Firebase-এর উপর কোনো নির্ভরতা নেই। আপনার Apple Developer অ্যাকাউন্ট থেকে সংগ্রহ করুন:
- একটি APNs Auth Key (
.p8টোকেন কী)। - সেই কী-এর Key ID।
- আপনার Team ID।
- অ্যাপের bundle id।
Google (FCM)#
Android-এর পুশ যায় Firebase Cloud Messaging দিয়ে। আপনার Firebase প্রজেক্ট থেকে সংগ্রহ করুন:
- Cloud Messaging রোলসহ একটি service account JSON।
- Firebase project ID (Firebase কনসোল → Project settings) — ড্যাশবোর্ডের পুশ-ফর্মে service-account JSON-এর পাশে আলাদা ফিল্ড হিসেবে দিতে হয়।
- Android অ্যাপের package name, এবং অ্যাপটিকে একই Firebase প্রজেক্টের সঙ্গে যুক্ত করুন (
google-services.json)।
Respondo-তে কনফিগার করা#
ড্যাশবোর্ডে নিজের উইজেট চ্যানেলে APNs কী এবং project ID-সহ FCM service account যোগ করুন। দুই প্ল্যাটফর্মেই পাঠাতে Respondo-র এটুকুই দরকার।
পেলোডের ফরম্যাট#
পেলোড সবসময় মূল respondo কী-এর নিচে থাকে — এটি আছে কি না দেখেই SDK নিজের পুশকে অন্যদের থেকে আলাদা করে (iOS-এ userInfo-তে, Android-এ JSON স্ট্রিং হিসেবে data["respondo"]-তে)।
{
"respondo": {
"type": "message",
"conversation_id": "a1c4e7b2-5d38-4f6a-9e10-3b7c2d5f8a90",
"message_id": "e9a3c1f6-4b8d-4e0a-b5f3-1d7b2a4e9c63",
"deep_link": "respondo://conversation/a1c4e7b2-5d38-4f6a-9e10-3b7c2d5f8a90"
}
}সব মানই ফ্ল্যাট স্ট্রিং। নোটিফিকেশনের শিরোনাম ও বডি পৌঁছায় প্ল্যাটফর্মের নিজস্ব পরিবহনে — APNs-এ aps.alert আর FCM-এ message.notification — respondo অবজেক্টের ভেতরে নয়।
ক্যাম্পেইনের পুশে বাড়তি একটি delivery_id থাকে, যা খোলার সংকেত জানাতে ব্যবহৃত হয়, আর ক্যাম্পেইনের পুশ-ডেটা থেকে বাড়তি ফ্ল্যাট স্ট্রিং কী-ও বহন করতে পারে।
ট্যাপ ও ফোরগ্রাউন্ড সামলানো#
নোটিফিকেশনে ট্যাপ পড়লে কাঁচা পেলোডটি SDK-কে দিয়ে দিন। এটি পেলোড পড়ে সঠিক কথোপকথন খোলে, আর পুশটি Respondo-র না হলে false ফেরত দেয় (সে ক্ষেত্রে আপনি নিজেই সেটি সামলান)।
Android: RespondoPushPayload.from(data)?.let { Respondo.handlePush(it) }
iOS: Respondo.handlePush(userInfo: userInfo)
Flutter: Respondo.handlePushData(message.data)একই বার্তার নকল কপিগুলো message_id ধরে এক করে দেওয়া হয়, আর একই কথোপকথন সামনে খোলা থাকলে সিস্টেম নোটিফিকেশন দেখানো হয় না — দুটোই SDK নিজে থেকেই সামলায়।
ডিভাইস টোকেন নিবন্ধন#
আপনার অ্যাপ নিজের পুশ সাবসিস্টেম থেকে ডিভাইস টোকেন নেয় এবং সেটি setPushToken-এ পাঠায়। লগআউটের সময় clearPushToken কল করুন।
- Android —
FirebaseMessaging.getToken()থেকে পাওয়া FCM রেজিস্ট্রেশন টোকেন। - iOS (নেটিভ) —
didRegisterForRemoteNotificationsWithDeviceTokenথেকে পাওয়া APNs ডিভাইস টোকেন (hex)। - Flutter দিয়ে iOS (firebase_messaging) —
getAPNSToken()ব্যবহার করুন,getToken()নয়। iOS-এ FCM টোকেন পাঠালে সেটি APNs-এ চলে যায়, যেখানে ওটি বৈধ ডিভাইস টোকেন নয় এবং পুশ কখনও পৌঁছায় না।getAPNSToken()অ্যাপ চালুর প্রথম মুহূর্তগুলোতে null হতে পারে — তেমন হলে একটু পরে আবার চেষ্টা করুন।
override fun onNewToken(token: String) {
Respondo.setPushToken(token)
}func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
let token = deviceToken.map { String(format: "%02x", $0) }.joined()
Respondo.setPushToken(token)
}// iOS-এর দরকার APNs টোকেন; Android-এর দরকার FCM টোকেন।
final token = Platform.isIOS
? await FirebaseMessaging.instance.getAPNSToken()
: await FirebaseMessaging.instance.getToken();
if (token != null) Respondo.setPushToken(token);
// FCM নিজের রেজিস্ট্রেশন টোকেন বদলায়; Android-কে সিঙ্কে রাখুন।
if (!Platform.isIOS) {
FirebaseMessaging.instance.onTokenRefresh.listen(Respondo.setPushToken);
}