2015-09-24 13 views
22

Mein app Lage verfolgt, während im Hintergrund ... die Lage Hintergrund-Modus aktiviert ist und ich verwendeiOS9 Tracking-Standort nicht während im Hintergrund

[self.locationManager startUpdatingLocation]; 

Dies funktioniert gut auf iOS7-8 aber knapp über iOS9 Arbeits

Im Simulator funktioniert es, aber auf dem realen Gerät bekomme ich keinen Callback im Hintergrund ... wenn ich den gleichen Code auf dem iOS8 Gerät laufen lasse bekomme ich normale Callbacks wie zuvor

Ist dies dokumentiert? Warum funktioniert es im Simulator und nicht im Gerät? ist es ein Fehler?

Wenn startSignificantChangeUpdates mit auf iOS9 funktioniert, ich frage mich, ob dies eine Art Batteriesparfunktion ist, dass sie möglicherweise startUpdatingLocation verboten

+1

Bitte beachten Sie die belo http://stackoverflow.com/questions/30808192/allowsbackgroundlocationupdates-in-cllocationmanager-in-ios9 – Dipen

Antwort

34

Verwendung:

if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) { 
    [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 
} 

ein Makro zu vermeiden, mit denen die Systemversion auswertet. Dies wird setAllowsBackgroundLocationUpdates nennen: auf iOS 9, aber nicht auf iOS 8.

+0

Das sparte mein Wochenende :) und es ist seltsam, dass es im Simulator ohne Probleme funktioniert –

15

Bitte unten Referenz verwendet für die Lage in ios 9

allowsBackgroundLocationUpdates in CLLocationManager in iOS9

Diese neue Eigenschaft ist in der WWDC Sitzung erklärt: "Was ist neu in Core-Location".

Der Standardwert ist NO, wenn Sie gegen iOS Link 9.en

Wenn Ihre App Lage im Hintergrund verwendet (ohne die blaue Statusleiste angezeigt) Sie allowsBackgroundLocationUpdates auf YES neben Einstellung des Hintergrundmodus eingestellt haben Fähigkeit in Info.plist. Andernfalls werden Standortaktualisierungen nur im Vordergrund bereitgestellt. Der Vorteil besteht darin, dass Sie jetzt Standortmanager mit Aktualisierungen des Hintergrundstandorts und andere Standortmanager mit Updates für den Vordergrundstandort in derselben App haben können. Sie können den Wert auch auf NO zurücksetzen, um das Verhalten zu ändern.

Die Dokumentation ist ziemlich klar darüber:

Standardmäßig ist dies nicht für gegen iOS verknüpfte Anwendungen 9.0 oder höher, und zwar unabhängig von Mindestimplementierungsziel. Wenn UIBackgroundModes in Info.plist "location" enthalten soll, müssen Sie diese Eigenschaft auch zur Laufzeit auf YES setzen, wenn Sie -startUpdatingLocation mit der Absicht aufrufen, im Hintergrund fortzufahren.

Wenn diese Eigenschaft auf YES gesetzt wird, wenn UIBackgroundModes "location" nicht enthält, handelt es sich um einen schwerwiegenden Fehler.

Das Zurücksetzen dieser Eigenschaft auf NO entspricht dem Auslassen von "location" aus dem UIBackgroundModes-Wert. Der Zugriff auf den Standort ist weiterhin zulässig, wenn die Anwendung ausgeführt wird (dh nicht ausgesetzt ist) und über ausreichende Berechtigungen verfügt (dh sie hat die Berechtigung WhenInUse und wird verwendet oder hat die Berechtigung Immer). Die App unterliegt jedoch weiterhin den üblichen Regeln für die Aussetzung von Aufgaben.

Weitere Informationen zu möglichen Autorisierungswerten finden Sie unter -requestWhenInUseAuthorization und -requestAlwaysAuthorization.

Dank

+0

Vielen Dank für upvote und akzeptieren Sie – Dipen

+2

Bitte beachten Sie, dass Ihr Programm abstürzen wird, wenn Sie diese Eigenschaft auf Systemversionen kleiner als 9.0 hinzufügen. Sie werden sehen: [CLLocationManager setAlowsBackgroundLocationUpdates:]: unerkannter Selektor, der an die Instanz gesendet wurde. Bitte lesen Sie meine Antwort für das Management. – mkabatek

+0

in Ordnung dank vorschlagen – Dipen

8

ich hatte das gleiche Problem, müssen Sie etwas fügen: sieht

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){ 

    [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 

} 

Mein Makro wie dies für die Überprüfung der Systemversion:

Die folgende

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 
Forum Beitrag hat mir geholfen:

https://forums.developer.apple.com/thread/6895

Verwandte Themen