Home » Análisis » Análisis: cómo se programan apps y juegos en tvOS
tvOS

Análisis: cómo se programan apps y juegos en tvOS

Si hay algo que caracteriza a los productos de Apple, es cómo muchos de ellos forman parte de la rumorología general durante años. En este caso que nos ocupa, desde el mismo año 2012 (momento en que se renovó por última vez el Apple TV) se empezaron a oír voces que hablaban de un cambio y que las apps llegarían al TV de la mano de Apple pronto. 3 años se ha tardado en que esto se haga realidad, así como un intento en falso de un supuesto aplazamiento de presentación días antes de comenzar la WWDC.

Pero el día ha llegado, ya tenemos con nosotros el nuevo Apple TV y sin duda merece mucho la pena. A partir de 149$ en configuración de 32GB de almacenamiento o 199$ con 64GB, tenemos un dispositivo con unas prestaciones sobresalientes.

Capacidades hardware y prestaciones

El nuevo Apple TV tiene un procesador A8 similar al de los actuales iPhone 6, 6 Plus y el último modelo de iPod Touch. En este caso, funciona a más potencia al no depender de batería y dispone de arquitectura de 64 bits y soporte de la librería gráfica Metal. Según Apple, cuenta con unas prestaciones gráficas un 80% por encima de consolas de juegos (entendemos que la generación Wii, Xbox 360 y PS3). Incorpora 2GB de RAM como memoria, salida 1080p por HDMI, conexión de red 10/100Mbps, WiFi 802.11ac, Bluetooth 4 y un nuevo mando / control de juegos con batería recargable (mediante conector lighting) que dispone de un giroscopio digital, acelerómetro y una superficie táctil similar a un pequeño trackpad.

Aunque estará a la venta en 80 países, solo 8 de ellos usarán Siri Remote (la búsqueda integrada en el sistema) mientras el resto solamente podrán buscar mediante búsquedas escritas en pantalla. Los países que tendrán a Siri como control del Apple TV en esta primera oleada son: Australia, Canadá, Francia, Alemania, Japón, España, Reino Unido y Estados Unidos.

AppleTV Remote

El trackpad del mando es capaz de hacer los gestos de deslizamiento en cualquiera de los cuatro ejes (swipe) y tocar para seleccionar, además de pulsar y mantener para ofrecer opciones contextuales. Funciona por Bluetooth, tiene una duración de la batería de 3 meses y se recarga por un conector lightning como un iPhone o iPad.

TVML, apps cliente-servidor para el Apple TV en XML y Javascript

Una de las grandes sorpresas del sistema tvOS es cómo se construyen las apps. Podemos usar una serie de librerías nativas de iOS 9, pero la recomendación de Apple es que si nuestra app está orientada a servicios y funciona en estructura cliente-servidor, optemos por crear aplicaciones a través de TVML, un nuevo framework pensado y concebido exclusivamente para el TV.

Las apps TVML tienen 3 capas o componentes para ser creadas:

  • TVML, que es una versión propia de XML de Apple que permite construir interfaces para el TV basadas en una serie de plantillas predefinidas que el propio sistema ofrece (18 en total, por ahora). TVML es Television MarkUp Language.
  • TVJS, librerías Javascript que se integran en TVML y que definen los comportamientos que tendrá nuestra interfaz creada en TVML.
  • TVMLKit, librería propia del sistema que conecta la parte Javascript con nuestro código nativo de aplicación para realizar funcionalidades (como reproducir un vídeo, por ejemplo).

Las apps TVML soportan trabajar con los actuales estándares de cliente/servidor como HTTPS, XMLHTTPRequest, DOM o JavaScript, de forma que podemos obtener los contenidos que necesitemos de nuestro servidor y servirlos a la app creada a partir de páginas que se interconectan unas con otras en diferentes páginas TVML, cada una basada en una de las plantillas predefinidas y que crean un organigrama completo de navegación al más puro estilo storyboard de iOS.

Pongamos como ejemplo una plantilla de compilación de elementos (una de las disponibles). Está pensada para mostrar la información de un producto que a su vez está compuesto de distintas partes, como un álbum y sus correspondientes canciones o una serie y sus diferentes episodios.

Plantilla Compilación

