> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/sdks/sdk-mobile/ios-sdk/modulos/videollamada.md).

# Videollamada - Videocall

## Introducción

La videollamada se gestiona con el ***VideoCall Component***.

Este componente se encarga de gestionar la comunicación entre un usuario y un agente (videoasistencia). Sus principales procesos son:

* Gestión interna de cámaras, micro y permisos.
* Conexión con los servicios.

En el apartado de [Lanzamiento simplificado](/sdks/sdk-mobile/ios-sdk/inicializacion/lanzamiento-simplificado.md) se detallan los pasos necesarios para la integración básica del SDK. En esta sección se añade la información para el lanzamiento de este componente.

## Dependencias <a href="#id-21-dependencias-requeridas-para-la-integracion" id="id-21-dependencias-requeridas-para-la-integracion"></a>

Para evitar conflictos y problemas de compatibilidad, en caso de querer instalar el componente en un proyecto que contenga una versión antigua de las librerías de Facephi (*Widgets*), éstos deberán eliminarse por completo antes de la instalación de los componentes de la ***SDKMobile***.

### **Cocoapods**

* Las dependencias obligatorias que deberán haberse instalado previamente (añadiéndolas en el fichero Podfile del proyecto) son:

```
pod 'FPHISDKMainComponent', '~> $VERSION'
```

* Para instalar el componente de Videollamada deberá incluirse la siguiente entrada en el Podfile de la aplicación:

```
pod 'FPHISDKVideoCallComponent', '~> $VERSION'
```

### **SPM**

* Las dependencias obligatorias que deberán haberse instalado previamente son:

```
//HTTPS
https://github.com/facephi-clienters/SDK-SdkPackage-SPM.git
//SSH
git@github.com:facephi-clienters/SDK-SdkPackage-SPM.git

```

* Para instalar el componente de Videollamada deberá incluirse en los módulos del proyecto:

```
//HTTPS
https://github.com/facephi-clienters/SDK-VideoCallPackage-SPM.git
//SSH
git@github.com:facephi-clienters/SDK-VideoCallPackage-SPM.git
```

## Controladores disponibles <a href="#id-4-controladores-disponibles" id="id-4-controladores-disponibles"></a>

| **Controlador**     | **Descripción**                       |
| ------------------- | ------------------------------------- |
| VideoCallController | Controlador principal de videollamada |

## Lanzamiento simplificado <a href="#id-4-lanzamiento-simplificado" id="id-4-lanzamiento-simplificado"></a>

Una vez iniciado el SDK y creada una nueva operación se podrá lanzar el componente. Se podrá hacer uso de cualquiera de sus controladores para ejecutar su funcionalidad.

Lanzamiento:

```swift
let controller = VideoCallController(
    data: videoCallConfigurationData,
    extensionIdentifier: "com.organization.app.videocallExtension",
    output: { sdkResult in
        // Do whatever with the result
        ...
    },
    viewController: viewController)
SDKController.shared.launch(controller: controller)
```

