Como arreglar las Apps con fallos de localización (CoreLocation) en IOS8

La historia es la siguiente, tienes una App de IOS que usa los servicios y facilidades de CoreLocation y que funciona perfectamente. De repente los usuairos empiezan a reportarte errores, no funciona la localización,  no carga el mapa, etc. y el denominador común es que todos han actualizado sus sistemas a  a IOS 8. Repasas el código buscando errores propios y no encuentras nada…un consejo…no pierdas el tiempo porque el error no esta en tu código anterior.

Apple tiene la irritante costumbre de pasarse por el arco del triunfo con cierta frecuencia la retrocompatibilidad de las Apps ya publicadas y probadas ante actualizaciones importantes de IOS. Introducen cambios que obligan al desarrollador a cambiar el código de sus apps ya aprobadas y publicadas…y lo hacen bastante a menudo. Cada vez que llega una actualización realmente importante yo tiemblo…

En este caso le ha tocado a CoreLocation, las apps desarrolladas para IOS 7 y anteriores que utilizan esas librerías deben ser reescritas en parte ya que en iOS 8, este código no sólo falla, sino que falla en silencio. El usuario no recibirá ningún error o advertencia, no siempre obtendrá una actualización de posición y no se entiende por qué. La app ni siquiera le pedirá permiso para usar ubicación. Tengo experiencia con Core Location, bastante, y la verdad es que me llevo mas de un día averiguar el porque de este comportamiento y dar con la solución.

El CLLocationManager, introducido en IOS2, siempre ha trabajado de la misma manera: Crear, delegar, empezar, esperar. Hasta IOS7 esto ha seguido funcionando sin problemas.

// Import CoreLocation framework

// Crear
self.locationManager = [[CLLocationManager alloc] init];
// Delegar
self.locationManager.delegate = self;
// Empezar
[self.locationManager startUpdatingLocation];

// Esperar
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    NSLog(@"%@", [locations lastObject]);
}

Sin embargo, en iOS 8 hay ademas que hacer cosas adicionales para obtener la ubicación.Hay que agregar una clave para su autorización en el Info.plist de la APP. Realmente hay dos claves Info.plist para la nueva autorización ubicación, a partir de ahora es obligatorio al menos tener una de las dos definidas. Si ninguna están ahí, se puede llamar a startUpdatingLocation sin error alguno pero en realidad el LocationManager en no se iniciará, y no dará error…

Así que lo primero que tienes hay hacer es añadir una o ambas de las siguientes claves al Info.plist:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

NSLocationWhenInUseUsageDescription

Ambas claves reciben una cadena que es una descripción de por qué necesita los servicios de localización, o bien solo cuando se necesite (WhenInUse)  o bien siempre (Always). Puedes poner el motivo de porque esa app necesita localizar, algo como “Esta app solicita su ubicación para blablabla”

Una vez hecho esto, en el código se tiene que solicitar autorización para el método de localización correspondiente (WhenInUse o Always):

[self.locationManager requestWhenInUseAuthorization]
[self.locationManager requestAlwaysAuthorization]


		
Si tu aplicación funcionaba bien antes de la actualización y localizaba correctamente esto, en realidad, es lo único que tendrías que añadir a tu App para que esta vuelva a funcionar correctamente.

Programación IOS… ¿que es Swift?¿y ahora que? Pros y contras

Hace unas semanas Apple nos sorprendió a todos anunciando el lanzamiento/adopción de SWIFT,  un nuevo lenguaje para los desarrollos que se hagan  a partir de IOS 8.  La idea de Apple detrás de este lanzamiento es la de proporcionar a su comunidad  un lenguaje de programación mas potente, flexible, seguro y sencillo de codificar. Para apoyar el anuncio pusieron a disposición de todos un documento de más de 500 paginas ( “The Swift Programming Language” ) descargable gratuitamente  a través de iTunes para que nos pudiéramos ilustrarnos e inicianosr en el mismo.  Además han lanzado un blog para ayudarnos paso a paso a aprender a programarlo.

