Diego Salazar


ios 9 logo

iOS 9: ¿Qué es lo nuevo?

Si estás al tanto de lo últimas noticias de Apple habrás visto en que en el WWDC15 fue anunciado Swift 2 junto a iOS 9 y Xcode 7. Así que si quieres empezar desde ya a conocer los cambios en este Sistema Operativo, te los mostraré.

Extensión de búsqueda

Finalmente (finalmente!) podemos conectar nuestras aplicaciones directamente con Spotlight para una búsqueda integrada en todo el sistema, y viene en forma de CoreSpotlight. Pero no te hagas ilusiones: Spotlight no indexa todos los datos por arte de mágia, mientras que te sientas a rascarte el ombligo. Necesitamos especificar exactamente lo que vamos a exponer al “mundo exterior”

Es más, Apple está enfocando esta tecnología en cosas que serán de gran ayuda para el usuario directo, entonces tendrás que analizar muy bien lo que indexarás en Spotlight. No sé cómo funciona el algoritmo, pero Apple ha dicho que iOS va a monitorear automáticamente qué tan frecuentemente los usuarios interactúan con nuestros resultados de búsqueda, y si contantemente estamos mostrando resultados inútiles porque indexamos mediocremente la información, quizás dejen de aparecer los resultados.

ios-9
Para empezar crea una instancia de la clase CSSearchableItemAttributeSet, dale un título y una descripción (contentDescription). Luego lo ‘wrappeas' en un CSSearchableItem, antes de pasarlo al CSSearchableIndex usando el método de indexSearchableItems

Si un usuario pulsa en una de tus resultados de búsqueda in Spotlight, tu app se lanzará con un nuevo callback delegado: application:continueUserActivity:restorationHandler:. Si el tipo de actividad de NSUserActivity que se pasa coincide con CSSearchableItemActionType, inmediatamente podrás dirigir al usuario al contenido relevante al extraer la clave de CSSearchableItemActivityIdentifier del diccionario de actividad userInfo.

Si prefieres leer el código, aquí está un ejemplo

let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeImage as String)
attributeSet.title = "Mi Gran Contenido"
attributeSet.contentDescription = "Esto es algo que estaras buscando."

let item = CSSearchableItem(uniqueIdentifier: "TU IDENTIFICADOR DE CONTENIDO UNICO AQUI", domainIdentifier: "co.com.diegosalazar", attributeSet: attributeSet) CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([item]) { (err: NSError?) -> Void in print("Item de busqueda indexado exitosamente!") }

Tendrás que importar CoreSpotlight y MobileCoreServices para que el código funcione. También necesitarás reemplazar “TU IDENTIFICADOR UNICO DE CONTENIDO AQUI” con algo significativo que identifique este contenido únicamente, así cuando el usuario lance nuestra app desde Spotlight, sabremos que buscar.

Aquí hay un código para insertar en nuestro delegado de app para cargar contenido después de una busqueda en Spotlight:

1     func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
2         if userActivity.activityType == CSSearchableItemActionType {
3             let uniqueIdentifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier]
4             print("Haz cosas con (uniqueIdentifier)")
5         }
6   
7 return true 8 } 9

De nuevo verifica que importaste CoreSpotlight para que tu código compile. Ahora entenderás porqué el identificador único es tan importante: Es para que nuestra app sea delegada para poder cargar el contenido correcto.

Hay varias extensiones de CSSearchableItemAttributeSet para codificar información como los eventos y coordenadas de mapa, siendo una de las grandes mejores en iOS 9. Para ver qué tanta información podemos codificar presiona Shift+Cmd+O y escribe CSSearchableItemAttributeSet luego espera que aparezca los resultados - verás eventos, media, imágenes, lugares y más.

Adelgazamiento de Apps (App Thining)

Las apps universales (aka “binarios gordos”) siempre ha significado que Apple encapsula un solo paquete de app que contiene toda la información y código para que corra en cualquier dispositivo. Así que desde que se lanzó el iPad se incluye en cualquier app de iPhone todos los contenidos de iPad así no se use (qué desperdicio!).

Cuando el numero de dispositivos soportados era bajo (iPhone sin retina y iPad sin retina) esto no era problema, y si no eramos inteligentes con la multimedia a la mayoría de usuarios no les importaba. Pero como los dispositivos han aumentado, cada app ahora incluye iPhone retina, iPhone retina HD, iPad sin retina y iPad retina, todo en un solo paquete, sin importar el dispositivo siempre se muestra un conjunto de contenidos.

Los desarrolladores hemos pedido alguna solución en esto a Apple: Adelgazar las apps nos asegura que el usuario solo descargue los componentes requeridos para ejecutar la app en un dispositivo específico, lo que significa que un iPhone retina (4s, 5, 5s, 6) descargará solo los contenidos de retina. El resultado: apps más pequeñas, descargas más rápidas y usuarios con una carita feliz :D.

Pero App Thining es más sorprendente con Xcode 7, porque al sur nuestra app iTunes conecta un estado intermediario llamado Bitcode. Cuando los usuarios descarguen nuestra app, la App Store automáticamente produce una version optimizada de nuestra app (ej: 64-bit) para coincidir con el dispositivo que usa el usario.

