¿Dónde estás programador? Core Location, Brújula y MapKit (1)



Antes de empezar
Bienvenidos a este primer número de iPhoneWorld. Es un honor para mí tener en esta revista una sesión dedicada al desarrollo de aplicaciones para iPhone. Ya que Apple cuida mucho a los desarrolladores siendo los que hacen que el iPhone tenga tanto éxito a nivel mundial, en iPhoneWorld también intentaremos animar a más gente a unirse a los miles de programadores que se están acercando al mundo Mac desde la salida al mercado de este teléfono móvil. Intentaremos cubrir lo que podemos en este reducido espacio. Pero, seguramente, tú puedes ayudarnos y hacer que la DevZone sea algo interesante para todos. Si te interesa un tema en particular o tienes preguntas técnicas, sólo tienes que contactarnos e intentaremos darte una respuesta.
Para empezar, he decidido dedicar este primer capítulo a los servicios de localización y a los mapas proporcionados en el SDK del iPhone. La elección del tema tiene que ver con que una de las características especiales del iPhone es que “sabe donde estás”: así, me encanta poder utilizar mapas y GPS de una manera tan sencilla y divertida como la que ofrece Core Location y MapKit.

¿Dónde estás?
Hoy en día se habla mucho sobre Web 2.0, redes sociales, Facebook, Twitter … El GPS integrado en el iPhone 3G permite ofrecer al desarrollador unas funcionalidades que combinadas con otro tipo de información (fotos, sonidos, etc.) permiten crear una enorme cantidad de aplicaciones y servicios para el usuario. Aplicaciones como Mapas, AroundMe, Taxi, Milano Metro, y muchísimas más...
Con la reciente versión 3.0 del iPhone OS, Apple también ofrece a los desarrolladores la posibilidad de incluir en sus propias aplicaciones los mapas de Google para dar al usuario final una representación visual de su posición.
Hoy nos sumergiremos en esta tecnología y descubriremos cómo un programador puede sacar el máximo provecho y disfrutar de ella. Empezaremos intentando descubrir cómo funciona.

La tecnología
El iPhone utiliza actualmente tres métodos para calcular la posición geográfica. El primero hace uso de la red GPS. De hecho, hay un conjunto de satélites que se mueven a la misma velocidad que la tierra (geoestacionarios). De esta manera, la posición de cada uno de estos satélites se mantiene siempre fija respecto a la superficie terrestre. A través de una antena receptora integrada, el iPhone (a partir del 3G) se puede obtener la posición de estos satélites. En teoría, es suficiente que la antena detecte por lo menos a tres de los satélites para que pueda calcular exactamente su posición. Pero en el mundo real, el número de satélites necesarios es mayor, porque la señal de cada satélite que llega a la antena no tiene la misma potencia debido a diferentes causas (atmosféricas, electromagnéticas, interferencias de radio frecuencias, etc.) y al entorno físico en el cual se encuentra el móvil durante su intento de estimar su posición.
En lugares cerrados (un túnel o una habitación), la señal GPS es demasiado baja y se convierte en algo inútil. Por eso Apple decidió añadir dos maneras más para que las probabilidades de servicio fueran más altas. De hecho, el iPhone original ya utilizaba estos canales, sin tener receptor GPS. Uno de ellos utiliza la red móvil. Dado que las posición de las antenas de la red de telefonía móviles (GSM, GPRS, UMTS, etc.) son conocidas, Apple ha pensado utilizar esta información que se encuentra almacenada en tres bases de datos:

SkyHook WiFi: www.skyhookwireless.com.
Google Maps: http:// maps.google.com.
US DoD: http://tycho.usno.navy.mil.

A través del canal telefónico, el iPhone recibe la posición geográfica de las antenas más cercanas (en teoría como en el caso del GPS es suficiente conocer la posición de tres antenas) para calcular su posición.
Si la red telefónica también fallara, el tercer método sería utilizar las antenas Wi-Fi que se puedan encontrar alrededor. Este caso es muy dependiente del hecho de que la antena Wi-Fi esté registrada en las bases de datos mencionadas anteriormente. Si quieres participar activamente en este servicio con tu AirPort mejorando el sistema de localización, es suficiente que vayas al primer enlace (SkyHook) y proporciones las coordenadas de tu Wi-Fi de manera completamente anónima. De esta manera, tu antena Wi-Fi entrará a formar parte de un conjunto mundial de antenas y sus datos podrán ser utilizados para que un iPod Touch o un iPhone pueda calcular más exactamente su posición.
Los tres métodos presentados no son excluyentes los unos con los otros. De hecho, el iPhone en realidad combina de manera inteligente los tres para ofrecerte tu posición con una probabilidad de servicio lo más alta posible.

¿Y qué puede hacer el programador?
El SDK del iPhone ofrece diferentes clases, para que las coordenadas geográficas calculadas con los métodos presentados anteriormente puedan ser utilizadas para diferentes fines. Apple ha incluido dos framework: Core Location y el nuevo MapKit.
Core Location es el servicio que se encuentra disponible en el SDK para proporcionar la ubicación geográfica del usuario. Es la capa del SDK que se comunica con el GPS. Core Location está constituido por tres clases:

