Mon application suit l'emplacement en arrière-plan ... le mode d'arrière-plan de l'emplacement est activé et j'utilise
[self.locationManager startUpdatingLocation];
Cela fonctionne très bien sur iOS7-8
mais il a cessé de fonctionner sur iOS9
Dans le simulateur, cela fonctionne, mais sur un appareil réel, je ne reçois aucun rappel en arrière-plan ... lors de l'exécution du même code sur un appareil iOS8, je reçois des rappels normaux comme auparavant
Est-ce documenté? Pourquoi cela fonctionne-t-il dans le simulateur et non dans l'appareil? Est-ce un bug?
Lorsque vous utilisez startSignificantChangeUpdates
cela fonctionne sur iOS9, je me demande si c'est une sorte de fonction d'économie de batterie, qu'ils ont peut-être interdit startUpdatingLocation
Utilisation:
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
pour éviter d'utiliser une macro qui évalue la version du système. Cela appellera setAllowsBackgroundLocationUpdates: sur iOS 9 mais pas sur iOS 8.
Veuillez utiliser la référence ci-dessous pour l'emplacement dans iOS 9
permetBackgroundLocationUpdates dans CLLocationManager dans iOS9
Cette nouvelle propriété est expliquée dans la session WWDC "Quoi de neuf dans l'emplacement principal".
La valeur par défaut est NO si vous établissez une liaison avec iOS 9.
Si votre application utilise un emplacement en arrière-plan (sans afficher la barre d'état bleue), vous devez définir allowBackgroundLocationUpdates sur YES en plus de définir la capacité du mode d'arrière-plan dans Info.plist. Sinon, les mises à jour de position ne sont fournies qu'au premier plan. L'avantage est que vous pouvez désormais avoir des gestionnaires d'emplacement avec des mises à jour d'emplacement en arrière-plan et d'autres gestionnaires d'emplacement avec uniquement des mises à jour d'emplacement au premier plan dans la même application. Vous pouvez également réinitialiser la valeur sur NO pour modifier le comportement.
La documentation est assez claire à ce sujet:
Par défaut, il s'agit de NON pour les applications liées à iOS 9.0 ou version ultérieure, quelle que soit la cible de déploiement minimale.
Avec UIBackgroundModes défini pour inclure "emplacement" dans Info.plist, vous devez également définir cette propriété sur YES lors de l'exécution chaque fois que vous appelez -startUpdatingLocation avec l'intention de continuer en arrière-plan.
La définition de cette propriété sur YES lorsque UIBackgroundModes n'inclut pas "emplacement" est une erreur fatale.
La réinitialisation de cette propriété sur NO équivaut à omettre "emplacement" de la valeur UIBackgroundModes. L'accès à l'emplacement est toujours autorisé chaque fois que l'application est en cours d'exécution (c'est-à-dire non suspendue) et dispose d'une autorisation suffisante (c'est-à-dire qu'elle a l'autorisation WhenInUse et est en cours d'utilisation ou qu'elle a toujours l'autorisation). Cependant, l'application sera toujours soumise aux règles habituelles de suspension des tâches.
Voir -requestWhenInUseAuthorization et -requestAlwaysAuthorization pour plus de détails sur les valeurs d'autorisation possibles.
Merci
J'ai eu le même problème, vous devez ajouter quelque chose comme ceci:
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
Ma macro pour vérifier la version du système ressemble à ceci:
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
Le message de forum suivant m'a aidé:
La nouvelle méthode est locationManager -> requestLocation () voir https://developer.Apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/ Également ajouté allowBackgroundLocationUpdates (uniquement pour iOS9).