2011-12-21 27 views
6

Estoy tratando de usar regiones de monitoreo para rastrear si los usuarios han visitado puntos de referencia. el gerente de locación se inicializa en un viewcontroller junto con una MapKitiphone CLLocationmanager No se activan las devoluciones de llamada de monitoreo de región

en viewDidLoad del controlador de vista:

if (self.locationManager == nil) 
{ 
    //  NSLog(@"creating location manager"); 
    self.locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
} 


NSSet* set=[locationManager monitoredRegions]; 

if ([CLLocationManager regionMonitoringAvailable] && [CLLocationManager regionMonitoringEnabled]) { 
    NSLog(@"region monitoring okay"); 
    NSLog(@"monitored regions: %@",set); 
} 

Me da la NSLogs "región de monitoreo bien" y todas las regiones correctamente.

adición de las regiones se realizan igual que

double metres=20.0; 
CLLocationDistance dist=metres; 
CLLocationAccuracy acc=1.0; 

CLRegion *reg=[[CLRegion alloc] initCircularRegionWithCenter:coordinate radius:dist identifier:landmarkObj.landmarkName]; 

[locationManager startMonitoringForRegion:reg desiredAccuracy:acc]; 

pero las devoluciones de llamada no todo son provocados

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Entered" 
                message:region.identifier 
                delegate:self 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil, nil]; 
    [alert show]; 
} 

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Exited" 
                message:region.identifier 
                delegate:self 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil, nil]; 
    [alert show]; 
} 

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region 
{ 
    NSLog(@"started monitring for region: %@",region); 
} 

- (void) locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error 
{ 
    NSLog(@"%@",error); 
} 

la actualización de la ubicación, sin embargo, funciona bien.

[locationManager startUpdatingLocation]; 

dispara el didUpdateToLocation devolución de llamada como se esperaba

Actualización: didUpdatToLocation utilizado para monitorear a las regiones en su lugar. todavía interesado en saber por qué esto no funcionaría, parece que pocos han tenido éxito con la supervisión de la región

+0

¿Has encontrado una solución a este problema? Tengo el mismo problema y didStartMonitoringForRegion no se activa. – Das

+0

resulta que el monitoreo de la región simplemente no me da la precisión que necesito. Terminé haciendo una comprobación manual para cada devolución de llamada didUpdateToLocation. Esto fue factible para mí ya que estaba rastreando solo 10 regiones – tzl

Respuesta

3

el seguimiento de región es para el seguimiento de posición de granularidad baja y se desencadena en los límites de ubicación de celda, por lo que si no cruza un límite de celda, nunca se verificará su región. Yo tenía los mismos problemas e investigado esto y un sitio web diferente tenido un comentario sobre este que apuntaba a este foro de manzana:

https://devforums.apple.com/message/251046#251046

Si usted lee todos los comentarios que se entiende por qué esto no está funcionando.

Estoy tratando de encontrar mi propio NSSets para contener CLRegions rastreados y CLRegions ocupados y luego, cuando obtengo un locationManager: didUpdateToLocation: fromLocation: callback, reviso todas las regiones en mi conjunto rastreado para ver si NO estaba en el conjunto de inRegions pero ahora estoy en la región rastreada (agregue a inRegions y call back con enterRegion) o si estaba en Region pero ahora no lo estoy (eliminé de inRegions y call back con exitRegion). Es un trabajo en progreso ahora.

+0

no, este no es el caso, ya que tengo dos dispositivos diferentes en el mismo proveedor de telefonía en el que las regiones funcionan en uno, pero no en el otro – uofc

+0

, sí, es el caso. Puede que no sea el caso completo, ya que puede haber otros problemas involucrados, pero gira en torno a la cobertura de la torre celular y el cambio de celdas y cosas así para activar. Por lo general, no usa GPS ya que el GPS es costoso. Probablemente hay muchos matices y casos extremos y otras cosas como wifi y cosas involucradas. Lea el enlace de la manzana arriba para obtener una mejor comprensión del problema. – chadbag

0

¿configuró CLLocationManagerDelegate en su ViewController?

@interface Maps : UIViewController <CLLocationManagerDelegate>{ 
... 
} 
+0

sí, lo hice \t @interface TrailViewController: UIViewController tzl

+2

Esto es realmente irrelevante. No poner el protocolo en la declaración solo afecta las advertencias del compilador y otras cosas, pero no afecta las llamadas de delegado reales a su delegado. – chadbag

0

Intenta utilizar la depuración -> Localización -> Autopista unidad para la simulación, tengo un problema similar, pero creó un par de regiones y el didEnterRegion se trigged con más de 1.000 metros ... Pongo 't saber Camino .. He establecido:

locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
locationManager.distanceFilter = kCLDistanceFilterNone; 
0

¿Qué está poniendo para su coordenada central? Esa parte falta en tu ejemplo. He visto otros ejemplos en los que no se está llenando con una lo suficientemente precisa coordenada combinado con el radio de la región para que nunca desencadenar. Debes tener una coordenada bastante precisa ingresada (probablemente 5 o 6 decimales) si deseas disparar a un radio de 20 metros.

Todo lo demás se ve bastante bien.

+0

estoy usando 6 decimales. Lo que más me desconcierta es que didStartMonitoringForRegion no se está disparando: S – tzl

+0

Intentaría un radio mayor para comenzar, ver si eso ayuda. Solo pude hacer que las regiones funcionasen después de mover todo a mi AppDelegate. Luego obtuve todas las devoluciones de llamada que necesitaba. –

0

También necesita NSLocationAlwaysUsageDescription en su plist, y necesita llamar a [locationManager requestAlwayAuthorization] en su aplicación. NSLocationWhenInUseUsageDescription desactivará la supervisión de la región.

Cuestiones relacionadas