iOS SDK
서드파티 의존성이 전혀 없는, Respondo 지원 채팅을 위한 네이티브 Swift 및 SwiftUI 클라이언트입니다.
요구 사항#
- iOS 15.0+ (iOS 16+에서는 더 세밀한 시트 디텐트, 그 아래에서는 시스템 폴백).
- 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 제품에 의존하세요.
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 직후에 이루어진 호출은 큐에 쌓였다가 비동기 init이 완료되면 적용됩니다.
사용자 식별#
기본적으로 모든 방문자는 익명입니다. 첫 실행 시 SDK는 안정적인 visitor_id를 생성해 키체인에 보관하므로, 다시 방문한 사용자는 자신의 대화를 다시 찾습니다. 내장할 API 키는 없습니다 — 각 대화는 백엔드가 발급하고 메시지마다 앞으로 밀어주는 대화별 세션 토큰으로 보호되므로, 익명 방문자는 재인증할 필요가 전혀 없습니다.
사용자가 로그인하면 identify를 한 번 호출하세요. 이렇게 하면 실제 신원이 연결되어 여러 기기와 재설치에 걸쳐 대화 이력이 따라오고, Inbox의 대화 옆에 익명 방문자 대신 이름과 이메일이 표시됩니다.
userHash는 여러분의 백엔드가 에이전트의 identity_secret으로 계산하는 서명입니다 — HMAC-SHA256(secret, userId)(userId가 없으면 이메일), 소문자 16진수로 인코딩합니다. 이 시크릿은 신원이 진짜임을 증명하므로 오직 여러분의 백엔드에만 있어야 하고 앱에 절대 포함되어서는 안 됩니다. 전체 공식과 서버 측 예제는 신원 확인 페이지를 참고하세요.
// userHash는 여러분의 백엔드에서 옵니다(userId에 대한 HMAC-SHA256) —
// 앱에서 절대 계산하지 마세요.
Respondo.identify(
RespondoIdentity(
userId: session.userId,
email: session.email,
name: session.fullName,
userHash: session.respondoUserHash
)
)
// 로그아웃 시: 세션을 폐기하고 새 익명 방문자를 시작합니다.
Respondo.reset()해시가 없거나 잘못되어도 아무것도 예외를 던지지 않습니다: 백엔드는 방문자를 조용히 익명으로 유지하고, 채팅은 계속 동작하며, 유효한 해시가 제공될 때까지 단지 기기 간 연결만 잃을 뿐입니다. 검증은 에이전트에 identity_secret이 설정되어 있을 때만 실행됩니다 — 개발 중에는 비워 두면 userId / 이메일이 있는 그대로 받아들여집니다.
관찰 가능한 값 및 델리게이트#
상태를 동기 게터, 반응형 AsyncStream, 또는 RespondoDelegate를 통해 읽으세요. 스트림과 델리게이트 콜백은 메인 액터에서 도착합니다.
// 읽지 않은 개수의 반응형 스트림.
Task {
for await count in Respondo.unreadCountStream {
updateBadge(count)
}
}
// 배지와 딥 링크 폴백을 위한 델리게이트.
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")