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?
J'ai réussi à résoudre ce problème en faisant ces deux choses:
UIBackgroundModes
'emplacement' ajouté à Info.plistNSLocationAlwaysUsageDescription
ajouté à Info.plistDepuis iOS 11, les clés sont nommées:
NSLocationAlwaysAndWhenInUseUsageDescription
et NSLocationWhenInUseUsageDescription
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];
}
}
}
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;
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
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
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.
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.
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).