Документація

iOS SDK

Нативний клієнт на Swift і SwiftUI для чату підтримки Respondo, без жодних сторонніх залежностей.

Вимоги#

  • 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, ставляться в чергу й застосовуються, щойно асинхронна ініціалізація завершується.

Ідентифікація користувачів#

За замовчуванням кожен відвідувач анонімний. Під час першого запуску SDK генерує стабільний visitor_id і тримає його в keychain, тож користувач, який повернувся, знову знаходить свою розмову. Ключа API вбудовувати не потрібно — кожна розмова захищена посесійним токеном на розмову, який бекенд карбує й зсуває вперед на кожному повідомленні, тож анонімному відвідувачеві ніколи не доводиться повторно автентифікуватися.

Викличте identify, щойно ваш користувач залогінився. Це прив’язує його реальну особу, тож його історія супроводжує його на різних пристроях і при перевстановленнях, а його ім’я та email з’являються поруч із розмовою у вашій спільній скриньці замість анонімного відвідувача.

userHash — це підпис, який ваш бекенд обчислює з identity_secret агента — HMAC-SHA256(secret, userId) (або email, коли userId немає), закодований як hex у нижньому регістрі. Секрет доводить, що особа справжня, тож він має жити лише на вашому бекенді й ніколи не постачається в застосунку. Повну формулу й приклади на боці сервера дивіться на сторінці Верифікація особи.

Swiftswift
// userHash приходить з вашого бекенду (HMAC-SHA256 над userId) —
// ніколи не обчислюйте його в застосунку.
Respondo.identify(
    RespondoIdentity(
        userId: session.userId,
        email: session.email,
        name: session.fullName,
        userHash: session.respondoUserHash
    )
)

// При виході: відкличте сесію й почніть нового анонімного відвідувача.
Respondo.reset()

Якщо хеш відсутній або хибний, нічого не падає з винятком: бекенд мовчки залишає відвідувача анонімним, чат далі працює, і ви просто втрачаєте зв’язок між пристроями, доки не буде надано валідний хеш. Верифікація виконується лише тоді, коли в агента заданий identity_secret — залиште його порожнім під час розробки, і userId / email приймаються як є.

Обсервабли й делегат#

Читайте стан як синхронні гетери, реактивні AsyncStream або через RespondoDelegate. Потоки й колбеки делегата приходять на головному акторі (main actor).

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")

Наступні кроки#

Підключіть Push-сповіщення та Верифікацію особи. Обгортка UIKit RespondoChatViewController, повна поверхня делегата й розв’язання проблем описані в посібнику з початку роботи з iOS SDK; вихідні коди SDK відкриті на GitHub.