Documentación

iOS SDK

Un cliente nativo de Swift y SwiftUI para el chat de soporte de Respondo, sin ninguna dependencia de terceros.

Requisitos#

  • iOS 15.0+ (detentes de hoja más finos en iOS 16+, con un respaldo del sistema por debajo).
  • Swift 5.9+.
  • Cero dependencias de terceros: solo Foundation, Swift Concurrency, SwiftUI y UIKit.

Dependes del producto RespondoSDK, que reexporta el RespondoCore multiplataforma.

Instalación#

Añade el paquete con Swift Package Manager. En Xcode: File → Add Package Dependencies… e introduce https://github.com/respondo-app/sdk-ios, o decláralo en tu propio Package.swift y luego depende del producto 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")
        ]
    )
]

Luego impórtalo en el código:

Swiftswift
import RespondoSDK

Inicializar#

Inicializa una vez en el arranque y luego llama a Respondo.open() en cualquier lugar. El método del ciclo de vida es initialize (la palabra init está reservada por el lenguaje).

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() }
        }
    }
}

La fachada Respondo es segura para hilos. Las llamadas realizadas justo después de initialize se ponen en cola y se aplican una vez que se completa la inicialización asíncrona.

Identificar usuarios#

Por defecto, todos los visitantes son anónimos. En el primer arranque, el SDK genera un visitor_id estable y lo conserva en el llavero (keychain), de modo que un usuario que regresa vuelve a encontrar su conversación. No hay ninguna clave de API que incrustar: cada conversación está protegida por un token de sesión por conversación que el backend acuña y desplaza hacia adelante en cada mensaje, así que un visitante anónimo nunca tiene que volver a autenticarse.

Llama a identify una vez que tu usuario haya iniciado sesión. Esto adjunta su identidad real para que su historial lo siga entre dispositivos y reinstalaciones, y su nombre y email aparezcan junto a la conversación en tu bandeja de entrada en lugar de un visitante anónimo.

El userHash es una firma que tu backend calcula a partir del identity_secret del agente — HMAC-SHA256(secret, userId) (o el email cuando no hay userId), codificada como hexadecimal en minúsculas. El secreto demuestra que la identidad es genuina, por lo que debe residir únicamente en tu backend y nunca se incluye en la aplicación. Consulta la página de Verificación de identidad para ver la fórmula completa y ejemplos del lado del servidor.

Swiftswift
// El userHash proviene de tu backend (HMAC-SHA256 sobre el userId):
// nunca lo calcules en la aplicación.
Respondo.identify(
    RespondoIdentity(
        userId: session.userId,
        email: session.email,
        name: session.fullName,
        userHash: session.respondoUserHash
    )
)

// Al cerrar sesión: revoca la sesión e inicia un nuevo visitante anónimo.
Respondo.reset()

Si el hash falta o es incorrecto, no se lanza ninguna excepción: el backend mantiene al visitante como anónimo de forma silenciosa, el chat sigue funcionando y simplemente pierdes el vínculo entre dispositivos hasta que se proporcione un hash válido. La verificación solo se ejecuta cuando el agente tiene configurado un identity_secret: déjalo vacío durante el desarrollo y el userId / email se aceptan tal cual.

Observables y delegado#

Lee el estado como getters síncronos, AsyncStream reactivos, o a través de un RespondoDelegate. Los streams y los callbacks del delegado llegan en el actor principal (main actor).

Swiftswift
// Stream reactivo de recuentos de no leídos.
Task {
    for await count in Respondo.unreadCountStream {
        updateBadge(count)
    }
}

// Delegado para distintivos y respaldos de enlaces profundos.
final class SupportCoordinator: RespondoDelegate {
    init() { Respondo.delegate = self }
    func respondoUnreadChanged(_ count: Int) {
        UIApplication.shared.applicationIconBadgeNumber = count
    }
}

Seguimiento de pantalla#

Informa de la pantalla actual en cada navegación para que los teasers proactivos y la segmentación a nivel de página puedan compararse con ella (static func setCurrentScreen(_ name: String?)). Pasa nil para borrarla; en cada cambio, el teaser proactivo se reevalúa para la nueva pantalla.

Swiftswift
Respondo.setCurrentScreen("pricing")

Próximos pasos#

Configura las Notificaciones push y la Verificación de identidad. El envoltorio de UIKit RespondoChatViewController, la superficie completa del delegado y la resolución de problemas se tratan en la guía de introducción del iOS SDK; las fuentes del SDK son públicas en GitHub.