2014-06-11 7 views
12

sto cercando di testare il monitoraggio regione, per questo mi sto posizione corrente come questo:Regione monitoraggio posizione attuale non notifica in uscita

- (void)startLocationTracking 
{ 
    CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 

    // Start location manager 
    if ([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) { 
     locationManager = [LocationTracker sharedLocationManager]; 
     locationManager.delegate = self; 
     [locationManager startMonitoringSignificantLocationChanges]; 
    } 
} 

e il monitoraggio prima posizione con il monitoraggio regione in questo modo:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:manager.location.coordinate radius:300 identifier:@"first location initializer"]; 

     NSLog(@"0: %@", manager.location); 
     NSLog(@"1: %@", region); 

     [manager startMonitoringForRegion:region]; 
     NSLog(@"[locationManager startMonitoringForRegion:%@];", region); 
    }); 
} 

Poi in ogni uscita dalla regione corrente che sto monitorando la nuova posizione in questo modo:

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region 
{ 
    NSLog(@"%s, %@", __PRETTY_FUNCTION__, region); 
} 

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region 
{ 
    NSLog(@"%s, %@", __PRETTY_FUNCTION__, region); 

    NSArray *allRegions = manager.monitoredRegions.allObjects; 

    if (allRegions.count > 0) { 
     for (CLRegion *reg in allRegions) { 
      [manager stopMonitoringForRegion:reg]; 
     } 
    } 

    CLLocationCoordinate2D cord = CLLocationCoordinate2DMake(manager.location.coordinate.latitude, manager.location.coordinate.longitude); 
    CLRegion *regionNew = [[CLRegion alloc] initCircularRegionWithCenter:cord radius:300 identifier:@"new region"]; 

    NSLog(@"region: %@", region); 
    NSLog(@"regionNew: %@", regionNew); 

    [manager startMonitoringForRegion:regionNew]; 
} 

Spiegherò cosa mi aspetto che accada:

  1. Registrare la posizione corrente nel monitoraggio della regione.
  2. Notifica area corrente di uscita utente.
  3. Nel registro di uscita e registrare nuovamente la posizione corrente come regione.

Questo non accade.

Dove mi sbaglio?

Ho provato il simulatore con "Freeway Drive".

UPDATE:

provati e lavoro, a causa ad Apple bug in geofencing, applicazione supporta solo 7.1+, piuttosto male ma io non avere un'altra idea.

+1

Bene, non si dovrebbe mai testare questo tipo di comportamento su un simulatore. Avrai bisogno di un dispositivo reale per questo. Ho provato a farlo una volta per un'app tracker sulla posizione, ma è stata appena scaricata casualmente su un simulatore. –

+0

Testato in tempo reale, non funziona ancora. –

+0

Puoi approfondire il tuo aggiornamento? Il tuo codice nella tua domanda ora funziona senza la soluzione fornita nella risposta? – rene

risposta

11

Penso che il modo in cui si implementa il monitoraggio della regione potrebbe causare alcuni problemi.

Ecco i motivi: -

  1. All'interno del metodo startLocationTracking, il vostro locationManager è un oggetto locale che non si estende oltre il ciclo di vita di tale metodo. Significa anche che ogni volta che si chiama startLocationTracking, ci sarà un nuovo oggetto locationManager assegnato con un nuovo blocco di memoria.

    per risolvere questo problema: È necessario utilizzare un SingletonlocationManager che è un condiviso locationManager per l'intero ciclo di vita dell'applicazione.

  2. Credo che non si dovrebbe startMonitoringForRegion all'interno del metodo delegato -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:. Il motivo è che, se chiami più startLocationTracking una volta, ci sarà più di un locationManager. Più location Manager possono monitorare la stessa regione che può causare più notifiche.

  3. Dopo aver chiamato [manager startMonitoringForRegion:region];, la regione non verrà monitorata immediatamente. Se non ci credete mi creda, provare il codice seguente: -

    [locationManager startMonitoringForRegion:region]; 
    NSLog(@"%@",locationManager.monitoredRegions); 
    

scoprirete che la regione che hai appena monitorato non sarà all'interno del locationManager.monitoredRegions. Poiché questo viene gestito a livello iOS, penso che potrebbero essere necessari alcuni minuti affinché la regione sia pronta per essere monitorata.

