iphone - requestwheninuseauthorization - iOS 6 CoreLocation no funciona
location manager swift tutorial (3)
¿Tiene algún mensaje del método de delegado?
Si no hay mensaje, revise la descripción de la interfaz de su clase.
@interface ... <... CLLocationManagerDelegate ...>
Yo hago una aplicación de ubicación. Pero Core Location no funciona. Probé otras aplicaciones de iPhone en mi iPhone.
Como google earth, un software de navegación. Las otras aplicaciones tampoco funcionan.
¿Por qué no actualiza la ubicación?
¿Por qué el mensaje ''locationManager: didUpdateToLocation: fromLocation:'' se llamó solo 2 veces?
Tal vez ... ¿Mi iPhone se descompuso? o iOS 6 CoreLocation frameworks tiene algún error?
Servicio de ubicación: activado en la configuración del iPhone
Info.plist
- Armv7
- acelerómetro
- Servicios de localización
- GPS
- micrófono
- magnetómetro
Ejemplo de código:
- (CLLocationManager *)setupLocationManager
{
if ([CLLocationManager locationServicesEnabled] && [CLLocationManager headingAvailable]) {
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.headingFilter = kCLHeadingFilterNone;
[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];
return locationManager;
}
return nil;
}
- (CLLocationManager *)locationManager
{
switch([CLLocationManager authorizationStatus])
{
case kCLAuthorizationStatusAuthorized:
_deltaTimeLocationReceived = 0.0;
if (_locationManager == nil)
_locationManager = [self setupLocationManager];
return _locationManager;
case kCLAuthorizationStatusDenied:
case kCLAuthorizationStatusRestricted:
if (_locationManager)
_locationManager = nil;
return _locationManager;
case kCLAuthorizationStatusNotDetermined:
_deltaTimeLocationReceived = 0.0;
if (_locationManager == nil)
_locationManager = [self setupLocationManager];
return nil;
}
return nil;
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSLog(@"%@ %@", NSStringFromSelector(_cmd), newLocation.description);
if (self.locationManager) _locationSignal++;
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"%@ %@", NSStringFromSelector(_cmd), error.description);
}
En iOS 6, Apple ha realizado cambios importantes en Core Locations implementando AutoPause API. La API AutoPause pausa las actualizaciones de ubicación cuando una aplicación pasa a segundo plano y se aplica a un par de criterios (es decir, el usuario no se mueve, no se corrige la ubicación, el usuario interrumpe la actividad). Para manejar con precisión los eventos de pausa, Apple solicita una mejor predicción de si pausar las actualizaciones de ubicación configurando un tipo de actividad (es decir, navegación, estado físico, otro). La API de AutoPause está habilitada de forma predeterminada cuando una aplicación se compila contra iOS 6.
La solución más fácil es desactivar la API AutoPause por ahora estableciendo siempre ''pausesLocationUpdatesAutomatically'' en NO. Las actualizaciones de ubicación se enviarán incluso cuando la aplicación esté en segundo plano, como solía funcionar en <iOS 6.
Más detalles aquí:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
delegado - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
no existe en ios 6.
En su lugar use
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray*)locations
Consulte la documentación de Apple para startUpdateLocation
Este código (y las pausesLocationUpdatesAutomatically) se compilan solo en XCode 4.5 (donde el SDK base es 6).
Si desea apuntar a versiones de iOS anteriores a la 6.0, utilice esta macro
#define IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
y donde quiera que esté creando el objeto CLLocationManager
if(IOS_VERSION_GREATER_THAN_OR_EQUAL_TO (@"6.0"))
{
locationManagerObj.pausesLocationUpdatesAutomatically = NO;
}
El delegado de locationManager debería funcionar en todas las versiones cuando se compila desde Xcode 4.5