iOS SDK
一个面向 Respondo 客服聊天的原生 Swift 与 SwiftUI 客户端,零第三方依赖。
环境要求#
- iOS 15.0+(在 iOS 16+ 上有更精细的面板停靠点,在更低版本上有系统级回退)。
- Swift 5.9+。
- 零第三方依赖——仅使用 Foundation、Swift Concurrency、SwiftUI 和 UIKit。
您依赖的是 RespondoSDK 这个 product, 它会重新导出跨平台的 RespondoCore。
安装#
使用 Swift Package Manager 添加该包。在 Xcode 中: File → Add Package Dependencies… 并输入 https://github.com/respondo-app/sdk-ios,或在您自己的 Package.swift 中声明它, 然后依赖 RespondoSDK 这个 product。
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")
]
)
]然后在代码中导入:
import RespondoSDK初始化#
在启动时初始化一次,之后即可在任意位置调用 Respondo.open()。 生命周期方法是 initialize(单词 init 被语言保留)。
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 之后发起的调用会被排队, 并在异步初始化完成后应用。
识别用户#
默认情况下,每位访客都是匿名的。首次启动时,SDK 会生成一个稳定的 visitor_id 并保存在 keychain 中,因此回访用户能再次找到自己的对话。 无需内嵌任何 API 密钥——每个对话都由后端签发的会话令牌保护, 该令牌按每个对话独立生成,并在每条消息时向前滑动,因此匿名访客永远无需重新认证。
在用户登录之后调用一次 identify。 这会附加上他们的真实身份,使其历史记录能跨设备、跨重装随之保留, 并让他们的姓名和邮箱显示在您收件箱里对话的旁边,而不再是一位匿名访客。
userHash 是 由您的后端根据 agent 的 identity_secret 计算出的签名—— HMAC-SHA256(secret, userId) (当没有 userId 时则用 email),编码为小写十六进制。 该密钥用于证明身份的真实性,因此必须只保存在您的后端,绝不能随应用一起分发。 完整公式和服务器端示例请参见身份校验页面。
// userHash 来自您的后端(对 userId 做 HMAC-SHA256)——
// 切勿在应用中计算它。
Respondo.identify(
RespondoIdentity(
userId: session.userId,
email: session.email,
name: session.fullName,
userHash: session.respondoUserHash
)
)
// 退出登录时:吊销会话并开启一个全新的匿名访客。
Respondo.reset()如果哈希缺失或错误,不会抛出任何异常:后端会静默地让访客保持匿名,聊天照常工作, 您只是在提供有效哈希之前失去跨设备的关联。 仅当 agent 设置了 identity_secret 时才会执行校验—— 在开发阶段将其留空,则 userId / email 会被原样接受。
可观察对象与 delegate#
您可以通过同步 getter、响应式的 AsyncStream, 或者通过 RespondoDelegate 读取状态。 流和 delegate 回调都在主 actor 上到达。
// 未读数的响应式流。
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 可清除它;每次变化时,主动式提示都会针对新屏幕重新评估。
Respondo.setCurrentScreen("pricing")