ডকুমেন্টেশন

পুশ নোটিফিকেশন

অ্যাপ বন্ধ থাকা অবস্থাতেও সহায়তা কর্মীর উত্তর ও ক্যাম্পেইন পৌঁছে দিন, সরাসরি সঠিক কথোপকথনে নিয়ে যাওয়া ডিপ লিংকসহ। পুশ সাবসিস্টেম আপনার অ্যাপের হাতে; 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-র এটুকুই দরকার।

API দিয়ে ক্রেডেনশিয়াল সেট করা এবং ফিল্ডগুলোর পূর্ণ তালিকা রয়েছে আপনার SDK অ্যাক্সেসের সঙ্গে দেওয়া পুশ সেটআপ গাইডে।

পেলোডের ফরম্যাট#

পেলোড সবসময় মূল respondo কী-এর নিচে থাকে — এটি আছে কি না দেখেই SDK নিজের পুশকে অন্যদের থেকে আলাদা করে (iOS-এ userInfo-তে, Android-এ JSON স্ট্রিং হিসেবে data["respondo"]-তে)।

respondo পেলোডjson
{
  "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 ফেরত দেয় (সে ক্ষেত্রে আপনি নিজেই সেটি সামলান)।

ট্যাপ সামলানো (প্ল্যাটফর্ম অনুযায়ী)text
Android:  RespondoPushPayload.from(data)?.let { Respondo.handlePush(it) }
iOS:      Respondo.handlePush(userInfo: userInfo)
Flutter:  Respondo.handlePushData(message.data)

একই বার্তার নকল কপিগুলো message_id ধরে এক করে দেওয়া হয়, আর একই কথোপকথন সামনে খোলা থাকলে সিস্টেম নোটিফিকেশন দেখানো হয় না — দুটোই SDK নিজে থেকেই সামলায়।

ডিভাইস টোকেন নিবন্ধন#

আপনার অ্যাপ নিজের পুশ সাবসিস্টেম থেকে ডিভাইস টোকেন নেয় এবং সেটি setPushToken-এ পাঠায়। লগআউটের সময় clearPushToken কল করুন।

কোন টোকেন পাঠাবেন। backend প্রতিটি ডেলিভারি প্ল্যাটফর্ম অনুযায়ী রুট করে — iOS যায় সরাসরি APNs-এ, Android যায় FCM-এ — তাই আপনাকে সেই প্ল্যাটফর্মের নেটিভ ট্রান্সপোর্টের টোকেনই নিবন্ধন করতে হবে, আপনার পুশ লাইব্রেরি যা-ই ফেরত দিক না কেন:
  • Android — FirebaseMessaging.getToken() থেকে পাওয়া FCM রেজিস্ট্রেশন টোকেন।
  • iOS (নেটিভ) — didRegisterForRemoteNotificationsWithDeviceToken থেকে পাওয়া APNs ডিভাইস টোকেন (hex)।
  • Flutter দিয়ে iOS (firebase_messaging) — getAPNSToken() ব্যবহার করুন, getToken() নয়। iOS-এ FCM টোকেন পাঠালে সেটি APNs-এ চলে যায়, যেখানে ওটি বৈধ ডিভাইস টোকেন নয় এবং পুশ কখনও পৌঁছায় না। getAPNSToken() অ্যাপ চালুর প্রথম মুহূর্তগুলোতে null হতে পারে — তেমন হলে একটু পরে আবার চেষ্টা করুন।
Android — FirebaseMessagingServicekotlin
override fun onNewToken(token: String) {
    Respondo.setPushToken(token)
}
iOS — AppDelegateswift
func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
    let token = deviceToken.map { String(format: "%02x", $0) }.joined()
    Respondo.setPushToken(token)
}
Flutter — firebase_messagingdart
// 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);
}