Esta es la ruta de incorporación más corta para integradores de iOS: desde la inicialización, hasta mostrar la imagen en pantalla, enviar instrucciones de control y finalizar la experiencia. Para obtener las firmas completas de métodos, campos y códigos de error, consulte la Referencia de la API del SDK para iOS.
0. Lo que construirá
Un bucle mínimo de extremo a extremo de "entrar en un mundo → experiencia de video en tiempo real → interactuar → finalizar". Los puntos de entrada en tiempo de ejecución son el global HappyOysterEngine.shared y el identificador de sesión de un solo uso OysterTravel que este crea.
1. Requisitos
Elemento | Requisito |
|---|---|
SO mínimo | iOS 15.0+ |
Lenguaje | Swift ( |
Subprocesamiento | Las API públicas son |
Importación |
|
1.1 Agregar el SDK mediante CocoaPods
El SDK se distribuye como un binario precompilado (xcframework) a través de subespecificaciones de CocoaPods, publicado en el Trunk público de CocoaPods — haga referencia a él directamente por versión, sin necesidad de un archivo podspec local.
pod install y abra el .xcworkspace generado (no el .xcodeproj).
AliVCSDK_ARTC es obligatorio siempre que incluya HappyOysterSDK/StreamAliRTC: si falta, el SDK recurre silenciosamente a Loopback — aún se conecta y alcanza el estado running, pero muestra una pantalla negra sin error.2. Dos tipos de credenciales (entiéndalas primero para evitar problemas)
El SDK no obtiene ni renueva ninguna credencial por sí mismo; usted debe inyectarlas todas:
Credencial | Origen | Propósito | Cómo inyectar |
|---|---|---|---|
Token de autenticación HTTP | Su aplicación lo obtiene de su propio backend | Autenticación general para llamadas del SDK a la puerta de enlace (de larga duración, requiere renovación) |
|
Ticket de un solo uso | Emitido por su servidor tras el intercambio mediante la API de credenciales de Travel | Se utiliza para una única experiencia y se invalida inmediatamente después de su uso | Pasado como argumento de |
updateToken es para autenticación general, mientras que ticket es una credencial de unión de un solo uso. Las claves AK / de firma existen únicamente en su servidor y nunca se exponen al cliente.3. Pasos de integración
Ciclo de vida: registrar el motor de streaming → inicializar → inyectar token → crear la sesión → adjuntar video + suscribirse a eventos → iniciar → interactuar → finalizar.
Paso 1: Registrar el motor de streaming
El único punto de entrada para renderizar video. Llámelo una vez al iniciar la aplicación; las llamadas repetidas son seguras.
Paso 2: Inicializar el SDK
Debe inicializar una vez antes de llamar a cualquier otra API. Para cambiar de puerta de enlace o modelo, simplemente llámelo de nuevo — mientras está inactivo, prevalece la configuración más reciente y se conserva el token inyectado; la llamada solo se ignora mientras un travel está en curso, así que ejecute end() primero.
Paso 3: Inyectar el token de autenticación HTTP (push)
Obtenga una API Key temporal de Model Studio desde su propio backend e inyéctela. Vuelva a inyectarla después de que caduque.
Paso 4: Crear el identificador de sesión
Cree un OysterTravel a partir de un ticket de un solo uso. Aún no hay nada conectado, pero la vista de video ya está disponible.
Paso 5: Adjuntar la vista de video y suscribirse a eventos
El SDK proporciona la vista y el host la coloca. Suscríbase antes start() para no perderse los primeros cambios de estado.
Paso 6: Iniciar la experiencia
Conéctese y comience a reproducir. El SDK mantiene entonces automáticamente la conexión en tiempo real y el sondeo de estado, exponiendo el estado a través de events.
start(maxExperienceTimeSec:) solo aplica a adventure; directing y acting ignoran el parámetro.model que pasó a initialize en el Paso 2. Con modelos por modo (happyoyster-1.0-adventure / -directing / -acting), cada modelo es su propia ruta de aplicación de puerta de enlace, por lo que una sola llamada a initialize sirve únicamente a mundos de un modo; el ticket fue emitido por su servidor bajo la ruta del modo de ese mundo, y start() lo envía a la ruta del model configurado actualmente — una discrepancia provoca un fallo en este paso.
Antes de entrar en un mundo de un modo diferente, llame nuevamente a initialize() con el modelo correspondiente — sin cleanup() y sin volver a ejecutar updateToken():
mode solo llega en la respuesta de este paso (data.mode); antes de la llamada, el SDK solo posee un ticket opaco y un nombre de modelo. Las aplicaciones que ofrecen un solo modo no se ven afectadas y se inicializan una sola vez.
initialize() se ignora con una advertencia — ejecute end() primero.Paso 7: Interacción en tiempo real (elija uno según el modo)
sendCommand limita internamente la frecuencia en un ciclo de última-llamada-gana de 42ms (24FPS), por lo que el host puede llamarlo a alta frecuencia:
- Las acciones de un solo disparo, como saltar, atacar, agacharse y correr, se envían una sola vez.
- El movimiento y la rotación de la vista se envían continuamente mientras se mantienen presionados, y simplemente deja de llamarlos al soltarlos.
- No necesita enviar
noneni llamar aflushCommands()al soltar; el SDK nunca genera un comando de detención por sí mismo, y el servidor finaliza la acción una vez que el canal en tiempo real queda inactivo.
Paso 8: Pausar / Reanudar / Rebobinar (dependiente del modo)
adventure no admite none de estos; acting admite pausa/reanudación pero no admite rebobinado — oculte el punto de entrada de rebobinado en esos modos. Las llamadas no coincidentes son rechazadas localmente por el SDK (103003 / 103002).Paso 9: Finalizar la experiencia
Desconecta, detiene el sondeo y libera todos los recursos de la sesión; el ticket se consume. Es idempotente — cada ruta de salida debe converger en él.
await engine.cleanup() cuando desmonte el SDK o cambie de puertas de enlace.4. Ejemplo completo (SwiftUI)
5. Mejores prácticas
- Ciclo de vida: Llame a
OysterStream.register()+initialize()lo antes posible al iniciar la aplicación, una vez cada uno globalmente; llame siempre aend()al salir de la página de experiencia para garantizar que se liberen la conexión en tiempo real y los recursos.OysterTraveles de un solo uso — cree uno nuevo mediantecreateTraveldespués de que alcance un estado terminal. - Renovación de token: Asegúrese de que el token HTTP esté actualizado antes de iniciar una experiencia; cuando reciba una devolución de llamada de error relacionada con la autenticación, obtenga un nuevo token y llame a
updateToken(no es fatal, no termina la experiencia). - Gravedad del error: Para errores fatales, el SDK termina automáticamente la experiencia actual, los expone a través de
.errordeeventsy pasa al estado terminalfailed; debe regresar a la pantalla mostrada antes de "iniciar experiencia". Los errores no fatales solo se notifican y se pueden reintentar. Consulte la tabla completa de códigos de error en la Referencia de la API. - Adaptación de modo: Los modos directing y acting muestran una entrada de texto (
sendInstruct); el modo adventure muestra widgets de control (sendCommand). Solo directing muestra un punto de entrada para rebobinar. Para mundos en modo acting, seleccione la orientación del reproductor desdeaspectRatio(vertical9:16por defecto).
6. Siguientes pasos
- API completa (
pause()/resume()/rewind(toSec:), modelos de datos, códigos de error) → Referencia de la API del SDK para iOS