Esta interfaz tiene dos columnas separadas en toda su distribución a izquierda y derecha. La columna de la izquierda tiene una cabecera con la información principal y debajo una sección en dos partes: una cabecera o título y debajo una lista de elementos. A la derecha tenemos un área de contenido relacionado que podrá cambiar con cada elemento que seleccionemos de la lista y debajo de ese área, un zona de botones de acciones. Definiríamos la interfaz a través de un XML (TVML) tan simple como el siguiente:

Uniendo los diferentes TVML generados por cada plantilla, el código Javascript que recoge los eventos de la interfaz y la conexión con el código nativo en Swift, Objective-C o cualquiera de los lenguajes soportados por Xcode, podemos construir apps para el Apple TV que permitan tener una experiencia común entre diferentes aplicaciones y personalizar nuestra interfaz a nuestro propio y personalizado look & feel.

Tal como nos enseñaron en la keynote, estas apps están pensadas para funcionar en modo cliente-servidor contra nuestra propia página o sistema (siempre en modo seguro HTTPS), de forma que pueden ser susceptibles para crear versiones para el Apple TV de tiendas virtuales que permitan comprar, servicios de vídeo bajo demanda que invoquen y controlen procesos en servidores de validación y mucho más.

En este sistema tendremos apps para comprar en Amazon, por ejemplo, o aplicaciones nativas para cualquier tipo de proveedor de contenidos que tenga su contenido a través de HTTP Live Streaming o FairPlay: en España, la apps de servicios como Yomvi o Wuaki TV deberán estar construidas sobre este framework u otras que usen servicios en la nube como redes sociales o Spotify (por poner algunos ejemplos).

Apps nativas para el Apple TV

La otra forma de hacer aplicaciones para el Apple TV es usar determinadas librerías que forman parte de iOS 9 y que están disponibles en tvOS. Podemos usar cualquiera de las siguientes librerías: Accelerate, AudioToolbox, AudioUnit, AVFoundation, AVKit, CFNetwork, CloudKit, CoreAudio, CoreBluetooth, CoreData, CoreFoundation, CoreGraphics, CoreImage, CoreLocation, CoreMedia, CoreVideo, Darwin, Dispatch, Foundation, GameController, GameKit, GameplayKit, MachO, MediaPlayer, MobileCoreServices, ModelIO, OpenGLES, SceneKit, Security, SpriteKit, Swift Standard Library, SystemConfiguration, StoreKit y UIKit.

MLB.com Apple TV

Pero ojo, no pensemos que será una tarea trivial. Apple tendrá la potestad de rechazar la idoneidad de nuestra app si esta no se adapta a la forma de navegación del nuevo Apple TV en lo que se denomina: Focus Engine. El concepto principal que hemos de entender es que las apps de un TV tienen una contextualización e interfaz muy diferente a un dispositivo u ordenador. Nuestras apps para el TV tienen que estar pensadas para navegar por ellas a través de diferentes vistas, como una especie de mosaico UICollectionView en donde el propio tvOS, basado en la colocación de elementos, será capaz de intuir y crear la navegación entre estos de manera automática gracias al control remoto.

Mientras una interfaz convencional de dispositivo móvil u ordenador espera eventos de múltiples elementos y podemos seleccionar cualquiera de ellos (seleccionable) en el orden que se nos antoje, una interfaz de TV tiene un foco único. Esto significa que por muchos elementos que haya, el usuario solo podrá pulsar o seleccionar un único elemento a la vez y siempre basado en una navegación intuitiva basada en direcciones de movimiento. Y no hemos de olvidar que dicha interfaz podría ser manejada por varias personas a la vez o que varias personas miren al mismo tiempo y tienen que entender dónde está el foco de la navegación.

Para ello tendremos que definir, a través de elementos UIFocusEnvironment como será nuestra navegación por la interfaz sobrescribiendo en nuestra propia vista las delegaciones de este protocolo: preferredFocusedView para definir el punto de inicio, shouldUpdateFocusInContext: para definir a qué elementos se puede navegar o no, o incluso didUpdateFocusInContext:withAnimationCoordinator: para capturar actualizaciones de la propia app y actuar en consecuencia incluso variando el foco.

Como podemos ver, no es tan sencillo pero eso no quita que podamos construir las apps con coherencia de navegación. Lo importante que hemos de entender, es que la experiencia de usuario cambia y hemos de ser consecuentes.

Juegos

