web-dev-qa-db-fra.com

NSInternalInconsistencyException: 'Paramètre non valide non satisfaisant:! StayUp || CLClientIsBackgroundable (internal-> fClient) '

J'essaie de faire fonctionner mon application dans Xcode 7 beta, mais je frappe cette exception:

NSInternalInconsistencyException: 'Invalid parameter not satisfying: !stayUp || CLClientIsBackgroundable(internal->fClient)'

Voici la pile d'appels:

0   CoreFoundation                      0x00000001063a89b5 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x0000000105e20deb objc_exception_throw + 48
2   CoreFoundation                      0x00000001063a881a +[NSException raise:format:arguments:] + 106
3   Foundation                          0x00000001036f8b72 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
4   CoreLocation                        0x00000001031c7fe3 CLClientGetCapabilities + 8270
5   Peach                               0x00000001020c0ee9 -[PeachesBatteryOptimizer initWithDelegate:] + 761
6   Peach                               0x0000000102086d25 -[PeachAgent init] + 1141
7   Peach                               0x000000010208682c __23+[PeachAgent instance]_block_invoke + 76
8   libdispatch.dylib                   0x00000001068604bb _dispatch_client_callout + 8
9   libdispatch.dylib                   0x000000010684bedc dispatch_once_f + 543
10  Peach                               0x00000001020867bb +[PeachAgent instance] + 139
11  Peach                               0x0000000102086f4d +[PeachAgent createInstanceWithAppKey:andInternal:useDevApi:] + 93
12  Peach                               0x0000000101e2b710 -[ABCAppDelegate createPeachAgent] + 368
13  Peach                               0x0000000101e28703 -[ABCAppDelegate application:didFinishLaunchingWithOptions:] + 243
...

Quelqu'un a-t-il vu cela sur iOS 9 beta 5?

25
DanielG

J'ai réussi à résoudre ce problème en faisant ces deux choses:

  • UIBackgroundModes 'emplacement' ajouté à Info.plist
  • NSLocationAlwaysUsageDescription ajouté à Info.plist

Depuis iOS 11, les clés sont nommées:

  • NSLocationAlwaysAndWhenInUseUsageDescription et NSLocationWhenInUseUsageDescription
57
igraczech

Sélectionnez simplement votre schéma d'application et accédez à Capacités selon mon image ci-dessous, tout devrait fonctionner correctement.

enter image description here

9
Vision Mkhabela

Voici une autre solution si, comme moi, vous souhaitez utiliser [CLLocationManager setAllowsBackgroundLocationUpdates:] dans un module de projet/bibliothèque statique distinct. Vous obtiendrez ce plantage si l'application utilisant ce module/bibliothèque n'a pas la capacité de fond d'emplacement ... J'ai fait la méthode suivante pour sécuriser l'appel:

- (void) setAllowsBackgroundLocationUpdatesSafely
{
    NSArray* backgroundModes  = [[NSBundle mainBundle].infoDictionary objectForKey:@"UIBackgroundModes"];

    if(backgroundModes && [backgroundModes containsObject:@"location"]) {
        if([mLocationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
            // We now have iOS9 and the right capabilities to set this:
            [mLocationManager setAllowsBackgroundLocationUpdates:YES];
        }
    }
}
9
Mete

J'ai rencontré le même problème sur l'application hybride.

J'ai activé le mode d'arrière-plan.

Apple a rejeté mon application. Dire qu'il n'y a pas de fonctionnalités pour le mode fond.

J'ai donc apporté les modifications suivantes sur "BackgroundGeolocationDelegate.m"

1.locationManager.allowsBackgroundLocationUpdates = NO;

  1. if (authStatus == kCLAuthorizationStatusNotDetermined) {
        if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {  //iOS 8.0+
            NSLog(@"BackgroundGeolocationDelegate requestAlwaysAuthorization");
            [locationManager requestWhenInUseAuthorization];
        }
    }
    

Il n'y avait plus de crash. Remarque *: le correctif concerne uniquement les applications hybrides

4
kalyan711987

Autre option: Si vous avez sélectionné les modes d'arrière-plan dans les cibles -> Capacités, assurez-vous que l'une des options d'arrière-plan est sélectionnée. Vous dites à Xcode que vous allez utiliser quelque chose en arrière-plan, mais vous ne lui dites pas ce que vous allez utiliser

3
Spidvmp

Nous devons ajouter des capacités en mode UIBackground. Dans mon cas, CLLocation Manager fonctionne en mode arrière-plan et j'ai vérifié Location Updates clé qui est ajoutée dans Info.plist.

2
Anil Gupta

Cela m'est aussi arrivé. Au lieu d'activer la fonction d'arrière-plan et de la refuser potentiellement par Apple puisque vous n'avez pas besoin d'emplacements d'arrière-plan, supprimez tous les restes aux emplacements d'arrière-plan. Il y a de fortes chances que vous copiez et colliez la fonction de localisation à partir d'un ancienne application ou peut-être sur un site Web, pas que quiconque le fasse.

Vous devez commenter ou supprimer complètement: c'est probablement dans votre fonction de géolocalisation.

//for use in background
self.locationManager.allowsBackgroundLocationUpdates = true

Également dans votre vue, le chargement et/ou la vue apparaîtra, vous devez également commenter ou supprimer cela

//for use in background
self.locationManager.requestAlwaysAuthorization()

Si vous les laissez lorsque la fonction est appelée, l'application se plaindra que la capacité n'est pas activée.

1
dkurfirst

Nous avons iOS App & Notification Widget + Watch App. Le code suivant ne réside pas dans Watchkit Extension n'importe où ailleurs:

#if !EXTENSION self.startUpdatingLocationAllowingBackground() #endif

Nous n'avons pas besoin d'interroger l'emplacement ou d'autres exigences commerciales, qui sont à la base de la configuration globale de cette application dans tous les domaines (pas seulement ADP/iTC).

1
igraczech