Después de mucho leer sobre el tema y de empezar a trastear con el, y ya que estamos con una serie de entradas sobre desarrollo IOS,  no quería dejar pasar la ocasión  de comentar mis primeras (primerísimas) impresiones. Sobre todo intentaré poner el foco en las ventajas y desventajas que le veo respecto a lo que la comunidad de desarrolladores IOS estábamos utilizando hasta el momento.

 

Objetive C Vs Swift

 

¿Por que SWIFT?

Con la introducción en los últimos años de novedades como “Automatic Reference Counting”  (bendito ARC), el uso de Storyboards (en vez de .xib) y el uso de Autolayaouts, a mi humilde entender,  Apple ya había simplificado bastante el proceso de desarrollo en aquellas cosas que eran realmente tediosas. ¿Por que ahora esto? Sinceramente creo que Apple pretende simplificar el proceso al máximo, acercándolo a mas y mas gente a base de eliminar la necesidad de manejar elementos y patrones complejos como pudieran ser los punteros, referencias, etc.

 

Compatibilidad

Lo primero que me vino a la cabeza cuando lo estaba leyendo era la compatibilidad. ¿Será compatible con Objetive C? ¿Podrán convivir juntos? Según Apple la respuesta es sí, usará el compilador LLVM de Apple así que su idea es que ambos sean compatibles y convivan de manera que nuestra adaptación se pueda ir haciendo paulatinamente a la vez que los nuevos desarrolladores empiezan a programar IOS con las ventajas de Swift y sin conocimientos de Objetive C. Los desarrolladores que tenemos ya cierta experiencia en una tecnología solemos tener alergia a estos cambios, no por no reciclarnos (eso forma parte de la belleza de esta profesión) sino porque nos horroriza la posibilidad de tener que tirar a la basura nuestras librerías de código. Es por esto que le auguro un lento aterrizaje, por ejemplo yo mismo no me voy a lanzar como un loco a programar en Swift a menos que sea necesario, iré probándolo, usándolo en algunos desarrollos  y adaptando mis librerías poco a poco, sin traumas.

 

Novedades interesantes

Así a primera vista lo que mas me ha llamado la atención es el Developer Playground. Viene a ser un entorno de desarrollo interactivo en el que según vas desarrollando puedes ir viendo los estados de las variables, la salida del programa, un timeline y resultados en tiempo real, sin la necesidad de hacer “debug”. La verdad es que suena bien y esto si que me tienta…

 

Developer Playground

 

¿Diferencias?

Pues todas. La verdad es que con un primer vistazo ya se aprecian diferencias muy notables, Swift a primera vista se me parece mucho mas a lenguajes tipo scripting  como Python o Ruby que a Objetive C con lo que podéis imaginar que las diferencias darían para un montón de posts.  Partiendo de esa base y de que sintácticamente no se van a parecer demasiado, en este post simplemente los enfrentaré en líneas generales.

 

    • Potencia y rendimiento: Sin duda aquí Swift se lleva la palma, posee un nivel de abstracción mayor que Objetive C y, por lo tanto, el rendimiento es mejor.

  • Seguridad: Según Apple Swift es más seguro que Objetive C. Es bastante razonable pensar que pueda ser así, al ser mas estricto e interactivo, igualmente Objetive C viene derivado de Small (años 70) con lo que la afirmación de Apple es bastante verosímil.
  • Sencillez y curva de aprendizaje: En este punto voy a llevar la contraria a Apple. Después de un primer vistazo, por lo menos a mi,  no me parece que sea mas sencillo de aprender ni mucho mas intuitivo que Objetive C, más bien al revés.

 

swift-objective-c

 

