2012-05-24 7 views
5

Attualmente, lo sviluppo di un'app che deve ottenere l'ultima posizione da CLLocationManager (senza tracciamento regolare). Non importa quanti anni ha, preciso. Non ho bisogno e voglio iniziare il monitoraggio - ho solo bisogno di prendere l'ultima posizione da una cache e basta. IMHO, CLLocationManager è un componente condiviso in iOS e se alcune app utilizzano il rilevamento della posizione, un'altra app dovrebbe essere in grado di utilizzare la posizione più recente da CLLocationManager.location. Dovrebbe essere sufficiente solo per allocare/avviare CLLocationManager e prendere la sua posizione. Tuttavia non lo è. Ho provato su iPhone4 - ho avviato google maps, ho visto la mia posizione corrente, poi sono andato alla mia app, ma dopo [[CLLocationManager alloc] init] la proprietà location è nulla.L'app dovrebbe avviare il tracciamento della posizione per ottenere QUALSIASI ultima posizione conosciuta da CLLocationManager?

UPDATE: provato [locationManager startUpdatingLocation]; e [locationManager stopUpdatingLocation]; ma il risultato è lo stesso. Immagino che l'unica soluzione sia iniziare a monitorare regolarmente?

UPDATE2: Strano ma non c'è alcun avviso con "L'app vuole utilizzare i servizi di localizzazione" dopo alloc/init di CLLocationManager. Ecco il mio frammento di codice:

CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 

[locationManager startUpdatingLocation]; 
[locationManager stopUpdatingLocation]; 
NSLog(@"%@", locationManager.location); //prints nil 
+0

vi consiglio di guardare in [Come trovare la posizione corrente con CoreLocation] (http://stackoverflow.com/questions/6516967/how-to-find- your-current-location-with-corelocation) e memorizza la posizione trovata in un 'NSArray'. –

risposta

2

In primo luogo si dovrebbe verificare se il vostro locationManager ha una, diciamo, la posizione 'static' pre-salvato.

Se lo fa, il gioco è fatto.

In caso contrario, è necessario startUpdatingLocation e quindi, nella callback didUpdateToLocation:fromLocation:, stopUpdatingLocation una volta ottenuta la posizione.

La mia esperienza dice che è il modo migliore per ottenere una sola posizione.

AGGIORNAMENTO PER ABBINARE AGGIORNAMENTI autore:

Non si dovrebbe stopUpdatingLocation subito dopo startUpdatingLocation. startUpdatingLocation avvia un servizio in background, quindi è necessario attendere finché non si ottiene una posizione, quindi invocarlo nei metodi di callback.

+0

Cosa intendi per posizione "statica"? Se vado su google maps e riesco a vedere la mia posizione attuale, dovrebbe essere considerata come posizione statica? Google Maps utilizza definitivamente i servizi di localizzazione, quindi dopo di ciò dovrebbe esserci almeno una posizione statica in CLLocationManager. – Centurion

+0

Voglio dire una posizione che non è stata trovata dalla tua app attraverso il callback 'didUpdateToLocation: fromLocation:'. E sì, Google Maps utilizza i servizi di localizzazione, ma non è garantito che la tua app possa ottenere la posizione ottenuta da un'altra app. – sonxurxo

+1

A proposito, sono sicuro al 99% che l'avviso debba apparire quando si avvia ** usando ** il locationManager, non quando lo si assegna e si inizia. – sonxurxo

1

Per utilizzare lo strumento CLLocationManager è necessario implementare da qualche parte lo CLLocationManagerDelegate.

-[CLLocationManager startUpdatingLocation] avvia un processo asincrono. Se lo interrompi nello stesso ciclo di runloop, il processo non viene mai avviato e questo è il motivo per cui non vedi mai la finestra di dialogo delle autorizzazioni.

va qualcosa di simile:

@interface MyClass : NSObject <CLLocationManagerDelegate> { 
    CLLocationManager *manager; 
    CLLocation *lastLocation; 
} 

@end 

@implementation 

- (id)init { 
    self = [super init]; 
    if (self) { 
     manager = [[CLLocationManager alloc] init]; 
     manager.delegate = self; 
     [manager startUpdatingLocation]; 
    } 
    return self; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation; 
{ 
    lastLocation = newLocation; 
    [manager stopUpdatingLocation]; 
} 

// in your real implementation be sure to handle the error cases as well. 
@end 
Problemi correlati