Saltar al contenido →

Tutorial ReplayKit con Swift

Vamos a echarle un vistazo a ReplayKit, el framework de Apple con el que podremos grabar lo que ocurre en la pantalla de nuestro dispositivos, además de grabar también el audio de la app, del micrófono y acceder a la cámara del dispositivo.

Entendiendo ReplayKit

La clase principal y sobre la que recae casi toda la funcionalidad es RPScreenRecorder. Con ella iniciamos y detenemos las grabaciones, indicamos si queremos o no grabar el sonido del micrófono, etc.

Además también vamos a conocer a RPPreviewViewController un controlador que heredaq de UIViewController y con el que podemos editar las grabaciones así como compartirlas por redes sociales, correo…

Vamos a apoyarnos en una App muy simple que sólo enciende o apaga unos botones de colores. Como siempre encontraréis el enlace al repositorio con el código de esta App al final del artículo.

Iniciar y detener la grabación de la pantalla

Para empezar la grabación de la pantalla tenemos que llamar a la función startRecording(handler:) de la clase RPScreenRecorder.

La primera vez que llamemos a la función aparecerá en pantalla un mensaje solicitando permiso al usuario para grabar la pantalla.

Este mensaje también aparece si llevamos más de 8 minutos grabando, se hace así para evitar que el usuario deje grabando la pantalla por descuido u olvido.

La función recibe como parámetro un closure donde nos llega un error en caso que se produzca algún problema a la hora de empezar la grabación.

Para detener la grabación tenemos que llamar a la función stopRecording(handler:) también de RPScreenRecorder. En este caso el closure recibe dos parámetros:

  1. Un RPPreviewViewcontroller que presentaremos para que el usuario edite, guarde o comparta la grabación
  2. Un error en caso que haya algún problema.

¿Y qué pasa si termina de grabar pero no quiero guardar o compartir la grabación? En este caso llamaremos a la función discardRecording(handler:).

En el closure podemos ejecutar el código que necesitemos una vez que se termine de descartar la grabación.

Acceder al micrófono

El uso del microfono está controlado mediante la propiedad isMicrophoneEnabled de RPScreenRecorder.

Es de tipo boleano, por lo que basta con ponerla true para acceder al micrófono y a false para detener la captura de sonido procedente del micro.

Es importante activar o desactivar el acceso al micrófono.

Acceder a la cámara

El uso de la cámara del dispositivo también se hace mediante una propiedad, en este caso isCameraEnabled también de RPScreenRecorder, aunque su uso require de algunos pasos más.

Lo primero es que el usuario debe saber que estamos usando la cámara por lo que tenemos que incluir una entrada en el archivo Info.plist del proyecto.

La clave que hay que poner es Privacy - Camera Usage Description y el valor es un String con una descripción del uso que vamos a hacer de la cámara.

Vale, ya tengo permiso para usar la cámara ¿Pero cómo la pongo en la vista? Para eso tenemos que usar la propiedad cameraPreviewView. Esta propiedad es de sólo lectura y nos devuelve un UIView con la imagen de la cámara.

Sólo tenemos que añadir esa vista a nuestra jerarquía de vistas dentro del controlador.

¿Y puedo usar la cámara delentarea o la trasera? Sí, sólo tienes que indicarlo mediante la enumeración cameraPreviewView para la propiedad cameraPosition

La propiedad isCameraEnabled se establece antes de comenzar la grabación y la propiedad cameraPreviewView se puede usar una vez la grabación ha comenzado.

Editar y compartir la grabación

Tras terminar de grabar llega el momento de editar, guardar y/o compartir nuestra grabación.

¿Es muy complicado? En abosoluto, el equipo de desarrollo de ReplayKit no nos puede facilitar más esa tarea, y lo hace mediante un UIViewController personaliado que hacer por nosotros todas esas acciones.

Si recordáis, cuando detenemos la grabación el closure de la función stopRecording contiene un parámetro de tipo RPPreviewViewController, que es precisamente la vista que hace todo lo que acabamos de comentar.