Esta es la parte más simple: los juegos no necesitan más que verse bien en una pantalla 1080p porque usemos recursos gráficos del iPhone 6 Plus en modo @3x. Poco más. No obstante, las apps de tvOS por ahora tienen un target diferente, lo que implica que la app no es Universal y es una versión específica para el Apple TV. En la presentación Apple dijo que las apps del Apple TV (en el caso de ser nativas) podrán ser universales y que con una sola compra se tendrían todas las versiones, por lo que entendemos que esto será, por ahora, algo que tendrá que cambiar. No obstante, podemos decir que nuestra app sea solo para el Apple TV.

En principio, Apple soporta todo el conjunto de herramientas del framework GameKit entre las que incluye Metal, SceneKit (3D casual), SpriteKit (2D) e incluso OpenGL ES, lo que implica que otras herramientas de terceros como Cocos2D-x o derivados podrán también acceder a sacar partido del nuevo dispositivo de Apple. Crossy Road (mostrado en la keynote) está desarrollado en Unity, por lo que entendemos que una futura actualización del mismo soportará también tvOS y como esté, Unreal hará lo propio en su momento.

Solo hay dos cosas a tener en cuenta: la primera es la forma de manejar el juego. Actualmente se usan detectores multi-touch que nos avisan de cuando se pone el dedo, se mueve, se levanta o el dedo cancela su navegación porque sale de la zona “tocable” de la pantalla. Pero el nuevo mando del Apple TV cambia las cosas y hemos de tener en cuenta la inclusión de los gestos de este. Por un lado, los swipe se siguen detectando con los mismos reconocedores de gestos, esta vez asociados a la vista completa que contenga el juego. Al ser el mando sin pantalla ni cálculo de precisión, detectar los gestos de manera genérica es más que suficiente.

Juegos tvOS

En el caso de la presión de la zona táctil, tenemos nuevas funciones a sobrescribir llamadas pressesBegan(), pressesEnded(), pressesChanged() y pressesCancelled(), que nos ayudan a gestionar las presiones y toques en el mando. Con respecto al giroscopio y los sensores de movimiento, igualmente se manejan con los mismos reconocedores que se usan actualmente para el iPhone.

¿Y el multijugador? Bien. Como vimos en la presentación, juegos como Crossy Road podían ser jugados por varios jugadores a la vez. Para hacer esto, aunque se use un iPhone o un iPod Touch, se usará una app Apple TV Remote que se podrá bajar en su momento de la App Store (no sabemos si será la misma que ya existe con nuevas opciones o una nueva) que convertirá el iPhone o el iPod Touch en un mando del Apple TV que para la programación será indistinguible. No habrá que crear formas diferentes, simplemente tener en cuenta y preguntar cada vez que salte un nuevo evento provocado por un mando, qué número de mando es el que ha generado este cambio. Nada más.

Por otro lado, en el tema de los mandos inalámbricos Bluetooth, que también pueden ser usados, la cosa no cambia a como funcionaba hasta ahora en cualquier dispositivo iOS. Si ya hicimos la implementación para nuestro juego, no hay que cambiar una sola línea de código.

Restricciones y recursos bajo demanda

Los Apple TV vendrán con configuraciones de 32GB y 64GB. Más que suficiente para tener una buena cantidad de juegos. Si hacemos una regla de tres y vemos que las consolas actuales de nueva generación como la Xbox One o la PS4 incorporan discos de 500GB pero cada juego ocupa una media de 25 a 30GB instalado en él (si no, más) podemos contar que el nuevo Apple TV será capaz de tener instalados más juegos incluso (a la vez) que estas nuevas consolas (no vamos a comparar dichos juegos porque no se puede).

Pero el quid del Apple TV es otro: ningún juego o app que use almacenamiento nativo puede ocupar más de 200MB. ¿Significa eso que Apple está limitando? No. Significa que la carga inicial de nuestra app o juego (lo que se instala) no podrá superar nunca los 200MB y que el resto de contenidos han de estar implementados mediante On-Demand Resources o recursos bajo demanda, que ya vimos en su momento cuando hablamos del App Thinning.

Nuestro juego podrá ocupar lo que queramos, pero si el juego entero ocupa 1GB, tendremos que “trocearlo” para que el mismo juego tenga una instalación inicial de 200MB y mientras el jugador avanza vaya solicitando online el resto de recursos para el dispositivo, marcando como “prescindibles” los que ya no vayan a usarse.

