Android SDK
Kotlin اور Jetpack Compose پر بنا ہلکا پھلکا کلائنٹ، جو Respondo کا سپورٹ چیٹ آپ کی ایپ کے اوپر بوٹم شیٹ کی صورت کھولتا ہے۔
تقاضے#
minSdk24 (Android 7.0)، compileSdk 35۔- Kotlin 2.x اور Jetpack Compose (SDK اپنے ساتھ Compose UI لاتا ہے)۔
- JVM ٹارگٹ 17۔
SDK اپنی transitive ڈیپینڈنسیز (Coroutines، kotlinx.serialization، OkHttp، Coil، Compose) خود لے آتا ہے اور اپنے manifest میں INTERNET کی اجازت خود درج کرتا ہے — ہاتھ سے کچھ شامل کرنے کی ضرورت نہیں۔
انسٹالیشن#
لائبریری Maven Central پر ai.respondo:respondo-sdkکے نام سے شائع ہے۔ یقینی بنائیں کہ mavenCentral() آپ کی repositories میں موجود ہے (نئے Android پروجیکٹ میں یہ پہلے سے ہوتا ہے)، پھر coordinate کے ذریعے ڈیپینڈنسی شامل کریں۔
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
}
}dependencies {
implementation("ai.respondo:respondo-sdk:0.1.0")
}انیشیئلائزیشن#
ایک بار Respondo.init کال کریں، اپنے Compose ٹری میں ایک بار RespondoChatHost() لگائیں، اور چیٹ اپنے بٹن سے کھولیں۔
import ai.respondo.sdk.Respondo
import ai.respondo.sdk.RespondoConfig
import ai.respondo.sdk.ui.RespondoChatHost
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Respondo.init(
context = this,
config = RespondoConfig(
agentId = "<agent-uuid>", // ڈیش بورڈ سے
channelId = "<channel-uuid>", // اختیاری
// baseUrl نہیں دیا -> https://api.respondo.ai
),
)
setContent {
MaterialTheme {
Box(modifier = Modifier.fillMaxSize()) {
Button(onClick = { Respondo.open() }) { Text("Support") }
RespondoChatHost() // چیٹ کی حالت OPEN ہونے پر SDK شیٹ دکھاتا ہے
}
}
}
}
}تمام کالیں Respondo سنگلٹن سے گزرتی ہیں۔ یہ idempotent ہیں، کسی بھی تھریڈ سے محفوظ ہیں، اور init مکمل ہونے سے پہلے کی گئی کالیں بفر ہو کر بعد میں چلا دی جاتی ہیں۔
صارفین کی شناخت#
طے شدہ طور پر ہر وزیٹر گمنام ہوتا ہے۔ پہلی بار چلنے پر SDK ایک مستقل visitor_id بناتا ہے اور اسے مقامی اسٹوریج میں رکھتا ہے، تاکہ واپس آنے والے صارف کو اپنی گفتگو دوبارہ مل جائے۔ کوئی API کلید ایپ میں شامل کرنے کی ضرورت نہیں — ہر گفتگو کی حفاظت اُسی گفتگو کے لیے بنے سیشن ٹوکن سے ہوتی ہے، جسے backend جاری کرتا اور ہر پیغام پر آگے بڑھاتا رہتا ہے، اس لیے گمنام وزیٹر کو کبھی دوبارہ تصدیق نہیں کرانی پڑتی۔
آپ کا صارف سائن اِن ہو جائے تو identify کال کریں۔ اس سے اس کی اصل شناخت جُڑ جاتی ہے، چنانچہ اس کا تاریخچہ ڈیوائسز اور دوبارہ انسٹال کے باوجود اس کے ساتھ چلتا ہے، اور آپ کے ان باکس میں گفتگو کے ساتھ گمنام وزیٹر کے بجائے اس کا نام اور ای میل نظر آتا ہے۔
userHash ایک دستخط ہے جو آپ کا backend ایجنٹ کے identity_secret سے بناتا ہے — HMAC-SHA256(secret, userId) (یا userId نہ ہو تو ای میل)، جسے چھوٹے حروف والے hex میں انکوڈ کیا جاتا ہے۔ یہ سیکرٹ ثابت کرتا ہے کہ شناخت اصلی ہے، اس لیے اسے صرف آپ کے backend پر رہنا چاہیے اور ایپ کے ساتھ کبھی نہیں بھیجنا چاہیے۔ مکمل فارمولا اور سرور کی طرف کی مثالیں شناخت کی تصدیق والے صفحے پر دیکھیں۔
import ai.respondo.sdk.RespondoIdentity
// userHash آپ کے backend سے آتا ہے (userId پر HMAC-SHA256) —
// اسے کبھی ایپ کے اندر شمار نہ کریں۔
Respondo.identify(
RespondoIdentity(
userId = session.userId,
email = session.email,
name = session.fullName,
userHash = session.respondoUserHash,
),
)
// لاگ آؤٹ پر: پش ٹوکن ہٹائیں، سیشن منسوخ کریں، نیا گمنام وزیٹر شروع کریں۔
Respondo.clearPushToken()
Respondo.reset()ہیش موجود نہ ہو یا غلط ہو تو کوئی خطا نہیں پھینکی جاتی: backend خاموشی سے وزیٹر کو گمنام ہی رکھتا ہے، چیٹ چلتی رہتی ہے، اور آپ بس ڈیوائسز کے درمیان کا ربط کھو دیتے ہیں جب تک درست ہیش نہ دیا جائے۔ تصدیق صرف اُس وقت چلتی ہے جب ایجنٹ کا identity_secret مقرر ہو — ڈیویلپمنٹ کے دوران اسے خالی رہنے دیں، تب userId / ای میل جیسے ہیں ویسے قبول کر لیے جاتے ہیں۔
قابلِ مشاہدہ حالتیں اور کال بیکس#
حالت کو ری ایکٹو انداز میں StateFlow کے طور پر پڑھیں (Compose کے لیے بہترین) یا RespondoListener کے ذریعے امپریٹو انداز میں (ایپ آئیکن کے بیج کے لیے بہترین)۔
// ری ایکٹو: غیر پڑھے پیغامات کی گنتی بطور StateFlow۔
val unread by Respondo.unreadCount.collectAsState()
// امپریٹو: بیجز اور تجزیات کے لیے لسنر۔
Respondo.setListener(object : RespondoListener {
override fun onUnreadChanged(count: Int) { updateAppIconBadge(count) }
override fun onUrlRequested(url: String): Boolean = tryOpenInternally(url)
})اسکرین ٹریکنگ#
ہر نیویگیشن پر موجودہ اسکرین رپورٹ کریں تاکہ پیش قدمی والے ٹیزر اور صفحے کی سطح کی ٹارگٹنگ اس سے مطابقت کر سکیں۔ صاف کرنے کے لیے null بھیجیں؛ ہر تبدیلی پر نئی اسکرین کے لیے پیش قدمی والے ٹیزر کا دوبارہ جائزہ لیا جاتا ہے۔
Respondo.setCurrentScreen("pricing")اگلے مرحلے#
آف لائن حالت میں نمائندوں کے جوابات کے لیے پش نوٹیفکیشنز اور سائن اِن صارفین کے لیے شناخت کی تصدیق ترتیب دیں۔ پورا API، XML ہوسٹس کے لیے Fragment ریپر اور مسائل کا حل Android SDK کی ابتدائی گائیڈ میں شامل ہیں؛ SDK کے سورس GitHubپر کھلے ہیں۔