Antes de presentarla en pantalla tenemos que hacer un par de cosas.

Lo primero es que si estamos en un iPad tenemos que añadir código adicional para mostrarlo correctamente.

Lo segundo es idicarle quien es el delegado donde recibiremos los eventos de petición de cierre de la vista, ya que tenemos que ser nosotros, desde nuestro código, los que quitemos la vista de la pantalla.

Para ello tenemos que implementar una extensión que de conformidad al protocolo RPPreviewViewControllerDelegate

Broadcast. Que el mundo vea lo bien que lo hago

Que tus amigos veas en twitter lo bien que juegas mola, pero que lo vea el planeta entero es mucho mejor.

El equipo de ingenieros de ReplayKit no ha querido que nuestro ego sufra lo más mínimo y nos da la oportunidad de retransmitir todo lo que pasa en nuestra pantalla a través de alguno de los servicios de “en vivo” como por ejemplo Twitch, Periscope, etc.

Se hace usando la clase RPBroadcastActivityViewController y más concretamente la función estática load(handler:) que tiene como parámetro un closure donde recibimos una instancia de un RPBroadcastActivityViewController que tenemos que presentar en pantalla y un error en caso que algo haya fallado.

Al presentarlo tenemos que tener en cuentas las mismas consideración que con RPPreviewViewController, es decir, configurarlo en caso de llamarle desde un iPad y asignarle un delegado.

En este caso el delegado debe implementar el protocolo RPBroadcastActivityViewControllerDelegate que es donde recibiremos el evento de cierre de la vista para que nosotros seamos los que la quitemos de la pantalla.

Y si os fijaís, además de para cerrar la vista sirve para recibir el controlador del servicio de broadcast con el gestionaremos la emisión. Vamos a verlo.

RPBroadcastController. El centro de realización de nuestra emisión.

En cuanto la vista de actividad nos da luz verde para usar un servicio de broadcasting ya podemos usar el RPBroadcastController para iniciar, pausar o detener la emisión.

Además de todo esto, también podemos obtener la URL de nuestra emisión, para que, por ejemplo, la podamos compartir en twitter con nuestros seguidores.

Lo primero que tenemos que hacer es empezar a emitir y eso se hace con la función startBroadcast(handler:) En el closure que tiene como parámetro comprobamos si se producer algún error que impida le emisión.

Ahora que ya estamos emitiendo también podemos detener y reaunarla posteriormente. Esto lo hace con las funciones pauseBrodcast() y resumeBroadcast() respectivamente.

Cuando queramos dar por finaliza la emisión sólo tenemos que invocar la función finishBroadcast(handler:) cuyo closure recibe… sí, lo has adivinado, un error en caso que haya algún problema a la hora de terminar la emisión.

La clase RPBroadcastController también admite un delegado que debe implementar el protocolo RPBroadcastControllerDelegate. Dicho protocolo especifica funciones desde donde se nos informará de cambios en la URL de la retrasmisión a errores en la misma.

¿Puedo desarrollar un Broadcasting Service en iOS?

Si te referieres a si puedes desarrollar una App que aparezca en la lista de servicios que muestra el RPBroadcastActivityViewController las respuesta es sí.

Pero eso ya lo veremos en otro artículo…

¿Puedo grabar de la cámara trasera y de la delantera del iPhone o del iPad al mismo tiempo?

La documentación de la AVFoundation Programming Guide lo deja bien claro

Media capture does not support simultaneous capture of both the front-facing and back-facing cameras on iOS devices.

Vamos, que no puedes.

Conclusión

ReplayKit nos permite grabar todo lo que ocurre en la pantalla de nuestros dispositivos así como el sonido y las reacciones de nuestros usuarios.

No penseís que sólo vale para el desarrollo de juegos, sus posibilidades van mucho más allá.

Código fuente

En este repositorio de GitHub podéis encontrar la app que se usa en este artículo.

Enlaces de interés

Publicado en ReplayKit