Si dovrebbe anche capire le altre limitazioni per Regione di monitoraggio in iOS: -

https://developer.apple.com/library/mac/documentation/CoreLocation/Reference/CLLocationManager_Class/CLLocationManager/CLLocationManager.html

Un'applicazione può registrare fino a 20 regioni alla volta. Per segnalare tempestivamente le variazioni della regione , il servizio di monitoraggio della regione richiede la connettività di rete.

In iOS 6, le aree con un raggio tra 1 e 400 metri funzionano meglio su dispositivi iPhone 4S o successivi. (In iOS 5, le aree con un raggio compreso tra 1 e 150 metri funzionano meglio su iPhone 4S e dispositivi successivi.) Su questi dispositivi, un'app può aspettarsi di ricevere la regione appropriata inserita o la notifica dalla regione entro 3-5 minuti. su media, se non prima.

Nota: le app possono ricevere una notifica non appena il dispositivo si sposta di 500 metri o più dalla sua precedente notifica. Non dovrebbe aspettarsi le notifiche più frequentemente di una volta ogni cinque minuti. Se il dispositivo è in grado di recuperare i dati dalla rete, è molto più probabile che il gestore località invii notifiche in modo tempestivo.

Non so di cosa si tratta la tua app, credo che dovresti ridisegnare il flusso della tua app. Dovresti provare a monitorare la regione al di fuori dei metodi delegati.

Per ulteriori informazioni sul Singleton LocationManager, è possibile controllare questa risposta: Background Location Services not working in iOS 7. Esiste un progetto completo su GitHub che contiene una classe Singleton LocationManager che ho chiamato come LocationTracker.

Si potrebbe anche voler controllare un problema tecnico per la zona di sorveglianza in iOS 7 che ho scoperto un mese fa (con una soluzione per risolvere il problema tecnico): Region Monitoring Glitch on iOS 7 - Multiple Notifications at the same time

+0

So che è passato molto tempo a questa domanda, ma in Geofencing sto affrontando un problema. Ho selezionato un raggio di 100 metri e la notifica "all'uscita" dovrebbe arrivare. Ma sto ricevendo notifiche su/a circa 250 metri. Per favore aiutatemi. –

+0

se voglio monitorare solo una regione buiding significa come posso impostarlo. Se ottengo le coordinate da google map funzionerà? – Lydia

+0

upvoted! Mentre sono d'accordo sul fatto che il monitoraggio di Monitoraggio regionale, SLC, visita sia gestito a livello di sistema operativo. Io * penso * non è più come hai detto tu. Da iOS 10, iPhone6, quando eseguo '[locationManager startMonitoringForRegion: region]; NSLog (@ "% @", locationManager.monitoredRegions); "I ** do ** vederlo immediatamente. – Honey

0

La risposta più soddisfacente per i metodi di delegati (didEnterRegion e didExitRegion) non viene chiamato, apple docs dice che verrai avvisato dopo 3-5 minuti dopo l'entrata o l'uscita, ma nei test effettivi ciò che ho trovato è che devi attendere circa 7/8 minuti.

L'ho provato per 10-15 volte e il mio raggio di area era di circa 80 metri. Mi stavo grattando la testa per vedere cosa è andato storto. Ho lasciato il simulatore aperto con il rilevamento della posizione attivo (ho usato un file gpx per la simulazione della posizione). Dopo 8 minuti è stata chiamata ExitRegion.

Inoltre, se si desidera farlo in background, è necessario abilitare le modalità di background sul target. enter image description here

+0

So che è passato molto tempo a questa domanda, ma in Geofencing sto affrontando un problema. Ho selezionato un raggio di 100 metri e la notifica "all'uscita" dovrebbe arrivare. Ma sto ricevendo notifiche su/a circa 250 metri. Per favore aiutatemi. –

+1

Ciao @UmangKothari sto affrontando il problema in geofencing I metodi di avvio e di uscita non chiamano mai, puoi dargli qualsiasi codice di esempio o esempi –

+0

stackoverflow.com/questions/24165599/region-monitoring-current-location-doesnt-notify-on -exit/28315050? noredirect = 1 # comment59114556_28315050 –

Problemi correlati