- CLLocationManager
- CLLocation
- CLHeading (presente sólo con el nuevo iPhone 3GS).

CLLocationManager es la clase más importante, porque permite activar y desactivar los servicios de localización. Para poderla utilizar en tu aplicación tienes que incorporar en tu proyecto Xcode el framework de CoreLocation. En Xcode, selecciona el menú Project -> Edit Active Target. En la ventana que se abre, selecciona el panel General y en la parte inferior de dicha ventana, aprieta el botón +. En la lista que aparece, selecciona CoreLocation.framework. Para terminar, añade en el encabezado de tu clase <CoreLocation/CoreLocation.h>.
Para manejar las actualizaciones de ubicación, necesitamos también utilizar un método delegado. Dicho método es parte del protocolo CLLocationManagerDelegate. Por lo tanto, añade este protocolo en la interfaz de tu clase:

@interface MiClase : ¬
NSObject <CLLocationManagerDelegate>

Hecho esto, la primera cosa que tenemos que hacer es crear y utilizar un objeto del tipo CLLocationManager que es el responsable de manejar las actualizaciones de la ubicación del usuario, enviándolas en forma de objetos CLLocation a su delegado (casi siempre el delegado es una instancia de la clase que estás escribiendo) para ser procesadas. CLLocationManager tiene las siguientes propiedades para fijar:
distanceFilter que define hasta dónde debe moverse el teléfono antes de que el Location Manager envíe al delegado una nueva actualización CLLocation. Si se utiliza kCLDistanceFilterNone, se actualizará con tanta frecuencia como sea posible.
desiredAccuracy se utiliza para pedir al Location Manager una nueva actualización de la posición con una determinada precisión
locationServiceEnabled es un indicador para comprobar el estado del servicio.
Una vez configurado, podemos pedir al Location Manager que empiece a proporcionar el servicio enviándole un mensaje startUpdatingLocation. No te olvides de parar el servicio para no gastar inútilmente batería cuando ya no necesites utilizar el GPS.
Los pasos previos están aquí resumidos:

CLLocationManager *locationManager = ¬ [[CLLocationManager alloc] init];
[locationManager ¬ setDelegate:aClassName];
[locationManager setDistanceFilter: ¬ kCLDistanceFilterNone];
[locationManager setDesiredAccuracy: ¬ kCLLocationAccuracyBest];
[locationManager startUpdatingLocation];
………// haz algo con los datos
[locationManager stopUpdatingLocation];
[locationManager relelase];

Los objetos generados por Location Manager son del tipo CLLocation y pueden ser leídos en el método del protocolo de CLLocationManageDelegate que, por lo tanto, tienes que añadir a tu clase:

- (void)locationManager: ¬
(CLLocationManager *)manager
didUpdateToLocation: ¬
(CLLocation *)newLocation
fromLocation:(CLLocation *) ¬
oldLocation;

Cada objeto CLLocation representa la posición generada por el Location Manager. Este objeto incluye, entre otras cosas, las coordenadas geográficas y la altitud del iPhone junto con sus valores de precisión. Por lo tanto, puedes leer estos valores y utilizarlos en tu aplicación para crear tu aplicación.

Conclusión
Hemos visto como el iPhone es capaz de ofrecer al programador fácilmente su posición geográfica. En el próximo capítulo te mostraremos cómo sacar partido del el nuevo MapKit para mostrar la información directamente en un mapa, la brújula digital y el abanico de aplicaciones que se pueden desarrollar con Core Location y MapKit… “Keep coding”.


Geppy Parziale (geppy.paziale@invasivecode.com) es el creador de iNVASIVE CODE (www.invasivecode.com). Es consultor y profesor de tecnologías Cocoa y Cocoa Touch.

Autor: Geppy Parziale.
04/12/2009
Más sobre:        
   
| Más
idg.es©2010 IDG COMMUNICATIONS, S. A. U. Prohibida la reproducción total o parcial en cualquier medio (escrito o electrónico) sin autorización expresa por escrito de la editorial. En particular, IDG COMMUNICATIONS, S.A.U., se opone de manera expresa, salvo consentimiento por escrito, a la reproducción, recopilación, distribución, comunicación pública o puesta a disposición por parte de terceros de los contenidos publicados en los medios de su titularidad (ya se editen éstos en papel, a través de Internet o cualquier otro soporte), de conformidad con lo establecido en el artículo 32 de la Ley 23/2006, de 7 de julio, por la que se modifica el texto refundido de la Ley de Propiedad Intelectual, aprobado por el Real Decreto Legislativo 1/1996, de 12 de abril. En caso de estar interesado en una autorización para reproducir, distribuir, comunicar, almacenar o utilizar en cualquier forma los contenidos titularidad de IDG COMMUNICATIONS, S.A.U. debe dirigir su petición a la siguiente dirección de correo electrónico : idg_nt@idg.es