دستاویزات

iOS SDK

Respondo کے سپورٹ چیٹ کے لیے Swift اور SwiftUI پر بنا نیٹو کلائنٹ، بغیر کسی تیسرے فریق کی ڈیپینڈنسی کے۔

تقاضے#

  • iOS 15.0+ (iOS 16+ پر شیٹ کے باریک detents، اس سے نیچے سسٹم کا فال بیک)۔
  • Swift 5.9+۔
  • کسی تیسرے فریق کی کوئی ڈیپینڈنسی نہیں — صرف Foundation، Swift Concurrency، SwiftUI اور UIKit۔

آپ RespondoSDK پروڈکٹ پر انحصار کرتے ہیں، جو کراس پلیٹ فارم RespondoCore کو دوبارہ ایکسپورٹ کرتا ہے۔

انسٹالیشن#

پیکیج Swift Package Manager سے شامل کریں۔ Xcode میں: File → Add Package Dependencies… کھولیں اور https://github.com/respondo-app/sdk-iosدرج کریں، یا اسے اپنی Package.swift میں خود بیان کریں، پھر RespondoSDK پروڈکٹ پر انحصار رکھیں۔

Package.swiftswift
dependencies: [
    .package(url: "https://github.com/respondo-app/sdk-ios", from: "0.1.0")
],
targets: [
    .target(
        name: "MyApp",
        dependencies: [
            .product(name: "RespondoSDK", package: "sdk-ios")
        ]
    )
]

پھر کوڈ میں اسے امپورٹ کریں:

Swiftswift
import RespondoSDK

انیشیئلائزیشن#

ایپ کے آغاز پر ایک بار ابتدا کاری کریں، پھر Respondo.open() کہیں سے بھی کال کریں۔ لائف سائیکل میتھڈ initialize ہے (لفظ init زبان نے محفوظ رکھا ہوا ہے)۔

MyApp.swiftswift
import SwiftUI
import RespondoSDK

@main
struct MyApp: App {
    init() {
        Respondo.initialize(
            RespondoConfig(
                agentId: "<agent-uuid>",
                channelId: "<channel-uuid>"
                // baseUrl nil -> https://api.respondo.ai
            )
        )
    }

    var body: some Scene {
        WindowGroup {
            Button("Support") { Respondo.open() }
        }
    }
}

Respondo فیساڈ تھریڈ سیف ہے۔ initialize کے فوراً بعد کی گئی کالیں قطار میں لگ جاتی ہیں اور async ابتدا کاری مکمل ہوتے ہی لاگو ہو جاتی ہیں۔

صارفین کی شناخت#

طے شدہ طور پر ہر وزیٹر گمنام ہوتا ہے۔ پہلی بار چلنے پر SDK ایک مستقل visitor_id بناتا ہے اور اسے keychain میں رکھتا ہے، تاکہ واپس آنے والے صارف کو اپنی گفتگو دوبارہ مل جائے۔ کوئی API کلید ایپ میں شامل کرنے کی ضرورت نہیں — ہر گفتگو کی حفاظت اُسی گفتگو کے لیے بنے سیشن ٹوکن سے ہوتی ہے، جسے backend جاری کرتا اور ہر پیغام پر آگے بڑھاتا رہتا ہے، اس لیے گمنام وزیٹر کو کبھی دوبارہ تصدیق نہیں کرانی پڑتی۔

آپ کا صارف سائن اِن ہو جائے تو identify کال کریں۔ اس سے اس کی اصل شناخت جُڑ جاتی ہے، چنانچہ اس کا تاریخچہ ڈیوائسز اور دوبارہ انسٹال کے باوجود اس کے ساتھ چلتا ہے، اور آپ کے ان باکس میں گفتگو کے ساتھ گمنام وزیٹر کے بجائے اس کا نام اور ای میل نظر آتا ہے۔

userHash ایک دستخط ہے جو آپ کا backend ایجنٹ کے identity_secret سے بناتا ہے — HMAC-SHA256(secret, userId) (یا userId نہ ہو تو ای میل)، جسے چھوٹے حروف والے hex میں انکوڈ کیا جاتا ہے۔ یہ سیکرٹ ثابت کرتا ہے کہ شناخت اصلی ہے، اس لیے اسے صرف آپ کے backend پر رہنا چاہیے اور ایپ کے ساتھ کبھی نہیں بھیجنا چاہیے۔ مکمل فارمولا اور سرور کی طرف کی مثالیں شناخت کی تصدیق والے صفحے پر دیکھیں۔

Swiftswift
// userHash آپ کے backend سے آتا ہے (userId پر HMAC-SHA256) —
// اسے کبھی ایپ کے اندر شمار نہ کریں۔
Respondo.identify(
    RespondoIdentity(
        userId: session.userId,
        email: session.email,
        name: session.fullName,
        userHash: session.respondoUserHash
    )
)

// لاگ آؤٹ پر: سیشن منسوخ کریں اور نیا گمنام وزیٹر شروع کریں۔
Respondo.reset()

ہیش موجود نہ ہو یا غلط ہو تو کوئی خطا نہیں پھینکی جاتی: backend خاموشی سے وزیٹر کو گمنام ہی رکھتا ہے، چیٹ چلتی رہتی ہے، اور آپ بس ڈیوائسز کے درمیان کا ربط کھو دیتے ہیں جب تک درست ہیش نہ دیا جائے۔ تصدیق صرف اُس وقت چلتی ہے جب ایجنٹ کا identity_secret مقرر ہو — ڈیویلپمنٹ کے دوران اسے خالی رہنے دیں، تب userId / ای میل جیسے ہیں ویسے قبول کر لیے جاتے ہیں۔

قابلِ مشاہدہ حالتیں اور delegate#

حالت کو سنکرونس getters کے طور پر، ری ایکٹو AsyncStream کے طور پر، یا RespondoDelegate کے ذریعے پڑھیں۔ اسٹریمز اور delegate کے کال بیکس main actor پر آتے ہیں۔

Swiftswift
// غیر پڑھے پیغامات کی گنتی کا ری ایکٹو اسٹریم۔
Task {
    for await count in Respondo.unreadCountStream {
        updateBadge(count)
    }
}

// بیجز اور ڈیپ لنک فال بیک کے لیے delegate۔
final class SupportCoordinator: RespondoDelegate {
    init() { Respondo.delegate = self }
    func respondoUnreadChanged(_ count: Int) {
        UIApplication.shared.applicationIconBadgeNumber = count
    }
}

اسکرین ٹریکنگ#

ہر نیویگیشن پر موجودہ اسکرین رپورٹ کریں تاکہ پیش قدمی والے ٹیزر اور صفحے کی سطح کی ٹارگٹنگ اس سے مطابقت کر سکیں (static func setCurrentScreen(_ name: String?))۔ صاف کرنے کے لیے nil بھیجیں؛ ہر تبدیلی پر نئی اسکرین کے لیے پیش قدمی والے ٹیزر کا دوبارہ جائزہ لیا جاتا ہے۔

Swiftswift
Respondo.setCurrentScreen("pricing")

اگلے مرحلے#

پش نوٹیفکیشنز اور شناخت کی تصدیق جوڑیں۔ UIKit ریپر RespondoChatViewController، پورا delegate اور مسائل کا حل iOS SDK کی ابتدائی گائیڈ میں شامل ہیں؛ SDK کے سورس GitHubپر کھلے ہیں۔