allowsBackgroundLocationUpdates in CLLocationManager in iOS9
j'utilise CoreLocation
framework dans mon application Xcode7(pré-release),et j'ai remarqué qu'il y a une nouvelle propriété ajoutée appelée allowsBackgroundLocationUpdates
dans CLLocationManager
class.
Quelle est la relation entre cette propriété et les mises à jour de l'emplacement dans les Modes D'arrière-plan de l'onglet capacités. Quelle est sa valeur par défaut et affecte-t-elle les applications tournant dans iOS9?
6 réponses
NO
pour changer le comportement.
la documentation est assez claire à ce sujet:
par défaut, C'est non pour les applications liées à iOS 9.0 ou plus tard, indépendamment de déploiement minimal cible.
avec les modes Uibackground définis pour inclure "location" dans Info.plist, vous doit également définir cette propriété à YES à l'exécution chaque fois que vous appelez -startUpdatingLocation avec l'intention de continuer dans le fond.
paramètre cette propriété à Oui lorsque UIBackgroundModes n'inclut pas "emplacement" est une erreur fatale.
réinitialiser cette propriété à NO équivaut à omettre l'emplacement" à partir de la UIBackgroundModes valeur. L'accès à l'emplacement est toujours autorisé chaque fois que l'application est en cours d'exécution (c'est-à-dire qu'elle n'est pas suspendue), et dispose d'une autorisation suffisante (C'est-à-dire Qu'elle dispose D'une en cours d'utilisation, ou il a Toujours l'autorisation). Toutefois, l'application va encore être soumis aux règles habituelles de suspension des tâches.
Voir-demande d'autorisation d'utilisation et-demande d'autorisation d'utilisation plus de détails sur les éventuelles valeurs d'autorisation.
si vous utilisez CoreLocation framework dans votre application Xcode7(pré-released),et vous pouvez remarquer qu'il y a une propriété nouvellement ajoutée appelée allowsbackgroundlocupdates dans la classe CLLocationManager.
cette nouvelle propriété est expliquée dans la session WWDC " Quoi de neuf dans L'emplacement de base " .
la valeur par défaut est NO
si vous vous liez avec iOS 9.
si votre application utilise l'emplacement dans l'arrière-plan (sans afficher la barre d'état bleue) vous devez définir allowsBackgroundLocationUpdates
à YES
en plus de définir la capacité du mode d'arrière-plan dans L'Info.plist. Dans le cas contraire, les mises à jour de localisation ne sont fournies qu'en premier plan. L'avantage est que vous pouvez maintenant avoir des gestionnaires d'emplacement avec des mises à jour d'emplacement de fond et d'autres gestionnaires d'emplacement avec seulement des mises à jour d'emplacement de premier plan dans la même application. Vous pouvez également réinitialiser la valeur à NO
pour changer le comportement.
la documentation est assez claire à ce sujet:
par défaut, C'est non pour les applications liées à iOS 9.0 ou plus tard, quel que soit l'objectif minimal de déploiement.
avec les modes Uibackground définis pour inclure "location" dans Info.plist, vous doit également définir cette propriété à YES à l'exécution chaque fois que vous appelez -startUpdatingLocation avec l'intention de continuer dans le fond.
Définir cette propriété à YES quand UIBackgroundModes n'inclut pas "emplacement" est une erreur fatale.
réinitialiser cette propriété à NO équivaut à omettre l'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 qu'elle n'est pas suspendue), et dispose d'une autorisation suffisante (C'est-à-dire Qu'elle dispose D'une en cours d'utilisation, ou il a Toujours l'autorisation). Toutefois, l'application va encore être soumis à les règles habituelles de suspension des tâches.
Voir-demande d'autorisation d'utilisation et-demande d'autorisation d'utilisation plus de détails sur les éventuelles valeurs d'autorisation.
Set Info.plist comme:
la syntaxe pour L'Info.la configuration de plist ressemble à ceci:
<key>NSLocationAlwaysUsageDescription</key>
<string>I want to get your location Information in background</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
ou tirez vers le haut de L'onglet capacités de votre cible app.
utiliser comme:
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
[_locationManager requestAlwaysAuthorization];
}
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
[_locationManager startUpdatingLocation];
j'écris une démo ici (Demo2)
Eh bien, j'utilise toujours xCode 6, puisque 7 beta craque toujours avec le simulateur, et j'ai ce problème bien que je ne me lie même pas avec iOS9! Et je ne peux pas mettre cette propriété puisqu'elle n'existe pas dans iOS8! Oh pomme, quand le tourment finira-t-il?!
Je l'ai changé en cette version compatible xCode6 en faisant cette invocation tardive liée:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {
BOOL yes = YES;
NSMethodSignature* signature = [[CLLocationManager class] instanceMethodSignatureForSelector: @selector( setAllowsBackgroundLocationUpdates: )];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature];
[invocation setTarget: locationManager];
[invocation setSelector: @selector( setAllowsBackgroundLocationUpdates: ) ];
[invocation setArgument: &yes atIndex: 2];
[invocation invoke];
}
travail confirmé sur iOS8 (ne fait rien) et sur iOS9 beta 6 (invoque la méthode correctement.)
j'ai fait face à la même emplacement de service sur le Mode d'arrière-plan pour iOS 9.0.x et je l'ai corrigé comme il est recommandé dans ce post en ajoutant ci-dessous les codes
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
cependant, il ne fonctionne pas dans iOS 9.1 est-ce que quelqu'un a le même problème??? Si oui, merci de bien vouloir les aider. Merci
{
NSArray* backgroundModes = [NSBundle MainBundle].infoDictionary[@"UIBackgroundModes"];
if(backgroundModes && [backgroundModes containsObject:@"location"]) {
if([manager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
// We now have iOS9 and the right capabilities to set this:
[manager setAllowsBackgroundLocationUpdates:YES];
}
}
}
Ici est un résumé de plusieurs méthodes qui sont mises à jour de iOS 8 à iOS 9
plusieurs API et codes doivent être recherchés pour chaque framework que vous utilisez. Donc, rechercher en général le cadre et puis trouver ces méthodes pour mettre à jour les méthodes amorties.