문서

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 제품에 의존하세요.

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 직후에 이루어진 호출은 큐에 쌓였다가 비동기 init이 완료되면 적용됩니다.

사용자 식별#

기본적으로 모든 방문자는 익명입니다. 첫 실행 시 SDK는 안정적인 visitor_id를 생성해 키체인에 보관하므로, 다시 방문한 사용자는 자신의 대화를 다시 찾습니다. 내장할 API 키는 없습니다 — 각 대화는 백엔드가 발급하고 메시지마다 앞으로 밀어주는 대화별 세션 토큰으로 보호되므로, 익명 방문자는 재인증할 필요가 전혀 없습니다.

사용자가 로그인하면 identify를 한 번 호출하세요. 이렇게 하면 실제 신원이 연결되어 여러 기기와 재설치에 걸쳐 대화 이력이 따라오고, Inbox의 대화 옆에 익명 방문자 대신 이름과 이메일이 표시됩니다.

userHash는 여러분의 백엔드가 에이전트의 identity_secret으로 계산하는 서명입니다 — HMAC-SHA256(secret, userId)(userId가 없으면 이메일), 소문자 16진수로 인코딩합니다. 이 시크릿은 신원이 진짜임을 증명하므로 오직 여러분의 백엔드에만 있어야 하고 앱에 절대 포함되어서는 안 됩니다. 전체 공식과 서버 측 예제는 신원 확인 페이지를 참고하세요.

Swiftswift
// 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를 통해 읽으세요. 스트림과 델리게이트 콜백은 메인 액터에서 도착합니다.

Swiftswift
// 읽지 않은 개수의 반응형 스트림.
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을 전달하면 지워지며, 변경될 때마다 새 화면에 대해 능동적 티저가 다시 평가됩니다.

Swiftswift
Respondo.setCurrentScreen("pricing")

다음 단계#

푸시 알림과 신원 확인을 연결하세요. UIKit 래퍼 RespondoChatViewController, 전체 델리게이트 표면, 문제 해결은 iOS SDK 시작 가이드에서 다룹니다. SDK 소스는 GitHub에 공개되어 있습니다.