Dokumentasyon

iOS SDK

Isang native na kliyente sa Swift at SwiftUI para sa chat ng suporta ng Respondo, na walang anumang third-party na dependency.

Mga kinakailangan#

  • iOS 15.0+ (mas pinong sheet detent sa iOS 16+, may fallback ng sistema sa mas lumang bersyon).
  • Swift 5.9+.
  • Walang anumang third-party na dependency — Foundation, Swift Concurrency, SwiftUI, at UIKit lamang.

Umaasa kayo sa produktong RespondoSDK, na muling nag-e-export ng cross-platform na RespondoCore.

Pag-install#

Idagdag ang package gamit ang Swift Package Manager. Sa Xcode: File → Add Package Dependencies… at ilagay ang https://github.com/respondo-app/sdk-ios, o idedeklara ito sa sarili ninyong Package.swift, pagkatapos ay umasa sa produktong 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")
        ]
    )
]

Pagkatapos ay i-import ito sa code:

Swiftswift
import RespondoSDK

Pag-initialize#

I-initialize nang isang beses sa paglulunsad, pagkatapos ay tawagin ang Respondo.open() kahit saan. Ang metodo ng lifecycle ay initialize (nakalaan sa wika ang salitang 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() }
        }
    }
}

Thread-safe ang facade na Respondo. Ang mga tawag na ginawa kaagad pagkatapos ng initialize ay pumipila at inilalapat kapag natapos na ang asynchronous na init.

Pagkilala sa mga user#

Bilang default, anonymous ang bawat bisita. Sa unang paglulunsad, bumubuo ang SDK ng matatag na visitor_id at itinatago ito sa keychain, kaya nahahanap muli ng bumabalik na user ang usapan niya. Walang API key na kailangang i-embed — pinoprotektahan ang bawat usapan ng session token na kada-usapan, na ini-issue ng backend at isinusulong sa bawat mensahe, kaya hindi na kailangang mag-authenticate muli ng anonymous na bisita.

Tawagin ang identify sa sandaling naka-log in na ang user ninyo. Ikinakabit nito ang tunay niyang pagkakakilanlan, kaya sumusunod sa kanya ang kasaysayan niya sa iba't ibang device at sa muling pag-install, at lumalabas ang pangalan at email niya sa tabi ng usapan sa inbox ninyo sa halip na anonymous na bisita.

Ang userHash ay lagdang kinakalkula ng backend ninyo mula sa identity_secret ng ahente — HMAC-SHA256(secret, userId) (o ang email kapag walang userId), naka-encode bilang lowercase hex. Pinatutunayan ng secret na tunay ang pagkakakilanlan, kaya dapat itong manatili lamang sa backend ninyo at hindi kailanman ipinapadala kasama ng app. Tingnan ang pahinang Pagpapatunay ng identity para sa buong pormula at mga halimbawa sa panig ng server.

Swiftswift
// Galing sa backend ninyo ang userHash (HMAC-SHA256 sa userId) —
// huwag itong kalkulahin sa loob ng app.
Respondo.identify(
    RespondoIdentity(
        userId: session.userId,
        email: session.email,
        name: session.fullName,
        userHash: session.respondoUserHash
    )
)

// Sa pag-log out: bawiin ang session at magsimula ng bagong anonymous na bisita.
Respondo.reset()

Kung nawawala o mali ang hash, walang bumabagsak: tahimik na pinapanatiling anonymous ng backend ang bisita, patuloy na gumagana ang chat, at nawawala lamang ang ugnayan sa iba't ibang device hanggang may maibigay na wastong hash. Tumatakbo lang ang pagpapatunay kapag may nakatakdang identity_secret ang ahente — iwanan itong walang laman habang nasa development at tatanggapin ang userId / email nang ganoon na lang.

Observables at delegate#

Basahin ang estado bilang synchronous na getter, bilang mga reaktibong AsyncStream, o sa pamamagitan ng RespondoDelegate. Dumarating sa main actor ang mga stream at ang mga callback ng delegate.

Swiftswift
// Reaktibong stream ng bilang ng hindi pa nababasa.
Task {
    for await count in Respondo.unreadCountStream {
        updateBadge(count)
    }
}

// Delegate para sa mga badge at fallback ng deep link.
final class SupportCoordinator: RespondoDelegate {
    init() { Respondo.delegate = self }
    func respondoUnreadChanged(_ count: Int) {
        UIApplication.shared.applicationIconBadgeNumber = count
    }
}

Pagsubaybay sa screen#

Iulat ang kasalukuyang screen sa bawat navigation para makatugma rito ang mga proactive na teaser at ang page-level na targeting (static func setCurrentScreen(_ name: String?)). Magpasa ng nil para burahin ito; sa bawat pagbabago, muling sinusuri ang proactive na teaser para sa bagong screen.

Swiftswift
Respondo.setCurrentScreen("pricing")

Mga susunod na hakbang#

Ikabit ang Mga push notification at ang Pagpapatunay ng identity. Ang UIKit wrapper na RespondoChatViewController, ang buong delegate surface, at ang paglutas ng problema ay tinatalakay sa gabay sa pagsisimula ng iOS SDK; bukas sa publiko ang mga source ng SDK sa GitHub.