Actualización de aplicaciones iOS con GroundControl

El envío de una actualización a la App Store es inevitable si desea agregar mejoras importantes a una aplicación. Sin embargo, es complicado y lleva mucho tiempo pasar por el proceso de revisión de la App Store para realizar modificaciones simples. En este artículo, le mostraré cómo actualizar una aplicación de forma remota utilizando el proyecto GroundControl.


Introducción

La idea detrás de GroundControl es simple, la aplicación obtiene una lista de propiedades remotas y actualiza su NSUserDefaults Con los contenidos de la lista de propiedades. Aunque muchas aplicaciones descargan datos de un backend dedicado para actualizar dinámicamente sus contenidos, la estrategia que describiré en este artículo es ideal si un backend dedicado no es una opción o excede los requisitos de su aplicación..

La configuración discutida en este tutorial es liviana y económica. No solo es barato, sino que también es fácil de mantener, que es un factor que los clientes y los desarrolladores suelen pasar por alto..

Es importante enfatizar que las listas de propiedades son ideales para pequeños fragmentos de datos y no deben usarse como reemplazo de un backend dedicado. Si una aplicación necesita actualizarse diariamente con nuevo contenido, entonces la estrategia que se analiza en este tutorial no la eliminará..

Para ilustrar cómo encajan todas las diferentes piezas, construiremos una aplicación iOS con el nombre apropiado Control remoto. A pesar de que la aplicación en sí misma no hará mucho, al integrar GroundControl para actualizar la aplicación. NSUserDefaults quedará claro lo fácil que es actualizar una aplicación de forma remota con muy pocos gastos generales. Empecemos.


Paso 1: Configuración del proyecto

Crea un nuevo proyecto en Xcode seleccionando el Solicitud de vista única Plantilla de la lista de plantillas (figura 1). Nombra tu aplicación Control remoto, ingrese un identificador de compañía, establezca iPhone Para la familia de dispositivos, y compruebe Utilice el conteo automático de referencias. Asegúrese de desactivar las casillas de verificación restantes para este proyecto. Dile a Xcode dónde quieres guardar tu proyecto y pulsa el botón Crear botón (figura 2).


Paso 2: GroundControl

El nombre Mattt Thompson puede sonarle familiar. Es uno de los creadores y la fuerza impulsora detrás de AFNetworking, la biblioteca de redes más popular para iOS y OS X. GroundControl está construido sobre AFNetworking y ofrece una solución fácil para configurar una aplicación de forma remota mediante la actualización de la aplicación. NSUserDefaults. Lo hace a través de una categoría en NSUserDefaults, Que permite NSUserDefaults para actualizarse de forma asíncrona con una lista de propiedades remotas.

No importa dónde se encuentre la lista de propiedades, siempre que se pueda acceder a ella a través del protocolo HTTP (S) y el tipo de contenido de la respuesta esté configurado en aplicacion / x-plist.

En la página de GitHub de GroundControl, Mattt proporciona dos ejemplos de cómo implementar el lado del servidor de la historia, una implementación de Ruby y una implementación de Python. Sin embargo, le prometí que la configuración sería ligera y económica. En lugar de utilizar un servidor que necesita mantener, usaremos Servicio de almacenamiento simple de Amazon o S3. Como expliqué anteriormente, los requisitos son simples, es decir: (1) el archivo debe ser una lista de propiedades y (2) el tipo de contenido de la respuesta debe ser aplicacion / x-plist. S3 de Amazon es un ajuste perfecto.

AWS S3 no solo se adapta perfectamente a la entrega de archivos estáticos, sino que también ha ganado sus franjas a lo largo de los años. Incluso si su aplicación llega al top 10 en la App Store, S3 seguirá ofreciendo la lista de propiedades sin problemas. Antes de dirigirse a la Consola de AWS (Amazon Web Services), su primera necesidad de integrar GroundControl en su proyecto.


Paso 3: Agregar AFNetworking y GroundControl

GroundControl está construido sobre AFNetworking, lo que significa que necesita agregar AFNetworking a su proyecto Xcode. Aunque podríamos agregar AFNetworking y GroundControl usando CocoaPods, agregaremos ambas bibliotecas manualmente ya que algunos de ustedes pueden no estar familiarizados con CocoaPods. Descargue la última versión de AFNetworking y GroundControl y arrastre cada biblioteca a su proyecto Xcode. Asegúrese de copiar el contenido de la carpeta en su proyecto marcando la casilla de verificación etiquetada Copie los elementos en la carpeta del grupo de destino (si es necesario) y no olvide agregar ambas bibliotecas al objetivo de control remoto (figuras 3 y 4).