En cualquier caso esto es solo una primerísima aproximación. De momento Swift es una sombra en la lejanía que llegará en los próximos meses pero, si Apple cumple con su promesa de compatibilidad y coexistencia pacifica con Objetive C,  supongo que su adopción por parte de la comunidad de desarrollo será lenta y gradual. Al menos yo intentaré aterrizar en Swift pasito a pasito e iré adaptándome y adaptando mis librerías de código poco a poco, sin traumas.

Programación IOS… ¿por donde empiezo? (II): xCode, IOS SDK y Objetive C. ¿Qué son?

Si estas leyendo esto es que ya has decidido adentrarte en el mundo del desarrollo IOS, desde aquí intentare facilitarte un poco el camino poniéndote sobre las pistas correctas para que puedas terminar de indagar y formarte. Mi pretensión con esta entrada es aclararte un poco conceptos básicos para que puedas ampliar información en los sitos correctos.  Por la red hay innumerables recursos dedicados a eso, y sitios como stackoverflow son una fuente inagotable y valiosísima de snipplets, código y recursos. En la entrada anterior veíamos, para empezar,  necesitaría:

  • Un OS X (real o virtualizado).
  • Una cuenta de Apple Developer.
  • Un IDE y el SDK para programar iPhone (xCode + iPhone SDK).
  • Conocimientos básicos de la arquitectura IOS y Objetive C.

 

Arquitectura IOS

En esta vamos intentar aclarar un poco como es el IDE y el SDK para que puedas empezar. IOS, desde la versión 4, esta estructurado en 4 capas (layers).

Capas Arquitectura IOS

 

Cada capa del sistema operativo proporciona un mayor nivel de abstracción del  hardware ofreciendo diferentes frameworks. En general, el nivel más alto de la capa se programa con el menor esfuerzo y menos líneas de código . Una vez identificadas las distintas capas que componen iOS  podemos mirar con más detalle los servicios prestados por cada capa y los frameworks correspondientes que hacen que esos servicios estén disponibles para nosotros.

  • Core OS: es la base de IOS (gestión de memoria, el sistema de ficheros, red y procesos).
  • Core Services: acceso a los servicios básicos.
  • Media: Tareas multimedia (audio, vídeo, OpenGL, imágenes, etc…).
  • Cocoa Touch:   funciones avanzadas como el acelerómetro, gestures,  controles táctiles, vistas, mensajería, etc…

xCode Xcode es el entorno de desarrollo integrado (IDE, en sus siglas en inglés) de Apple y se suministra gratuitamente junto con Mac OS X.  Xcode trabaja conjuntamente con Interface Builder (desde xCode 5 incluye Storyboards) , una herencia de NeXT, una herramienta gráfica para la creación de interfaces de usuario. Xcode incluye compiladores  GNU (GCC), y puede compilar C, C++, Objective-C, Objective-C++, Java y AppleScript mediante una amplia gama de modelos de programación, incluyendo, pero no limitado a Cocoa, Carbón y Java e implementa perfectamente MVC.

No es solo un editor de código, es mucho más ya que viene con una serie de herramientas que te permitirán, sin añadido alguno, codificar, depurar, repositorio y control de código fuente,  tests,  profiling e incluso publicar directamente en la App Store. Cuando lo instalemos y arranquemos veremos que esta dividido en diferentes áreas de trabajo:

 

 

Cada área tiene una función determinada aunque puede albergar mas de una vista/función diferente. Los más importantes de cada área:

  • Toolbar: Barra de herramientas, información  y selector de modo del editor.
  • Navigator area: Navegador de proyecto, información de compilación, gestor de breakpoints  y buscador de código.
  • Editor area: Editor de ficheros, editor de Storyboards (Interface Builder)
  • Debug area: Zona de debug.
  • Utility area: Propiedades, Herramientas, Controles, etc.

 

Como muestra un botón así que os dejo aquí un tutorial muy sencillito pero a la vez muy claro en vídeo de como se usa xCode:

 

 