`extensionIdentifier` debe coincidir con el **Bundle Identifier** de la **Broadcast Upload Extension** de compartir pantalla que añadas en tu app (ver [Extensión de compartir pantalla](#extension-de-compartir-pantalla)).

## Extensión de compartir pantalla

Desde la versión **2.8.1**, la **Broadcast Upload Extension** para compartir pantalla durante la videollamada se configura en la **app integradora** y se asocia al componente **Video Call** mediante **`extensionIdentifier`**.

### Pasos en la app integradora

1. En Xcode, añade un target **Broadcast Upload Extension** al proyecto de la app (p. ej. *File → New → Target → Broadcast Upload Extension*).
2. Define un **Bundle Identifier** único para la extensión (p. ej. `com.organization.app.videocallExtension`).
3. Usa ese identificador como **`extensionIdentifier`** al crear **`VideoCallController`** (véase el ejemplo de lanzamiento anterior).
4. En el target y la extensión se debe añadir una capability de tipo `App Group`. Al hacerlo, se debe introducir el mismo nombre tanto en el target como la extensión.
5. En el `Info.plist` de la extensión se debe modificar `NSExtensionPrincipalClass` para que su valor sea `videocallComponent.VideoExtensionHandler`.
6. Si se instala mediante Cocoapods, se debe añadir el target de la extensión al Podfile y su dependencia con Videocall. Si se instala con SPM, se debe añadir la dependencia de Videocall al target de la extensión.
7. Activa **`activateScreenSharing`** en **`VideoCallConfigurationData`** cuando quieras ofrecer compartir pantalla en la llamada.

Existe un [ejemplo de programación con esta funcionalidad incorporada](https://github.com/facephi/sdk-mobile-ios-samples/tree/master/sdkmobile-demo-videocall-pods) y configurada.

{% hint style="info" %}
En versiones **2.8.0** y anteriores, la extensión de broadcast podía asociarse al flujo de **Video Recording**. A partir de **2.8.1** esa responsabilidad pasa a **Video Call**.
{% endhint %}

## Configuración básica

La configuración básica necesaria no necesitará ningún parámetro.

```swift
static var videoCallConfiguration: VideoCallConfigurationData{
        var configVideoCall = VideoCallConfigurationData()
        return configVideoCall
}
```

## Recepción del resultado <a href="#id-7-recepcion-del-resultado" id="id-7-recepcion-del-resultado"></a>

Los controllers devolverán la información necesaria en formato SdkResult.

### Recepción de errores <a href="#id-71-recepcion-de-errores" id="id-71-recepcion-de-errores"></a>

En la parte del error, dispondremos de la clase común *ErrorType*.

* VCL\_CANCEL\_BY\_USER: El usuario ha cancelado el proceso
* VCL\_CANCEL\_LAUNCH: Se ha hecho una cancelación general del SDK
* VCL\_COMPONENT\_LICENSE\_ERROR: La licencia del componente no es correcta
* VCL\_EMPTY\_LICENSE: El String de licencia está vacío
* VCL\_FACE\_DETECTION\_TIMEOUT: No se ha detectado cara
* VCL\_INITIALIZATION\_ERROR: Error de inicialización
* VCL\_MANAGER\_NOT\_INITIALIZED: Los managers son nulos
* VCL\_NETWORK\_CONNECTION: Error en la conexión a internet
* VCL\_NO\_DATA\_ERROR: Los datos de entrada son nulos
* VCL\_OPERATION\_NOT\_CREATED: No hay ninguna operación en curso
* VCL\_PERMISSION\_DENIED: El usuario ha rechazado los permisos
* VCL\_SOCKET\_ERROR: Error en la conexión de los servicios
* VCL\_TIMEOUT: Timeout en el proceso
* VCL\_VIDEO\_ERROR: Error en el procesamiento del vídeo
* VCL\_UNKNOWN\_ERROR: Error desconocido
* VCL\_VIDEO\_RECORDING\_ACTIVE: No se puede iniciar porque el proceso de vídeo grabación está activo

### Recepción de ejecución correcta - *data* <a href="#id-72-recepcion-de-ejecucion-correcta-data" id="id-72-recepcion-de-ejecucion-correcta-data"></a>

En la ejecución correcta, simplemente se informa de que todo ha ido bien con el SdkResult.Success.

Cuando el resultado sea Success y esté activo el flag *sharingScreen* se podrá activar compartir pantalla.

## Información avanzada <a href="#id-7-informacion-avanzada" id="id-7-informacion-avanzada"></a>

Este apartado amplía la información del componente.

### Configuración avanzada del componente <a href="#id-51-class-nfcconfigurationdata" id="id-51-class-nfcconfigurationdata"></a>

Los campos incluidos en la configuración, normalmente **no es necesario que sean informados** ya que se completan internamente a través de la licencia usada.

**activateScreenSharing**

Activar la opción de compartir pantalla en la llamada.

**url**

Ruta al socket de video

**apiKey**

ApiKey necesaria para la conexión con el socket de video

**tenantId**

Identificador del tenant que hace referencia al cliente actual, necesario para la conexión con el servicio de video.

**vibrationEnabled**

Si se le da valor true, se activa la vibración en errores y si la respuesta del widget es OK

## Personalización del componente

Aparte de los cambios que se pueden realizar a nivel de SDK (los cuales se explican en el documento de *Personalización del SDK*), este componente en concreto permite la modificación de su interfaz.

### Textos

Los textos pueden ser customizados sobreescribiendo el valor de las siguientes claves en un **Localizable.strings**. Las claves que contienen el sufijo ***\_alt*** son los literales utilizados en las etiquetas de accesibilidad necesarias para la funcionalidad de ***voice over***.

| **Name**                                            | **Value**                                 |
| --------------------------------------------------- | ----------------------------------------- |
| video\_call\_component\_exit\_alert\_question       | ¿Seguro que quieres finalizar la llamada? |
| video\_call\_component\_exit\_alert\_finish         | Finalizar                                 |
| video\_call\_component\_exit\_alert\_accept         | Aceptar                                   |
| video\_call\_component\_exit\_alert\_cancel         | Cancelar                                  |
| video\_call\_component\_skip                        | OMITIR                                    |
| video\_call\_component\_restart                     | REINTENTAR                                |
| video\_call\_component\_agent                       | Asistente                                 |
| video\_call\_component\_text\_waiting\_agent\_title | Conectando con un asistente...            |
| video\_call\_component\_close\_button\_alt          | Cerrar                                    |
| video\_call\_component\_back\_button\_alt           | Atrás                                     |
| video\_call\_component\_timeout\_title              | Tiempo superado                           |
| video\_call\_component\_timeout\_desc               | No se ha podido conectar con un agente.   |

De este modo, si se desea modificar por ejemplo el texto “*Finalizar*” de la clave `video_call_component_exit_alert_finish` para el idioma **es**, se deberá ir al archivo **Localizable.strings** de la carpeta **es.lproj** si es que existe (si no, se deberá crear) y ahí, añadir:

`"video_call_component_exit_alert_finish"="Terminar";`

Si un mensaje no se especifica en el fichero del idioma, este se rellenará con el mensaje por defecto.

### Colores <a href="#id-82-colores" id="id-82-colores"></a>

Los colores se inicializan similarmente en la variable colors con un diccionario, teniendo como valor un UIColor que se desee.

```
sdkPrimaryColor
sdkBackgroundPrimaryColor
sdkSecondaryColor
sdkBodyTextColor
sdkTitleTextColor
sdkSuccessColor
sdkErrorColor
sdkNeutralColor
sdkAccentColor
sdkTopIconsColor
sdkBackgroundDisabled
```

### Animaciones <a href="#id-84-animaciones" id="id-84-animaciones"></a>

Las animaciones a usar se inicializan similarmente en la variable animations con un diccionario, teniendo como valor una string con el nombre de la animación que se encuentre en xcassets que se desee usar.

```
video_call_anim_waiting
```
