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?

61
demandé sur Moritz 2015-06-12 19:41:20

6 réponses

L'avantage est que vous pouvez maintenant avoir des gestionnaires d'emplacement avec des mises à jour d'emplacement de fond et 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, 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.

101
répondu Felix 2017-07-21 20:02:47

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 " . enter image description here

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: enter image description here

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.

enter image description here

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)

39
répondu ElonChan 2017-02-08 15:04:01

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.)

5
répondu TalL 2015-09-08 16:23:48

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

5
répondu Prapon Toongsi Tum Tom 2015-11-04 17:15:42
{
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];
         }
     }
}
4
répondu Manish Nahar 2016-05-03 11:30:17

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.

0
répondu Tommy Woodfin 2016-11-11 11:05:27