Ya tenemos claro que arquitectura tiene IOS y como es su IDE pero… ¿y su lenguaje?

 

¿Que es objetive C?

Es un lenguaje de programación orientado a objetos creado como un superconjunto de C para que implementase un modelo de objetos parecido al de Smalltalk. Objective-C se creó para añadir características de la orientación a objetos al lenguaje C (como C++). En comparación con este, Objective-C es más dinámico y difiere la mayor parte de las decisiones hacia el momento de la ejecución, en lugar de hacerlo al momento de la compilación. En general, Objective-C se parece más al lenguaje humano.

Al derivar directamente de C muchas de sus características están presentes en Objective-C:

  • Sentencias de control de flujo (if, for, while…)
  • Tipos de datos fundamentales, estructuras y punteros.
  • Conversiones implícitas y explícitas entre tipos.
  • El ámbito de las variables: Global, estáticas o locales.
  • Las funciones y su sintaxis.
  • Las directivas del preprocesador.

 

Entonces…¿en que se diferencia de otros como C++? La clave de eso viene determinada por su origen en SmallTalk y no es otro que DINAMISMO en mayúsculas, muchas de las tareas que C++ hace en tiempo de compilación Objetive-C las hace en tiempo de ejecución. Objetive C basa su modelo de POO en el envío de  mensajes entre los objetos y no en la invocación de métodos de objetos. Es una diferencia sutil pero crucial para re definir, potenciar  y ampliar conceptos como la herencia y el polimorfismo.

Reconozco que al principio echaba pestes pero con el tiempo he aprendido a apreciarlo. Los bloques de objeto, la forma de tratar las propiedades, el uso de los protocolos, etc.  son otras diferencias cruciales que aportan dinamismo desconocido en C++ u otros lenguajes. En la otra cara de la moneda están temas como la forma de crear, inicializar y destruir objetos (más complicada) o su sintaxis, por lo menos para mí es más incomoda y cuesta acostumbrarse  (por ejemplo olvídate de cosas como  usar + para concatenar strings) .

Os dejo un enlace de Rekkebs BLOG que en su día me gusto bastante y da una lista completa de “curiosidades” que os pueden ayudar a comparar Objetive C con otros lenguajes como Java o C++.

Espero que todo esto os ayude a aclararos un poco y empezar con buen pie vuestra aventura como desarrolladores de IOS.

Programación IOS… ¿por donde empiezo? (I)

En mi anterior entrada os decía que usare el tiempo que dedique al blog para intentar responder aquellas cosas que realmente vea útiles y a mi me hayan ayudado y/o sorprendido. Por ello,sin duda, tengo claro que esta debe ser la primera entrada…la pregunta que los desarrolladores que he tenido a mi cargo (Web, Windows & Android) me han hecho mas veces en los últimos años, la pregunta que yo mismo me tuve que responder a trompicones hace ya 4 o 5 años cuando, por un proyecto de mi empresa, me inicie (forzosamente) en el desarrollo para dispositivos IOS.

A esta pregunta siguieron otras del estilo ¿puedo programar IOS desde Windows?¿que IDE necesito?¿que lenguaje tengo que aprender? y así un sinfín de ellas. Pues bien intentare responderlo de manera muy concreta, como me hubiera gustado encontrarlo a mi en su día.

Antes de empezar aclarar que todo depende, depende del tipo de app que estés planteándote desarrollar. Todo lo expuesto aquí es válido para apps nativas, si hablamos de webapps o híbridas hay bastantes soluciones alternativas como Phonegap o Appcelerator que serán analizadas en futuros posts.

 

¿Puedo programar IOS desde Windows?

