Flutter SDK
Respondo کے سپورٹ چیٹ کے لیے خالص Dart میں لکھا ہوا کلائنٹ — کوئی نیٹو پلیٹ فارم کوڈ نہ کمپائل کرنا ہے، نہ ڈی بگ۔
تقاضے#
- Dart
>=3.4.0 <4.0.0۔ - Flutter
>=3.16.0(3.x سلسلہ)۔ - خالص Dart: کوئی نیٹو برج نہیں، کوئی
pod installنہیں، Gradle میں کوئی ترمیم نہیں۔ ذیلی ڈیپینڈنسیز سادہ Dart پیکیجز ہیں (http، web_socket_channel، uuid)۔
انسٹالیشن#
پیکیج pub.dev سے شامل کریں:
dependencies:
respondo_sdk: ^0.1.2import 'package:respondo_sdk/respondo_sdk.dart';انیشیئلائزیشن#
Respondo.navigatorKey کو اپنے MaterialApp سے جوڑ دیں تاکہ SDK آپ کے BuildContext کے بغیر چیٹ شیٹ کھول سکے، پھر Respondo.init ایک بار کال کریں، اور اس کے بعد Respondo.open()۔
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:respondo_sdk/respondo_sdk.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
// فائل اسٹوریج کی ڈائریکٹری میزبان ایپ کے پلگ اِن سے آتی ہے؛ SDK خود خالص رہتا ہے۔
final dir = await getApplicationSupportDirectory();
await Respondo.init(
RespondoConfig(
agentId: '<agent-uuid>',
channelId: '<channel-uuid>',
storageDirectory: dir.path,
),
);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: Respondo.navigatorKey, // لازمی ہے تاکہ SDK چیٹ کھول سکے
home: Scaffold(
body: Center(
child: FilledButton(
onPressed: () => Respondo.open(),
child: const Text('Support'),
),
),
),
);
}
}فیساڈ کے تمام میتھڈ idempotent ہیں، init سے پہلے بھی محفوظ طریقے سے کال کیے جا سکتے ہیں (وہ انہیں بفر کر کے بعد میں چلا دیتے ہیں)، اور کبھی آپ کی ایپ میں ایکسیپشن نہیں پھینکتے۔
صارفین کی شناخت#
طے شدہ طور پر ہر وزیٹر گمنام ہوتا ہے۔ پہلی بار ایپ چلنے پر SDK ایک مستقل visitor_id بناتا ہے اور اسے لوکل اسٹوریج میں رکھتا ہے، تاکہ واپس آنے والے صارف کو اپنی گفتگو دوبارہ مل جائے۔ ایپ میں کوئی API کلید رکھنے کی ضرورت نہیں — ہر گفتگو کی حفاظت ایک الگ سیشن ٹوکن کرتا ہے، جو backend جاری کرتا اور ہر پیغام پر آگے بڑھاتا رہتا ہے، اس لیے گمنام وزیٹر کو دوبارہ تصدیق نہیں کرانی پڑتی۔
جیسے ہی آپ کا صارف سائن اِن کر لے، identify ایک بار کال کریں۔ اس سے اُس کی اصل شناخت منسلک ہو جاتی ہے، اُس کی تاریخ ہر ڈیوائس اور ہر بار نئی انسٹالیشن کے بعد بھی ساتھ رہتی ہے، اور آپ کے ان باکس میں گفتگو کے ساتھ گمنام وزیٹر کے بجائے اُس کا نام اور ای میل دکھائی دیتا ہے۔
userHash وہ دستخط ہے جو آپ کا backend ایجنٹ کے identity_secret سے نکالتا ہے — HMAC-SHA256(secret, userId) (یا جب userId نہ ہو تو ای میل سے)، چھوٹے حروف والے hex میں انکوڈ شدہ۔ یہ سیکرٹ ہی ثابت کرتا ہے کہ شناخت اصلی ہے، اس لیے اسے صرف آپ کے backend پر رہنا چاہیے اور کبھی ایپ کے ساتھ نہیں بھیجا جاتا۔ پورا فارمولا اور سرور کی مثالیں شناخت کی تصدیق والے صفحے پر دیکھیں۔
// 1. اپنے backend پر سائن اِن کریں اور پہلے سے حساب شدہ ہیش پڑھ لیں
// (مثلاً وہ فیلڈ جو لاگ اِن کے جواب کے ساتھ واپس آتا ہے)۔
final session = await api.login(email, password);
// 2. تیار userHash SDK کو دیں — اسے کبھی ایپ کے اندر حساب نہ کریں۔
Respondo.identify(RespondoIdentity(
userId: session.userId,
email: session.email,
name: session.fullName,
userHash: session.respondoUserHash,
));
// 3. لاگ آؤٹ پر: سیشن منسوخ کریں اور نیا گمنام وزیٹر شروع کریں۔
Respondo.reset();اگر ہیش موجود نہ ہو یا غلط ہو تو کوئی ایکسیپشن نہیں آتی: backend خاموشی سے وزیٹر کو گمنام ہی رکھتا ہے، چیٹ چلتی رہتی ہے، اور آپ صرف ڈیوائسز کے درمیان جوڑ کھو دیتے ہیں — جب تک درست ہیش نہ دیا جائے۔ تصدیق صرف اُسی وقت چلتی ہے جب ایجنٹ کا identity_secret مقرر ہو — ڈیولپمنٹ کے دوران اسے خالی چھوڑ دیں اور userId / ای میل جوں کے توں قبول کر لیے جاتے ہیں۔
آبزرویبلز اور کال بیکس#
ہر چیز تین شکلوں میں دستیاب ہے: ایک براڈکاسٹ Stream، ایک کال بیک سیٹر، اور موجودہ قدر پڑھنے والا گیٹر۔
// غیر پڑھے پیغامات کی تعداد کا ری ایکٹو اسٹریم (بیج کے لیے)۔
Respondo.unreadCountStream.listen((n) => setBadge(n));
// یا کال بیک سیٹر۔
Respondo.onUnreadChanged = (n) => setBadge(n);
// لنکس/CTA روکیں؛ اگر میزبان ایپ نے URL خود کھول لیا ہو تو true واپس کریں۔
Respondo.onUrlRequested = (url) {
openInAppBrowser(url);
return true;
};اسکرین ٹریکنگ#
ہر نیویگیشن پر موجودہ اسکرین رپورٹ کریں تاکہ پیش قدمی والے ٹیزر اور صفحے کی سطح کی ٹارگٹنگ اس سے مطابقت کر سکیں۔ صاف کرنے کے لیے null بھیجیں؛ ہر تبدیلی پر نئی اسکرین کے لیے پیش قدمی والے ٹیزر کا دوبارہ جائزہ لیا جاتا ہے۔
Respondo.setCurrentScreen('pricing');اگلے مرحلے#
پش نوٹیفکیشنز اور شناخت کی تصدیق شامل کریں۔ مکمل API سطح، انگیجمنٹ کی سطحیں اور مسائل کا حل Flutter SDK کی ابتدائی گائیڈ میں دیے گئے ہیں، جو pub.dev کے پیکیج صفحے پر موجود ہے۔