web-dev-qa-db-fra.com

allowBackgroundLocationUpdates dans CLLocationManager dans iOS9

J'utilise CoreLocation framework dans mon application dans Xcode7 (pré-publié) et j'ai remarqué qu'il y avait une propriété récemment ajoutée appelée allowsBackgroundLocationUpdates dans CLLocationManager classe.

Quelle est la relation entre cette propriété et les mises à jour d'emplacement dans l'onglet Modes d'arrière-plan de l'onglet Capacités. Quelle est sa valeur par défaut et cela affecte-t-il les applications exécutées dans iOS9?

63
tounaobun

Cette nouvelle propriété est expliquée dans la session WWDC "Nouveautés de l'emplacement principal" .

La valeur par défaut est NO si vous établissez un lien avec iOS 9.

Si votre application utilise l'emplacement en arrière-plan (sans afficher la barre d'état bleue), vous devez définir allowsBackgroundLocationUpdates sur YES en plus de définir la fonctionnalité de mode d'arrière-plan dans Info.plist. Sinon, les mises à jour d'emplacement ne sont fournies qu'au premier plan. L'avantage est que vous pouvez maintenant 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 redéfinir 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 ultérieur, quelle que soit la cible de déploiement minimale.

Lorsque UIBackgroundModes est défini pour inclure "emplacement" dans Info.plist, vous devez également définir cette propriété sur YES au moment de l'exécution, à chaque appel de -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.

Réinitialiser cette propriété sur NO revient à omettre "emplacement" de la valeur UIBackgroundModes. L'accès à l'emplacement est toujours autorisé lorsque l'application est en cours d'exécution (c'est-à-dire qu'elle n'est pas suspendue) et qu'elle dispose de suffisamment d'autorisations (c'est-à-dire qu'elle dispose de l'autorisation WhenInUse et qu'elle est en cours d'utilisation ou qu'elle a toujours l'autorisation). Cependant, l'application sera toujours soumise aux règles habituelles de suspension de tâches.

Voir -requestWhenInUseAuthorization et -requestAlwaysAuthorization pour plus de détails sur les valeurs d'autorisation possibles.

103
Felix

Si vous utilisez la structure CoreLocation dans votre application dans Xcode7 (version préliminaire), vous remarquerez peut-être qu’une propriété récemment ajoutée, appelée allowBackgroundLocationUpdates, a été ajoutée à la classe CLLocationManager.

Cette nouvelle propriété est expliquée dans la session WWDC "Nouveautés de l'emplacement principal"enter image description here

La valeur par défaut est NO si vous établissez un lien avec iOS 9.

Si votre application utilise l'emplacement en arrière-plan (sans afficher la barre d'état bleue), vous devez définir allowsBackgroundLocationUpdates sur YES en plus de définir la fonctionnalité de mode d'arrière-plan dans Info.plist. Sinon, les mises à jour d'emplacement ne sont fournies qu'au premier plan. L'avantage est que vous pouvez maintenant 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 de premier plan dans la même application. Vous pouvez également redéfinir 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 ultérieur, quelle que soit la cible de déploiement minimale.

Lorsque UIBackgroundModes est défini pour inclure "emplacement" dans Info.plist, vous devez également définir cette propriété sur YES au moment de l'exécution, à chaque appel de -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.

Réinitialiser cette propriété sur NO revient à omettre "emplacement" de la valeur UIBackgroundModes. L'accès à l'emplacement est toujours autorisé lorsque l'application est en cours d'exécution (c'est-à-dire qu'elle n'est pas suspendue) et qu'elle dispose de suffisamment d'autorisations (c'est-à-dire qu'elle dispose de l'autorisation WhenInUse et qu'elle est en cours d'utilisation ou qu'elle a toujours l'autorisation). Cependant, l'application sera toujours soumise aux règles habituelles de suspension de tâches.

Voir -requestWhenInUseAuthorization et -requestAlwaysAuthorization pour plus de détails sur les valeurs d'autorisation possibles.

Réglez Info.plist comme suit: enter image description here

La syntaxe de la configuration Info.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 ouvrez l'onglet Capabilities de la cible de votre application.

enter image description here

Utilisez 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 Here (Demo2)

39
ElonChan

Eh bien, j'utilise toujours xCode 6, car la version 7 bêta se bloque toujours avec le simulateur, et j'ai ce problème bien que je ne crée même pas de lien contre iOS9! Et je ne peux pas définir cette propriété car elle n'existe pas dans iOS8! Oh Apple, quand le supplice prendra-t-il fin?!

Je l'ai changé pour cette version compatible xCode6 en faisant cette invocation liée tardive:

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];
        }

Confirmé de travailler sur iOS8 (ne fait rien) et sur iOS9 beta 6 (appelle la méthode correctement).

5
TalL

J'ai fait face au même service de localisation en arrière-plan en mode arrière-plan pour iOS 9.0.x et je l'ai corrigé comme recommandé dans ce message en ajoutant les codes ci-dessous.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}

Cependant cela ne fonctionne pas dans iOS 9.1 Quelqu'un at-il le même problème ??? Si oui, merci de bien vouloir 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];
         }
     }
}
5
Manish Nahar

Here est un résumé des nombreuses méthodes mises à jour d'iOS 8 à iOS 9

De nombreux API et codes doivent être recherchés pour chaque framework que vous utilisez. Il faut donc rechercher dans le cadre général, puis trouver ces méthodes pour mettre à jour les méthodes amorties.

0
Tommy Woodfin