Apple no se queda ahí y nos brinda más ventajas: Podemos hostear contenidos de nuestras apps en iTunes Connect y requerido cuando se necesite.

Videojuegos

enter image description here - GameplayKit

Este es uno de los cambios más sorprendentes en iOS 9. GameplayKit es sorprendente por lo que hace: Está diseñado para facilitar agregar lógica de alto nivel a nuestros juegos sin tener que codear los algoritmos, o sea sin reinvetar la rueda. ¿Estado de maquinas? Hecho; ¿Randomización? Listo. ¿Encontrar path? Listo.

enter image description here - ReplayKit

Para grabar video del contenido que el usuario crea y compartirlo en linea.

enter image description here - Model I/O

Contiene materiales físicamente basados, modelos e iluminación para SceneKit, GameplayKit, y Metal que podemos integrar en nuestras apps.

enter image description here SFSafariViewController

Es un Safari embebido dentro de nuestras apps, exponiendo muchas mas comportamientos que los usuarios esperarían, como Cookies, formas AutoFill, y Modo Lectura.

Pruébalo ahora mismo, necesitarás hacer cuatro cosas, Primero, llamar al framework SafariServices así:

import SafariServices

Segundo, haz que tu view-controller pertenezca al SFSafariViewControllerDelegate, así:

class ViewController: UIViewController, SFSafariViewControllerDelegate {

Tercero, crea y muestra el SFSafariViewController, apuntando a una URL que prefieras.

let sfc = SFSafariViewController(URL: NSURL(string: "http://diegosalazar.com.co")!)
sfc.delegate = self
presentViewController(sfc, animated: true, completion: nil)

Finalmente usa el callback delegado safariViewControllerDidFinish(), que es ejecutado cuando el usuario toca el botón por defecto “Done”

Una de las interesantes características de SFSafariViewController es que viene con el modo de lector incorporado, y en realidad se puede navegar directamente a esa vista utilizando este código:

UIStackView

Los desarrolladores de Android han tenido durante mucho tiempo un sistema de diseño llamada LinearLayout, donde se agrega vistas a una supervista y automáticamente quedan colocadas ya sea debajo de la otra, o de lado a lado. No hemos tenido una buena solución como ésta en iOS - table views son en gran medida información de apilamiento vertical, pero, por supuesto, sumamente limitado en cuanto a su contenido.

Con UIStackView, todo eso ha cambiado: ahora podemos agregar una serie de vistas a un supervista, especificar la cantidad de separación que deseamos entre ellos, y Auto Layout maneja el resto por nosotros. Tenemos la oportunidad de elegir si queremos las subvistas de tamaños iguales (.FillEqually) o tamaños proporcionales (.FillProportionally) basado en el tamaño de sus contenidos intrínsecos. También podemos elegir si las subvistas se llenen horizontal o verticalmente, y se puede cambiar de opinión más adelante.

Nota importante: UIStackViews no se desplazan, sólo actúan como contenedores que ajustan automáticamente su contenido.

UICollectionViews pueden comportarse como UITableViews

Con un simple propiedad booleana para UICollectionViewFlowLayout, sectionHeadersPinToVisibleBounds, ahora podemos hacer que un layout flow funcione de la misma manera como UITableView: sus encabezados de sección se adhieren a la parte superior de la pantalla mientras el usuario se desplaza dentro de esa sección, y sólo se retira cuando la siguiente sección aparece. Un poquito demorada, pero al menos está aquí ahora.

UICollectionViews ahora tienen fácil reordenamiento

Asigna la propiedad installsStandardGestureForInteractiveMovement a true en tu UICollectionViewController y da a los usuarios la capacidad de reordenar sus items.

SKAudioNode

Una de las principales molestias de SpriteKit ha sido su sistema de audio simplista. En iOS 8, por ejemplo, podemos reproducir sonidos, pero no detenerlos, y Dios no quiera que queramos controlar el sonido de alguna manera. Pues bien, en iOS 9 tenemos SKAudioNode al rescate: no sólo se puede hacer una pausa y dejar de sonar (hurra!) Sino también se puede establecer su propiedad posicional a true para que el sonido ajuste en base a la posición del nodo en la escena. Sí: SpriteKit ahora con audio 3D.

Un montón de pequeños cambios

Una de las cosas favoritas que hago cuando Apple lanza una nueva versión de iOS es leer la lista completa de los cambios en la API, en busca de todas las pequeñas mejoras y ajustes que Apple hace cada año. Éstos son algunos de los cambios que llegaron a mí este año:

  • UIViewController tiene ahora un método addKeyCommand() para registrar UIKeyCommands en los view controllers - El cielo para los usuarios con teclados externos.
  • MKMapView.showsTraffic: ponemos a true, y muestra el tráfico. Simple, pero poderoso.
  • CIFeatureTypeText suena como que Apple ha añadido una especie de OCR para iOS, pero por desgracia, sólo te da los límites donde se encontraba el texto. Es un paso adelante, aunque pequeño.
  • Basta con mirar a AVFoundation. Vamos, mira y llora lágrimas de alegría.