AFNetworking se basa en el Configuración del sistema y Servicios básicos móviles Marcos para algunas de sus funcionalidades. Por lo tanto, es necesario vincular su proyecto con esos marcos. Seleccione su proyecto en el Navegador de proyectos y seleccione el Control remoto objetivo de la lista de objetivos. Escoger Construir fases en la parte superior, abre el Enlace Binario Con Bibliotecas del cajón, y agregue ambos marcos a su proyecto (figura 5).

Antes de que podamos comenzar a trabajar con AFNetworking y GroundControl, debemos actualizar el proyecto. Prefijo.pch archivo agregando una declaración de importación para los marcos que acabamos de agregar al proyecto. Echa un vistazo a los fragmentos de abajo para aclarar.

 // // Encabezado de prefijo para todos los archivos de origen del objetivo 'Control remoto' en el proyecto 'Control remoto' // #import  #ifndef __IPHONE_4_0 #warning "Este proyecto usa funciones solo disponibles en iOS SDK 4.0 y posteriores". #endif #ifdef __OBJC__ #import  #importar  #importar  #importar  #terminara si

Paso 4: Integración de GroundControl

Comenzamos agregando dos declaraciones de importación al archivo de implementación del delegado de la aplicación, una para AFNetworking y otra para GroundControl. Si terminas usando AFNetworking en varios lugares de tu proyecto, entonces sería una buena idea agregar la declaración de importación para AFNetworking a las de tu proyecto. Prefijo.pch expediente.

 #import "AFNetworking.h" #import "NSUserDefaults + GroundControl.h"

Integrar GroundControl es la parte fácil, ya que solo requiere dos líneas de código. En la solicitud del delegado. applicationDidBecomeActive: método, llamamos un método auxiliar para inicializar GroundControl.

 - (void) applicationDidBecomeActive: (UIApplication *) application // Initialize GroundControl [self initializeGroundControl]; 

El método de ayuda no podría ser más fácil gracias a la categoría en NSUserDefaults proporcionado por GroundControl. Creamos la URL para la lista de propiedades y la pasamos como un argumento en registrarseDefaultsWithURL:. Esto asegurará que la lista de propiedades se descargue de forma asíncrona. Una vez descargado, NSUserDefaults Se actualiza automáticamente con el contenido de la lista de propiedades..

 - (void) initializeGroundControl NSURL * url = [NSURL URLWithString: @ "https://www.example.com/RemoteControl.plist"]; [[NSUserDefaults standardUserDefaults] registerDefaultsWithURL: url]; 

Otra opción es llamar. registerDefaultsWithURL: éxito: error: en su lugar, si prefiere trabajar con devoluciones de llamada de éxito y fracaso. Para aún más control, GroundControl proporciona un tercer método, registerDefaultsWithURLRequest: success: failure:. Este método acepta una instancia de NSURLRequest así como un bloque de éxito y fracaso..

Podría sorprenderlo, pero la integración de GroundControl fue la parte difícil. Los últimos dos pasos son (1) crear la lista de propiedades y (2) subirla al S3 de Amazon.


Paso 5: Crear una lista de propiedades

Crea un nuevo archivo en Xcode seleccionando el Recurso pestaña a la izquierda y eligiendo Lista de propiedades a la derecha (figura 6). Nombra el archivo Control remoto y guárdalo en el escritorio de tu computadora. No es necesario agregarlo a su proyecto Xcode. La forma más fácil de editar la lista de propiedades es en Xcode. Eche un vistazo a la captura de pantalla a continuación para ver cómo se ve y se puede editar la lista de propiedades en Xcode (figura 7). Tenga en cuenta que una lista de propiedades solo puede contener valores booleanos, fechas, números, datos binarios, cadenas, matrices y diccionarios. Es una buena práctica colocar las teclas en el espacio de nombres (por ejemplo, con el prefijo de clase del proyecto) para asegurarse de que no entren en conflicto con otras entradas almacenadas en NSUserDefaults.

Paso 6: Subir la lista de propiedades

Para utilizar los servicios web de Amazon, necesita una cuenta de Amazon. Los costos asociados con el S3 de Amazon son extremadamente bajos y es probable que ni siquiera se le cobre por un tiempo considerable ya que la lista de propiedades solo tiene un tamaño de unos pocos kilobytes.

Puede cargar la lista de propiedades en Amazon S3 utilizando la consola AWS de Amazon o usando una aplicación que admita el S3 de Amazon, como la fantástica transmisión de Panic..