La respuesta es si pero no , aunque hay soluciones como xamarin o  Phonegap que permiten desarrollar para IOS desde entornos windows pero siempre vas a necesitar un OS X para, como poco, subir la app resultante al store. La verdad es que, después de investigar un poco,  desistí pronto de seguir intentándolo.  Ahora,  después de años desarrollando para IOS desde OSX se me hace difícil pensar en como manejar la generación de los certificados necesarios y la subida de la app sin tener que pasar en ningún momento por un mac (real o virtual). Asumiendo que vas a necesitar un OS X bajo mi punto de vista tienes tres opciones:

 

  1. Usar un Mac. La solución ideal, pero la mas cara e “incomoda” si necesitas seguir desarrollando en los otros entornos. A mi me resultaba incomodo porque quería seguir trabajando el resto de cosas en windows ya que tengo siempre varios proyectos a la vez sobre la mesa…
  2. Reciclar un ordenador (o usar el tuyo con dual boot) e instalarle un “Hackintosh” (que no es mas que cualquier máquina no fabricada por Apple capaz de ejecutar OS X con la distribución adecuada, recomiendo iAtkos). Este puede ser un camino largo y doloroso según el hard de la máquina donde lo quieras instalar pero mi recomendación, si quieres trastear, es que empieces por visitar OSX86 Project.
  3. Usar un OS X corriendo bajo una máquina virtual (en windows o linux). Puedes utilizar el que mas te guste, VMware, Oracle VirtualBox,  etc. Cualquier PC medianamente decente (con bastante memoria eso si) os permitirá trabajar bien en entorno virtualizado. Puedes ver un vídeo de como instalarlo AQUI.

 

Yo he probado en un momento u otro las tres soluciones y, finalmente, tanto si eres desarrollador windows como linux mi recomendación (y lo que yo hago ahora)  es que uses una máquina virtual e instales sobre ella la última versión de OS X. Esto te permitirá seguir desarrollando y trabajando bajo windows pero a la vez desarrollar para IOS (yo uso una segunda pantalla).

Otra ventaja importantísima de esta solución es que, por política de Apple, lo normal es que a cada actualización importante de IOS suele seguir  una de su SDK y de su IDE (xCode). Para desarrollar para las ultimas versiones de IOS siempre has de tener actualizadas esas dos cosas y, por supuesto, implican actualización de OSX…  ¿acaso os imagináis repetir la película de la instalación del hackintosh a cada update significativo de Apple? La opción de la máquina virtual permite abrir otra instancia e instalar y migrar ahí de forma segura todo tu entorno de trabajo.

 

¿Que IDE necesito?

Una vez que ya tienes tu OS X disponible, lo siguiente es que vayas al Apple Developer Center y descargues de ahí la ultima versión de su IDE, que no es otro que xCode. Con la descarga de xCode se descarga también el IOS SDK,  con eso tendrías suficiente para empezar. En futuro será necesario que te crees una cuenta de Apple Developer Program ( por el módico precio de 99€ anuales), esto es básico ya que sin ello solo podrás realizar pruebas en simulador (no probar en dispositivo es mala idea) y no podrás subir nada al  App Store.

 

¿En que lenguaje se programa?

Se programa utilizando Objetive C, para los mas ancianos del lugar (¡como yo!) decir que es un lenguaje que usa un modelo de objetos similar a SmallTalk será suficiente para que lo entiendan, para el resto decir que intenten imaginar Objetive C como una fina capa superpuesta sobre C.

Si eres desarrollador de C++ (como era mi caso) el paso será un poco mas doloroso… requiere un cambio  de mentalidad, los mas experimentados habrán vivido algo parecido a principios de los 90 con el paso de la programación estructurada a la POO. Os recomiendo este excelente artículo de Genbeta, ilustra bastante bien en que consta el cambio.

Con esto, que no es poca información, concluye esta entrada. Si aun no has desistido, ya sabes, toca remangarse y ponerse a trastear…para cuando tengas todo instalado puedes empezar con una introducción ligerita a Objetive C. Ya verás como en un ratito tendrás tu Hola Mundo! funcionado.