2013-04-22 2 views
5

Sono riuscito a registrare una regione o un monitoraggio, lo so perché è stato attivato il metodo didStartMonitoringForRegion.iOS: didEnterRegion di CLLocationManager non chiamato

Ho una semplice app di prova con uno MKMapView dove posso vedere la mia posizione corrente, ho anche disegnato la mia regione sulla mappa come un cerchio rosso in modo da poter effettivamente "fisicamente" vedere a che punto sto entrando o uscendo questa regione. Nei metodi didEnterRegion e didExitRegion ho un UIAlertView che spara.

Poco fa ho deciso di lasciare l'ufficio e fare una passeggiata con il mio iPhone 4, per vedere se questo avrebbe funzionato. Ho iniziato nel bel mezzo della regione (che è di circa 200 metri nel raggio), la mia app è stata in primo piano per tutto il tempo. Ho camminato per un paio di isolati e sono uscito dalla regione, non è successo nulla.

Ho letto su SO (penso) che a volte funziona solo quando si esce dalla regione di una certa distanza, quindi ho continuato a camminare.

Dopo altri 200 m circa mi sono arreso perché il UIAlertView non veniva ancora visualizzato e ho iniziato a tornare indietro. Ovviamente, al rientro nella regione, neanche lo didEnterRegion sparava.

Non sto chiamando [locationManager startUpdatingLocation] ovunque nel mio codice, dovrei essere ?? Sto solo creando la regione e chiamando lo [locationManager startMonitoringForRegion].

Il CLLocationManagerDelegate è il delegato della mia app e sembra che il mio didStartMonitoringForRegion stia funzionando correttamente.

Mi manca qualcos'altro?

+0

Non è necessario chiamare 'startUpdatingLocation'. Non vedo un problema da quello che dici. Forse aiuta quando pubblichi del codice. – Felix

+0

Hai verificato che all'interno della regione '[controlledRegion containsCoordinate: mapView.userLocation.location.coordinate]' è vero e all'esterno è falso? – Felix

+0

@ phix23 In realtà non l'ho provato, lo farò adesso, grazie! – PaulG

risposta

2

La documentazione indica che il monitoraggio della regione funziona indipendentemente dagli altri servizi di localizzazione. Ciò significa che dovrebbe essere sufficiente per chiamare startMonitoringForRegion.

Assicurarsi:

  • [CLLocationManager regionMonitoringAvailable] restituisce SI
  • CLLocationManager.monitoredRegions contiene regioni validi

NOTA: Il documento specifica che gli eventi fare prendere tra 3-5 minuti per sparare.

In iOS 6, le regioni con un raggio compreso tra 1 e 400 metri funzionano meglio su 4S o dispositivi 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.

E

Apps può aspettare una notifica non appena il dispositivo si muove a 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.

Spero che questo aiuti.

+0

regionMonitoringEnabled è deprecato ma l'ho provato e sì funziona. Grazie per la risposta btw! Hmmm, secondo la tua risposta, ho rinunciato troppo presto e avrei dovuto andare oltre. – PaulG

+1

Modificato su regionMonitoringDisponibile quale è la nuova chiamata. A proposito, controlla: http://stackoverflow.com/questions/214416/set-the-location-in-iphone-simulator per un modo più semplice per testare questo che camminare per anni. – Nailer

0

Una cosa da notare in basso (se si sta simulando la posizione):

Se entrata e in uscita non viene mai chiamato, anche se si pensa di aver fatto tutto giusto nel codice assicuratevi di controllare se si è disabilitato posizione di simulazione da:

Passare al progetto Schema -> Modifica schema -> Disattiva simulazione posizione.

Stavo provando a testare il monitoraggio della mia regione camminando fisicamente fuori e nella regione mentre simulavo la posizione e non funzionava per me proprio per questo motivo.