2014-09-22 5 views
5

Ich möchte den Standort des Benutzers idealerweise alle 5 Minuten aktualisieren, wenn sich die Anwendung in einem Hintergrundzustand oder im Vordergrundzustand befindet. Dies ist eine sehr ortssensitive App, daher ist es äußerst wichtig, den Standort jederzeit zu kennen.Aktualisieren des Standorts im Hintergrund auf einem Timer/in regelmäßigen Abständen in iOS 8

Es gab viele Antworten auf diese Frage zu SO, aber viele von ihnen befassen sich mit iOS 6 und früher. Nach iOS 7 haben sich viele Hintergrundaufgaben geändert und ich habe Schwierigkeiten, einen Weg zu finden, um regelmäßige Standortaktualisierungen im Hintergrund zu implementieren.

Antwort

2

Sie sollten den Delegierten von CoreLocation verwenden. Sobald Sie eine Koordinate erhalten haben, stoppen Sie CoreLocation und stellen Sie einen Timer ein, um ihn in 5 Minuten erneut zu starten.

Mit iOS 8 müssen Sie einen PLIST-Eintrag für NSLocationWhenInUseUsageDescription und/oder NSLocationAlwaysInUseDescription festlegen.

Die Apple-Dokumentation ist sehr klar, wie all dies zu tun ist.

-(void)startUpdating{ 
    self.locationManager = [[CLLocationManager alloc]init]; 
    self.locationManager.delegate = self; 
    [self.locationManager requestWhenInUseAuthorization]; 
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
    [self.locationManager startUpdatingLocation]; 

} 

-(void)timerFired{ 
    [self.timer invalidate]; 
    _timer = nil; 
    [self.locationManager startUpdatingLocation]; 
} 

// CLLocationDelegate 
- (void)locationManager:(CLLocationManager *)manager 
    didUpdateLocations:(NSArray *)locations{ 
    if(locations.count){ 
     // Optional: check error for desired accuracy 
     self.location = locations[0]; 
     [self.locationManager stopUpdatingLocation]; 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:60 * 5 target:self selector:@selector(timerFired) userInfo:nil repeats:NO]; 
    } 
} 
+0

Funktioniert das weiter, wenn die App in den Hintergrund getreten ist? – initWithQuestion

+0

Einige Modi ja. Lesen Sie die Dokumentation. – VaporwareWolf

+0

Ich stelle fest, dass '' [self.locationManager stopUpdatingLocation] '' zweimal angezeigt wird, sollte die timerFired Methode '' [self.locationManager startUpdatingLocation] '' sein? Ich glaube, dass "self.location = [locations lastObject]" 'geeigneter ist, da das letzte Objekt immer das jüngste ist. Können Sie schließlich erklären, warum die Timer-Invalidierungslogik aufgerufen wird? – initWithQuestion

0

Es gibt eine ganze Reihe von Informationen in Bezug auf die apple documentation.

Außerdem gibt es einige zusätzliche Antworten here und here mit vorherigen Antworten von Stackoverflow. Da scheint es genug Informationen zu geben, die dir helfen können!

+0

Beide dieser Antworten sind vor iOS 8 und einige dieser Methoden wurden bereits veraltet. – initWithQuestion

+1

Sie sollen Ihnen helfen, in die richtige Richtung zu führen. Wenn Sie eine Frage haben, sollte die Dokumentation da sein, um Ihnen die benötigten Informationen zur Verfügung zu stellen. Es gibt Unmengen an Informationen über Apples Dokumentation über Apps, die im Hintergrund laufen und die Sie lesen sollten. – sdoowhsoj

Verwandte Themen