SDK de iOS
Un paquete Swift sin dependencias y sin UI. Mantiene la conversación —mensajes, escritura, conexión— como estado observable, y tú la dibujas con el estilo de tu app. iOS 15 o posterior.
Configuración
Permite tu app en vatio.yml. Su origen es ios-app:// más su bundle id:
widget:
allowed_origins:
- ios-app://com.acme.appvatio push
vatio tokens create --env live --label iosAgrega el paquete https://github.com/urcalab/vatio-ios en Xcode (File → Add Package Dependencies…) y crea un cliente con el token vatpub_. Está pensado para ir dentro de la app; un token vat_ nunca.
import Vatio
let vatio = Vatio(workspace: "acme", token: "vatpub_REPLACE_ME")
let chat = VatioChat(vatio)Uso
chat.messages // [VatioMessage], del más antiguo al más nuevo: id, role, content, createdAt, isPending
chat.isTyping // el agente está escribiendo
chat.status // .idle, .connecting, .connected, .reconnecting, .closed
try await chat.send("¿Qué vende Acme?")VatioChat es un ObservableObject, así que una vista de SwiftUI que lo observa se vuelve a dibujar a medida que llega la respuesta. Crearlo no abre nada: la conversación empieza con el primer send, y el mensaje del visitante aparece en messages de inmediato, con isPending hasta que el servidor lo confirma. Llama a await chat.resume() cuando aparezca la vista para reabrir la conversación del visitante, si tiene una.
Un diseño común es una barra de texto abajo de una pantalla que, al enviar, cambia a una pestaña de conversación y manda la pregunta:
AskBar { question in
tab = .conversation
Task { try? await chat.send(question) }
}El README del paquete tiene el ejemplo completo en SwiftUI.
| Método | Para qué sirve |
|---|---|
vatio.config() | Nombre del agente, avatar, color de acento, saludo y sugerencias |
vatio.conversations(visitorToken:) | Las conversaciones de este visitante en este dispositivo, la más nueva primero |
chat.send(_:) | Envía un mensaje; la primera llamada inicia la conversación |
chat.resume() | Reabre la conversación guardada; nunca inicia una nueva |
chat.open(_:) | Cambia a una conversación de conversations() |
chat.startOver() | Olvida la conversación guardada; el historial en el servidor se conserva |
chat.rate(_:comment:) | Responde el momento de feedback: .good, .neutral, .bad |
chat.dismissFeedback() | Rechaza el momento de feedback |
chat.close() | Desconecta |
send lanza un VatioError (code, message, status) y quita el mensaje pendiente, así que devuelve el texto a tu campo. Los errores fuera de un send quedan en chat.lastError.
Feedback del visitante
Cuando una solicitud parece resuelta, Vatio ofrece un momento de feedback, como máximo una vez por conversación (ve la guía del widget). chat.feedback lo contiene; muestra tu propio aviso mientras isOpen:
if let feedback = chat.feedback, feedback.isOpen {
RatingCard(agent: feedback.agentName) { rating, comment in
Task { try await chat.rate(rating, comment: comment) }
}
}Vuelve a nil cuando el visitante escribe de nuevo sin responder.
Usuarios con sesión
Pasa un visitor token firmado por tu backend para decir quién es el usuario, como se describe en Sesiones y canales:
let chat = VatioChat(vatio, visitorToken: signedToken)Un subject distinto es otra persona con su propia conversación, así que cerrar sesión en tu app también la cierra en el chat. Una conversación anónima se conserva cuando el usuario inicia sesión.
Entrega y almacenamiento
Las respuestas llegan por un WebSocket. Si se cae, el SDK se reconecta, hace polling mientras tanto y trae lo que se perdió; los mensajes se deduplican por id. replyStyle (.stream por defecto, .paced, .instant) funciona igual que en la web.
La conversación y el id del visitante se guardan en UserDefaults, por workspace y por usuario con sesión. Las credenciales del chat duran 12 horas. Los límites de uso y el largo de los mensajes son los mismos que en la web.