On Demand Resources 2

Y otra restricción: las apps del Apple TV no tienen zona de almacenamiento de escritura. Es decir, una app o juego jamás podrá escribir en la zona de disco que en iOS tienen reservadas todos los desarrollos. No existe el NSFileManager e incluso el NSUserDefaults no garantiza que la persistencia de datos esté disponible la próxima vez que abras la app porque las zonas de almacenamiento son borradas a conveniencia del dispositivo y del sistema.

La única forma de conseguir persistencia de datos es usar iCloud, CloudKit o nuestro propio servicio de backend donde almacenar estos datos. Por este motivo Apple dijo que las partidas y progresiones estarían disponibles entre diferentes dispositivos. Y por este motivo, si tenemos varios Apple TV y jugamos a un juego, la partida o datos del juego se propagarán automáticamente entre estos.

En el caso que necesitemos algo sencillo, como un sustituto del NSUserDefaults podemos usar el almacenamiento de claves de iCloud, cuyo límite de 1MB es más que suficiente, recordando siempre que este estará limitado al usuario en sí. Para compartir más datos, o bien creamos nuestro propio backend (apropiado si tenemos un juego multiplataforma) o usamos CloudKit para almacenar lo que necesitemos. Si lo pensamos fríamente, veremos que tiene mucho sentido en un dispositivo cuyo principal modo de funcionamiento le hace estar permanentemente conectado a la red.

tvOS, el futuro de la TV

Vistas todas las posibilidades y limitaciones, sin duda se abre un panorama ideal para los desarrolladores de entrar en un nuevo dispositivo y nuevo mercado, donde podemos usar frameworks muy sencillos e intuitivos como TVML para crear aplicaciones que se adapten a la usabilidad del TV y aprovechen nuestras posibles actuales infraestructuras de servicios cliente-servidor, o en caso de querer apps o juegos, solo tenemos que hacer algunas adaptaciones.

tvOS App Store

Lo importante aquí es el concepto: hacer un Candy Crush para el Apple TV es completamente absurdo, porque el juego en sí depende de un dispositivo puntero o dedo que mueva los elementos. Sería algo tan absurdo como un Plantas Contra Zombies donde hay que mover un cursor (que existe, por otro lado, para Xbox 360). En el caso de las apps, no todo tiene por qué tener una solución plausible. Desde luego, los ejemplos que pusieron en la presentación eran bastantes buenos: una tienda virtual basada en TVML y una app nativa de MLB.com con integración de vídeo con menús, transmisiones en directo e información en tiempo real.

En nuestro criterio está discernir si realmente merece o no la pena sacar algo para el nuevo Apple TV, pero las herramientas ya están aquí y si tenemos suerte en el sorteo que Apple está realizando de los kits de desarrollo, podremos probar insitu los desarrollos. Si no, tenemos simulador de tvOS en Xcode 7.1, y también del mando. Además, intuyo que dentro de poco podremos usar el propio iPhone para simular un mando y probar, entre otras cosas, los modos multijugador.

Por nuestra parte, os anunciamos que ya estamos trabajando en un cuarto libro sobre cómo programar apps para tvOS, en todos estos modos. Y por cierto, si tenéis una empresa o queréis hacer una aplicación para este nuevo entorno, en Gabhel Studios ya tenemos consultoría al respecto, formación de desarrollo para el nuevo tvOS y podéis contar con nuestros servicios. Solo tenéis que usar el formulario de contacto para solicitar información al respecto sin ningún compromiso.

Se abre una excelente oportunidad de negocio, así que ya sabéis, probad, practicad y Good Apple Coding.

Acerca de Julio César Fernández

Analista, consultor y periodista tecnológico, desarrollador, empresario, productor audiovisual, actor de doblaje e ingeniero de vídeo y audio.

Otras recomendaciones

Swift 3.1

Swift 3.1 ha llegado, análisis de todos sus cambios

Swift 3.1 ha llegado de la mano de la hornada de actualizaciones lanzadas por Apple. Analizamos sus cambios más importantes e incorporaciones más destacadas. Nuevas formas de convertir closures que no escapan en los que sí lo hace, conversiones seguras de números, genéricos más eficientes... descubre en nuestros análisis con ejemplos concretos todos los cambios y descúbrelos por ti mismo.