Je travaille sur un morceau de code Swift pour iOS 8. J'essaie de faire quelque chose qui implique un emplacement. J'ai donc implémenté les éléments suivants dans mon fichier de contrôleur de vue Swift:
let locationManger:CLLocationManager = CLLocationManager()
var speedReceived:Double = 0
override func viewDidLoad() {
super.viewDidLoad()
locationManger.delegate = self
locationManger.desiredAccuracy = kCLLocationAccuracyBest
let authstate = CLLocationManager.authorizationStatus()
if(authstate == CLAuthorizationStatus.NotDetermined){
println("Not Authorised")
locationManger.requestWhenInUseAuthorization()
}
// Do any additional setup after loading the view, typically from a nib.
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!){
var location:CLLocation = locations[locations.count - 1] as CLLocation
if(location.horizontalAccuracy > 0){
self.speedReceived = location.speed
println(self.speedReceived)
}
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
println("Couldn't get your location")
}
Cependant, je n'arrive pas à faire en sorte que ce code fonctionne. Cela n'enregistre pas ma préférence pour l'utilisation de l'emplacement. il ne m'invite même pas à autoriser l'accès à l'emplacement. J'ai essayé de mettre à jour mon info.plist. Mais ça ne marche pas. Btw, si je sélectionne toujours dans les paramètres de confidentialité dans le simulateur, cela fonctionne si je reviens à l'application immédiatement. quelqu'un peut-il aider? Je suis sûr que c'est le problème parce que je reçois Non autorisé sur ma console.
De l'aide?
C'est un problème lié à iOS 8. Vous devez mettre les clés NSLocationAlwaysUsageDescription
ou NSLocationWhenInUseUsageDescription
dans votre fichier .plist
(la valeur peut être un message supplémentaire qui sera présenté dans l'alerte d'emplacement). Ces clés sont requises dans iOS 8.
Comment cela se dit dans Directives Apple :
Cette clé est requise lorsque vous utilisez requestAlwaysAuthorization Méthode de la classe CLLocationManager pour demander une autorisation pour services de location. Si cette clé n'est pas présente et que vous appelez le méthode requestAlwaysAuthorization, le système ignore votre demande et empêche votre application d'utiliser les services de localisation.
J'avais eu des problèmes avec un problème similaire, qui persistait même après avoir ajouté les clés NSLocationAlwaysUsageDescription/NSLocationWhenInUseUsageDescription au plist.
Finalement, j'ai ajouté la clé "Confidentialité - Emplacement, Utilisation" au plist (en plus des nouvelles clés) et le tour est joué, ça a fonctionné! Une fois que cela a fonctionné, j'ai pu supprimer la clé "Confidentialité - Emplacement, Utilisation" du plist et continuer à demander une autorisation.
iOS 8 a changé de stratégie d'autorisation d'emplacement. Solution avec compatibilité ascendante:
SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
[self.locationManager respondsToSelector:requestSelector]) {
[self.locationManager performSelector:requestSelector withObject:NULL];
} else {
[self.locationManager startUpdatingLocation];
}
Rappel: configuration de la clé NSLocationWhenInUseUsageDescription dans votre Info.plist
Etant donné que je n'aime pas éditer le plist directement, j'accorde toujours une autorisation en utilisant l'interface utilisateur.
Les textes néerlandais "Toegang is nodig" et "Toegang is noodzakelijk" sont affichés dans le menu contextuel dans lequel l'accès utilisé accorde. Vous pouvez les changer en n'importe quel texte.
Ajoutez simplement à la source de plist,
<key>NSLocationAlwaysUsageDescription</key>
<string>To get location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>To get location</string>
J'ai eu exactement le même problème.
Pour mémoire, ce n'est pas la réponse officielle. La première réponse est la bonne. Je voulais juste ajouter un lien vers un projet FOSS (Objective-C) qui illustre le correctif.
Comme indiqué, je devais ajouter la clé. Mon application n'a pas besoin de s'exécuter en arrière-plan. J'ai donc ajouté la clé NSLocationWhenInUseUsageDescription à mon info.plist.
Si vous ajoutez une chaîne en tant que valeur pour cette clé (facultatif - l'existence de la clé suffit à définir la barre), cette chaîne apparaîtra dans le menu contextuel d'autorisation.
J'ai ensuite ajouté le code suivant avant tous mes appels [CLLocationManager startUpdating]:
if ( [locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)] )
{
[locationManager requestWhenInUseAuthorization];
}
Le respondsToSelector est important, car l'appel n'est disponible que dans iOS 8.
La première fois que cela est appelé, l'alerte est affichée. Après cela, ça tombe à travers.
Notez que j'appelle requestWhenInUseAuthorization
Il doit correspondre à la valeur que je mets dans le plist. Je suppose que vous pourriez mettre les deux, mais je ne sais pas. Je n'avais pas besoin de.
Le projet est ici . La plupart du travail (pas beaucoup) est dans le fichier BMLTAppDelegate.m .
C'est une mauvaise surprise. Beaucoup de gens ne savent pas que leurs applications vont cesser de fonctionner dans iOS 8. Ils feront la même chose que je l'avais initialement faite: lancez-le rapidement dans le simulateur, notez le blocage et attribuez-le à un bêta.
Maintenant, j'ai un problème différent: toutes mes applications sont corrigées, mais Xcode se bloque lorsque j'essaie de télécharger les applications sur l'App Store. J'ai un RADAR ouvert dessus.
Xcode 6 est un peu grinçant. Je m'attends à ce qu'un patch sorte assez rapidement.
Pour Swift 2, j'ai remplacé la vérification respondsToSelector () par une vérification de la version iOS. Pas aussi élégant mais il est nécessaire pour Xcode 7 de donner 0 erreurs, 0 avertissements
if #available(iOS 8.0, *) {
locationManager.requestWhenInUseAuthorization()
} else {
locationManager.startUpdatingLocation()
}