2012-05-24 4 views
5

Entwickeln Sie derzeit eine App, die den letzten Standort von CLLocationManager abrufen muss (ohne regelmäßiges Tracking). Es ist egal, wie alt, genau es ist. Ich brauche das Tracking nicht und möchte es starten. Ich muss nur einen letzten Ort aus dem Cache holen und das war's. IMHO, CLLocationManager ist eine gemeinsame Komponente in iOS und wenn einige App Location Tracking verwendet, sollte eine andere App in der Lage sein, den neuesten Standort aus CLLocationManager.location zu verwenden. Es sollte ausreichen, nur CLLocationManager zuzuweisen/init und seinen Speicherort zu greifen. Wie auch immer, es ist nicht. Ich habe auf iPhone4 getestet - google maps gestartet, meinen aktuellen Standort gesehen, bin dann zu meiner App gegangen, aber nach der [[CLLocationManager alloc] init] location Eigenschaft ist nil.Sollte eine App die Standortverfolgung starten, um den letzten bekannten Standort von CLLocationManager zu erhalten?

UPDATE: versucht [locationManager startUpdatingLocation]; und [locationManager stopUpdatingLocation]; aber das Ergebnis ist das gleiche. Ich denke, die einzige Lösung ist das regelmäßige Tracking zu beginnen?

UPDATE2: Seltsam, aber es gibt keine Warnung mit "Die App möchte Standortdienste verwenden" nach alloc/init von CLLocationManager. Hier ist mein Code-Fragment:

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

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

Ich empfehle Ihnen, schauen Sie in [Wie Sie Ihren aktuellen Standort mit Corelocation finden] (http://stackoverflow.com/questions/6516967/how-to-find- your-current-location-with-corelocation) und speichern Sie den Speicherort in einem 'NSArray'. –

Antwort

2

Zuerst sollten Sie überprüfen, ob Ihr locationManager a hat, sagen wir mal, ‚statische‘ Position vorge gespeichert.

Wenn ja, sind Sie fertig.

Wenn nicht, sollten Sie startUpdatingLocation und dann, in der didUpdateToLocation:fromLocation: Rückruf, stopUpdatingLocation sobald Sie den Standort erhalten.

Meine Erfahrung sagt, das ist der beste Weg, um nur einen Ort zu bekommen.

UPDATE AUTOR UPDATES zum Spiel:

Sie sollten nicht stopUpdatingLocation kurz nach startUpdatingLocation. startUpdatingLocation startet einen Dienst im Hintergrund, so dass Sie warten sollten, bis Sie einen Speicherort erhalten, also in den Callback-Methoden.

+0

Was meinen Sie "statische" Position? Wenn ich zu Google Maps gehe und meinen aktuellen Standort sehen kann, sollte dies als statischer Standort gelten? Google Maps verwendet definitiv Standortdienste, daher sollte es danach mindestens einen statischen Standort in CLLocationManager geben. – Centurion

+0

Ich meine einen Ort, der von Ihrer App nicht über den 'didUpdateToLocation: fromLocation:' Callback abgerufen wurde. Und ja, Google Maps verwendet die Standortdienste, aber es ist nicht garantiert, dass Ihre App den Standort einer anderen App abrufen kann. – sonxurxo

+1

Übrigens bin ich zu 99% sicher, dass die Warnung angezeigt werden sollte, wenn Sie ** den ** locationManager starten, nicht wenn Sie ihn zuweisen und initiieren. – sonxurxo

1

Um CLLocationManager verwenden zu können, müssen Sie CLLocationManagerDelegate irgendwo implementieren.

-[CLLocationManager startUpdatingLocation] startet einen asynchronen Prozess. Wenn Sie es im selben Runloop-Zyklus stoppen, wird der Prozess nie gestartet und das ist der Grund, warum Sie den Erlaubnisdialog nie sehen.

Es geht ungefähr so:

@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