Después de cargar la lista de propiedades, quedan tres cosas por hacer, (1) copiar la URL de la lista de propiedades, (2) otorgar acceso público a la lista de propiedades y (3) configurar el tipo de contenido correcto.

Copia la URL

En la consola de AWS, seleccione la lista de propiedades y haga clic en Propiedades botón en la parte superior derecha. Seleccione la pestaña llamada Detalles en el panel de propiedades (figura 8). Copie el enlace de la lista de propiedades y actualice el initializeGroundControl Método en la aplicación delegado con la URL correcta..

Otorgar Acceso Público

Seleccione la pestaña llamada Permisos en el panel de propiedades y agregue un nuevo conjunto de permisos a la lista de propiedades haciendo clic en Añadir más permisos botón. Coloque el concesionario en Todo el mundo y limitar los permisos a Abrir / Descargar. Esto asegurará que su aplicación pueda descargar la lista de propiedades. No olvide hacer clic en el botón Guardar para propagar los cambios..

Establecer tipo de contenido

Seleccione la pestaña llamada Metadatos en el panel de propiedades y establecer el valor de la clave Tipo de contenido a aplicacion / x-plist. No olvide hacer clic en el botón Guardar para propagar los cambios..


Paso 7: construir y ejecutar

Su aplicación ahora está lista para ser actualizada de forma remota. La forma en que su aplicación responde a los cambios realizados por la lista de propiedades depende de su aplicación. Este artículo solo muestra lo fácil que es actualizar una aplicación de forma remota sin tener que enviar una nueva versión a App Store.

Puedes probar si todo funciona modificando ligeramente el initializeGroundControl método. En lugar de invocar registrarseDefaultsWithURL:, usamos registerDefaultsWithURL: éxito: error: proporcionado por GroundControl. Si ha implementado GroundControl correctamente, el diccionario del bloque de éxito debe contener los datos de la lista de propiedades. Su aplicación es NSUserDefaults se actualizará automáticamente.

 - (void) initializeGroundControl NSURL * url = [NSURL URLWithString: @ "https://s3.amazonaws.com/com.mobiletuts.bartjacobs/RemoteControl.plist"]; [[NSUserDefaults standardUserDefaults] registerDefaultsWithURL: url success: ^ (NSDictionary * defaults) NSLog (@ "Defaults>% @", defaults);  fallo: ^ (error NSError *) NSLog (@ "Error>% @ con información de usuario% @.", error, [error userInfo]); ]; 

Dropbox

El inmenso éxito y la rápida tasa de adopción de Dropbox han dado lugar a la aparición de numerosas aplicaciones inteligentes y útiles. Para las personas que no están familiarizadas con AWS y Xcode, podría ser más fácil trabajar con Dropbox. Aunque Dropbox es una excelente solución y brinda la opción de hacer que un archivo sea de acceso público al colocarlo en la carpeta pública de Dropbox, Dropbox no se puede usar con la versión actual de GroundControl. El motivo es que el tipo de contenido de una lista de propiedades servida por Dropbox se establece automáticamente en Texto sin formato en lugar de lo requerido aplicacion / x-plist. AFNetworking genera un error debido a que el tipo de contenido requerido no coincide aplicacion / x-plist.

Sin embargo, es posible usar Dropbox para actualizar de forma remota una aplicación. La advertencia es que tendrá que hacer parte del trabajo pesado, es decir, descargar de forma asíncrona la lista de propiedades y actualizar las aplicaciones. NSUserDefaults.

A pesar de la utilidad de la carpeta pública de Dropbox, su futuro es incierto. Tampoco está claro si hay un límite de ancho de banda impuesto a los archivos en la carpeta pública de Dropbox. En otras palabras, si desea utilizar Dropbox para actualizar de forma remota una aplicación iOS o OS X, tenga en cuenta que podría fallar en algún momento o que su cuenta de Dropbox podría suspenderse debido a que se superan ciertas limitaciones..


Conclusión

No siempre es necesario crear un backend personalizado para una aplicación iOS o OS X si todo lo que necesita hacer es actualizar un puñado de configuraciones de vez en cuando. Las estrategias analizadas en este artículo demuestran cómo actualizar una aplicación de forma remota con una simple lista de propiedades.

Por supuesto, hay varias otras posibilidades para actualizar de forma remota una aplicación. Por ejemplo, es posible utilizar un servicio como Parse. Sin embargo, me parece que incluso Parse es "demasiado" si todo lo que quieres hacer es actualizar un puñado de configuraciones.