डॉक्युमेंटेशन

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 वरून जोडा:

pubspec.yamlyaml
dependencies:
  respondo_sdk: ^0.1.2
Dartdart
import 'package:respondo_sdk/respondo_sdk.dart';

इनिशियलाइज करा#

Respondo.navigatorKey तुमच्या MaterialApp ला जोडा, म्हणजे SDK ला तुमच्या BuildContext शिवाय चॅट शीट उघडता येईल; नंतर एकदाच Respondo.init कॉल करा आणि मग Respondo.open().

main.dartdart
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 वरच राहिली पाहिजे आणि ॲपसोबत ती कधीही पाठवली जात नाही. पूर्ण सूत्र आणि सर्व्हरच्या बाजूची उदाहरणे Identity verification पानावर पाहा.

Dartdart
// 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 / ईमेल जसेच्या तसे स्वीकारले जातात.

ऑब्झर्व्हेबल & कॉलबॅक#

प्रत्येक गोष्ट broadcast Stream, कॉलबॅक सेटर आणि सध्याचे मूल्य देणारा getter अशा तिन्ही रूपांत उपलब्ध आहे.

Dartdart
// न वाचलेल्या मेसेजच्या संख्येचा रिॲक्टिव्ह स्ट्रीम (बॅजसाठी).
Respondo.unreadCountStream.listen((n) => setBadge(n));

// किंवा कॉलबॅक सेटर.
Respondo.onUnreadChanged = (n) => setBadge(n);

// लिंक/CTA इंटरसेप्ट करा; होस्टने URL स्वतः उघडला असेल तर true परत करा.
Respondo.onUrlRequested = (url) {
  openInAppBrowser(url);
  return true;
};

स्क्रीन ट्रॅकिंग#

प्रत्येक नेव्हिगेशनला सध्याची स्क्रीन कळवा, म्हणजे प्रोॲक्टिव्ह टीझर आणि पान-पातळीवरचे टार्गेटिंग तिच्याशी जुळवता येते. साफ करण्यासाठी null पाठवा; प्रत्येक बदलावर नव्या स्क्रीनसाठी प्रोॲक्टिव्ह टीझरचे पुनर्मूल्यांकन होते.

Dartdart
Respondo.setCurrentScreen('pricing');

पुढची पावले#

Push notifications आणि Identity verification जोडा. संपूर्ण API, एंगेजमेंटचे भाग आणि अडचणींचे निवारण Flutter SDK च्या सुरुवातीच्या मार्गदर्शकात दिले आहे — तो pub.dev पॅकेजच्या पानावर उपलब्ध आहे.