Mon application qui fonctionnait bien sur iOS 7 ne fonctionne pas avec le SDK iOS 8.
CLLocationManager
ne renvoie pas de position, et je ne vois pas non plus mon application dans Paramètres -> Services de localisation . J'ai fait une recherche Google sur le problème, mais rien ne s'est produit. Qu'est-ce qui ne va pas?
Réponses:
J'ai fini par résoudre mon propre problème.
Apparemment, dans le SDK iOS 8,
requestAlwaysAuthorization
(pour l'emplacement en arrière-plan) ourequestWhenInUseAuthorization
(emplacement uniquement au premier plan), un appelCLLocationManager
est nécessaire avant de commencer les mises à jour de l'emplacement.Il faut aussi être
NSLocationAlwaysUsageDescription
ouNSLocationWhenInUseUsageDescription
clé dansInfo.plist
un message à afficher dans l'invite. L'ajout de ceux-ci a résolu mon problème.J'espère que cela aide quelqu'un d'autre.
EDIT: Pour plus d'informations, consultez: Core-Location-Manager-Changes-in-ios-8
la source
J'arrachais mes cheveux avec le même problème. Xcode vous donne l'erreur:
Mais même si vous implémentez l'une des méthodes ci-dessus, cela n'invitera pas l'utilisateur sauf s'il existe une entrée dans info.plist pour
NSLocationAlwaysUsageDescription
ouNSLocationWhenInUseUsageDescription
.Ajoutez les lignes suivantes à votre info.plist où les valeurs de chaîne représentent la raison pour laquelle vous avez besoin d'accéder à l'emplacement des utilisateurs
Je pense que ces entrées peuvent avoir été manquantes depuis que j'ai commencé ce projet dans Xcode 5. Je suppose que Xcode 6 pourrait ajouter des entrées par défaut pour ces clés, mais elles n'ont pas été confirmées.
Vous pouvez trouver plus d'informations sur ces deux paramètres ici
la source
Pour vous assurer que cela est rétrocompatible avec iOS 7, vous devez vérifier si l'utilisateur exécute iOS 8 ou iOS 7. Par exemple:
la source
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { ...
requestAlwaysAuthorization
méthode. Ma solution supplémentaire était d'utiliser cette ligne dans laif
déclaration au lieu d'un appel de méthode normale:[self.locationManager performSelector:@selector(requestAlwaysAuthorization)];
. C'est peut-être évident pour d'autres personnes, mais il m'a fallu un certain temps pour comprendre. Je pense que c'est la bonne solution jusqu'à la sortie du Xcode 6 final.__IPHONE_OS_VERSION_MAX_ALLOWED
(#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
)Et dans votre fichier info.plist
la source
Selon les documents Apple:
Depuis iOS 8, la présence d'une
NSLocationWhenInUseUsageDescription
ou d'uneNSLocationAlwaysUsageDescription
valeur clé dans le fichier Info.plist de votre application est requise. Il est donc également nécessaire de demander l' autorisation de l'utilisateur de l' enregistrement avant pour les mises à jour de localisation, soit en appelant[self.myLocationManager requestWhenInUseAuthorization]
ou en[self.myLocationManager requestAlwaysAuthorization]
fonction de vos besoins. La chaîne que vous avez entrée dans Info.plist sera alors affichée dans la boîte de dialogue suivante.Si l'utilisateur accorde la permission, c'est comme d'habitude. S'ils refusent l'autorisation, le délégué n'est pas informé des mises à jour de l'emplacement.
la source
Ces deux clés prennent une chaîne
la source
Ma solution qui peut être compilée dans Xcode 5:
la source
L'ancien code pour demander l'emplacement ne fonctionnera pas dans iOS 8. Vous pouvez essayer cette méthode pour l'autorisation d'emplacement:
la source
Dans iOS 8, vous devez faire deux choses supplémentaires pour que la localisation fonctionne: Ajoutez une clé à votre Info.plist et demandez l'autorisation au gestionnaire de localisation lui demandant de démarrer
info.plist:
Ajoutez ceci à votre code
la source
Une erreur courante pour les développeurs Swift:
Assurez-vous d'abord d'ajouter une valeur à la liste pour soit
NSLocationWhenInUseUsageDescription
ouNSLocationAlwaysUsageDescription
.Si vous ne voyez toujours pas de fenêtre vous demander l'autorisation, vérifiez si vous mettez la ligne
var locationManager = CLLocationManager()
dans laviewDidLoad
méthode de votre contrôleur de vue . Si vous le faites, même si vous appelezlocationManager.requestWhenInUseAuthorization()
, rien n'apparaîtra . En effet, après l'exécution de viewDidLoad, la variable locationManager est désallouée (effacée).La solution consiste à localiser la ligne
var locationManager = CLLocationManager()
en haut de la méthode de classe.la source
Avant
[locationManager startUpdatingLocation];
, ajoutez une demande de services de localisation iOS8:Modifiez votre application
Info.plist
et ajoutez une cléNSLocationAlwaysUsageDescription
avec la valeur de chaîne qui sera affichée pour l'utilisateur (par exemple,We do our best to preserve your battery life.
)Si votre application n'a besoin de services de localisation que lorsqu'elle est ouverte, remplacez:
requestAlwaysAuthorization
avecrequestWhenInUseAuthorization
etNSLocationAlwaysUsageDescription
avecNSLocationWhenInUseUsageDescription
.la source
Je travaillais sur une application mise à niveau vers iOS 8 et les services de localisation ont cessé de fonctionner. Vous obtiendrez probablement une erreur dans la zone de débogage comme ceci:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
J'ai fait la procédure la moins intrusive. Ajoutez d'abord une
NSLocationAlwaysUsageDescription
entrée à votre info.plist:Notez que je n'ai pas rempli la valeur de cette clé. Cela fonctionne toujours, et je ne suis pas inquiet car il s'agit d'une application interne. De plus, il existe déjà un titre demandant à utiliser les services de localisation, donc je ne voulais rien faire de redondant.
Ensuite, j'ai créé un conditionnel pour iOS 8:
Après cela, la
locationManager:didChangeAuthorizationStatus:
méthode est appelée:Et maintenant, tout fonctionne bien. Comme toujours, consultez la documentation .
la source
Solution avec compatibilité descendante:
Configurez la clé NSLocationWhenInUseUsageDescription dans votre Info.plist
la source
locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error
. Il a cependant oublié d'ajouter startUpdatingLocation à l'instruction if donc après l'avoir acceptée ou refusée, elle n'appelle pas réellement startUpdateLocation.Solution avec compatibilité descendante qui ne génère pas d'avertissements Xcode:
NSLocationWhenInUseUsageDescription
Clé de configuration dans votreInfo.plist
.Pour iOS version 11.0+ :
NSLocationAlwaysAndWhenInUseUsageDescription
clé d' installation dans votreInfo.plist
. avec 2 autres clés.la source
C'est un problème avec iOS 8 Ajoutez ceci à votre code
et à info.plist:
la source
NSLocationUsageDescription
n'est pas utilisé sur iOS8 +Pour accéder à l'emplacement utilisateur dans iOS 8, vous devrez ajouter,
Cela demandera à l'utilisateur l'autorisation d'obtenir son emplacement actuel.
la source
Procédure Objective-C Suivez les instructions ci-dessous:
Pour iOS-11 Pour iOS 11 jetez un œil à cette réponse: accès à l'emplacement iOS 11
Besoin d'ajouter deux clés dans plist et de fournir un message comme l'image ci-dessous:
Pour iOS-10 et inférieur:
Déléguer les méthodes
Procédure rapide
Suivez les instructions ci-dessous:
Pour iOS-11 Pour iOS 11 jetez un œil à cette réponse:accès à l'emplacement iOS 11
Besoin d'ajouter deux clés dans plist et de fournir un message comme l'image ci-dessous:
Pour iOS-10 et inférieur:
Déléguer les méthodes
la source
Pour ceux qui utilisent Xamarin , j'ai dû ajouter la clé
NSLocationWhenInUseUsageDescription
à info.plist manuellement car elle n'était pas disponible dans les listes déroulantes de Xamarin 5.5.3 Build 6 ou XCode 6.1 - seuleNSLocationUsageDescription
figurait dans la liste, ce qui a provoqué laCLLocationManager
poursuite de la échouent silencieusement.la source
la source
Un petit assistant pour vous tous qui avez plus d'un fichier Info.plist ...
Il ajoutera la balise nécessaire à tous les fichiers Info.plist du répertoire actuel (et des sous-dossiers).
Un autre est:
Il ajoutera votre description à tous les fichiers.
la source
Gardez les informations de Cocoa Keys toujours à portée de main pour ces mises à jour, voici le lien:
https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26
Prendre plaisir.
la source
J'obtiens une erreur similaire dans iOS9 (en travaillant avec Xcode 7 et Swift 2): j'essaie de démarrer les mises à jour de localisation de MapKit sans demander l'autorisation de localisation. Doit appeler - [CLLocationManager requestWhenInUseAuthorization] ou - [CLLocationManager requestAlwaysAuthorization] en premier. Je suivais un tutoriel mais le tuteur utilisait iOS8 et Swift 1.2. Il y a quelques changements dans Xcode 7 et Swift 2, j'ai trouvé ce code et cela fonctionne bien pour moi (si quelqu'un a besoin d'aide):
Enfin, je mets cela dans info.plist: Liste des propriétés d'informations: NSLocationWhenInUseUsageDescription Valeur: l' application a besoin de serveurs de localisation pour le personnel
la source
Afin d'accéder à l'emplacement des utilisateurs dans iOS. Vous devez ajouter deux clés
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
dans le fichier Info.plist.
Voir cette image ci-dessous.
la source
Ajouter une clé
NSLocationWhenInUseUsageDescription
ouNSLocationAlwaysUsageDescription
(utilisation du GPS en arrière-plan) avec une chaîne demandant d'utiliser le GPS sur chacuninfo.plist
de chaque cible.Demandez la permission en exécutant:
[self initLocationManager: locationManager];
Où
initLocationManager
est:N'oubliez pas que si les clés ne sont pas sur chacune
info.plist
pour chaque cible, l'application ne demandera pas à l'utilisateur. Leif
fournit la compatibilité avec iOS 7 et larespondsToSelector:
méthode garantit la compatibilité future plutôt que de simplement résoudre le problème pour iOS 7 et 8.la source
Le problème pour moi était que la classe qui était
CLLocationManagerDelegate
était privée, ce qui empêchait toutes les méthodes déléguées d'être appelées. Je suppose que ce n'est pas une situation très courante, mais j'ai pensé que je le mentionnerais au cas où cela aiderait quelqu'un.la source
Ajouter ceux clé dans
InfoPlist.strings
dans iOS 8.4, mini iPad 2. Il fonctionne aussi. Je ne mets aucune clé, commeNSLocationWhenInUseUsageDescription
, dans monInfo.plist
.InfoPlist.strings :
La base de ce fil , dit-il
as in iOS 7
, peut être localisée dans InfoPlist.strings. Dans mon test, ces clés peuvent être configurées directement dans le fichierInfoPlist.strings
.MISE À JOUR:
Je pense que
@IOS
la méthode est meilleure. Ajoutez la clé àInfo.plist
avec une valeur vide et ajoutez des chaînes localisées àInfoPlist.strings
.la source