J'essaie d'utiliser des iBeacons fantaisistes sans succès, kCLAuthorizationStatusNotDéterminé tout le temps. Selon d’autres questions, il est nécessaire d’ajouter ces clés à info.plist (certaines questions en disent une, d’autres dit les deux). Selon un article sur iBeacons, j’ai besoin de l’option Toujours.
<key>NSLocationWhenInUseUsageDescription</key>
<string>Nothing to say</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Permiso para acceder siempre</string>
À viewDidAppear:
self.locManager = [[CLLocationManager alloc]init];
self.locManager.delegate = self;
[self.locManager requestAlwaysAuthorization];
NSUUID* region1UUID = [[NSUUID alloc]initWithUUIDString:@""]; //ibeacon real UUID between "". Checked it's not nil.
self.beaconRegion = [[CLBeaconRegion alloc]
initWithProximityUUID:proximityUUID
identifier:@"myCoolString"];
self.beaconRegion.notifyEntryStateOnDisplay = YES;
self.beaconRegion.notifyOnEntry = YES;
self.beaconRegion.notifyOnExit = NO;
[self.locManager startMonitoringForRegion:self.beaconRegion];
[self.locManager startRangingBeaconsInRegion:self.beaconRegion];
L'icône n'apparaissait pas dans Paramètres/Confidentialité/Emplacement avant l'exécution de l'une des deux dernières méthodes. La vue d'alerte pour approuver les autorisations ne s'affiche jamais .. Si j'effectue une modification manuelle dans les paramètres d'emplacement, je vérifie que l'état changera, mais que quelques instants plus tard, l'emplacement dans les paramètres supprimera l'état "Toujours" de mon application et le laissera. vide à nouveau. Plus tard je vérifie sans chance
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
Des idées ce qui manque ou qui ne va pas? Je vous remercie
Pour les développeurs iOS 11, vous devriez jeter un coup d’œil à cet article: Les services de localisation ne fonctionnent pas sous iOS 11 .
TL; DR: vous avez besoin de TOUTES TROIS clés d’emplacement dans l’Info.plist:
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
Avec InfoPlist.strings
traductions dans le cas d'applications multilingues.
Avait exactement le même problème ... Il s'est avéré que dans mon cas, la NSLocationAlwaysUsageDescription
était également requise dans mes fichiers de localisation InfoPlist.strings
. Avoir NSLocationAlwaysUsageDescription
dans Info.plist
n'était pas suffisant ...
J'ai remarqué que si votre instance de CLLocationManager est détruite avant que l'alerte ne s'affiche, vous ne verrez jamais l'alerte . Dans mon cas, je créais une variable locale du gestionnaire d'emplacement dans AppDelegate pour demander une autorisation.
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[locationManager requestAlwaysAuthorization];
}
La modification de la variable locale en une variable d'instance a rendu l'alerte affichée:
@interface AppDelegate () {
CLLocationManager *_locationManager;
}
@end
_locationManager = [[CLLocationManager alloc] init];
if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[_locationManager requestAlwaysAuthorization];
}
Ajoutez simplement ces lignes à votre fichier .plist
<key>NSLocationAlwaysUsageDescription</key>
<string>Optional message</string>
Assurez-vous d’ajouter les clés au fichier Info.plist approprié. N'oubliez pas qu'il y en a un pour votre application et un pour AppTest.
Swift 3.X Latest code facilement utiliser
import CoreLocation
public var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let altitudeG = locations.last?.altitude
let longitudeG = locations.last?.coordinate.longitude
let latitudeG = locations.last?.coordinate.latitude
print("\(altitudeG) \(longitudeG) \(latitudeG)")
}
Trouvé, documenté sur des forums et testé, c'est un bogue lié à Objective-C pour iOS 8. .. Le même code écrit en Swift fonctionne. Travailler code Swift, délégué est appel.
Ajouter la structure d'emplacement de base à Paramètres du projet/Objectifs/Capacités/Modes d'arrière-plan, définir "Mises à jour de l'emplacement" et "Utilise les accessoires Bluetooth LE".
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
var locManager: CLLocationManager?
override func viewDidLoad() {
super.viewDidLoad()
self.locManager = CLLocationManager();
self.locManager!.delegate = self;
if (!CLLocationManager.locationServicesEnabled()) {
println("Location services are not enabled");
}
self.locManager!.requestAlwaysAuthorization();
self.locManager!.pausesLocationUpdatesAutomatically = false;
let uuidString = "" // My ibeacon string there
let beaconIdentifier = "myCompany"
let beaconUUID:NSUUID = NSUUID(UUIDString: uuidString)
let beaconRegion:CLBeaconRegion = CLBeaconRegion(proximityUUID: beaconUUID,
identifier: beaconIdentifier)
self.locManager!.startMonitoringForRegion(beaconRegion)
self.locManager!.startRangingBeaconsInRegion(beaconRegion)
self.locManager!.startUpdatingLocation()
}
La boîte de dialogue apparaît OK
J'ai récemment eu un problème similaire avec IOS 11 lorsque j'ai essayé d'utiliser
locationManager.requestAlwaysAuthorization()
La solution pour moi a été d'ajouter toutes les 4 autorisations dans plist.info pour obtenir l'alerte:
Essayez de commencer à mettre à jour l'emplacement (ont aidé pour moi)
[self.locationManager startUpdatingLocation];
J'ai copié ce tutoriel ...
http://willd.me/posts/getting-started-with-ibeacon-a-Swift-tutorial
Cela n'a pas fonctionné, bien que la solution soit très simple, ne déclarez pas
laisser locationManager = CLLocationManager ()
Mais déplacez-le dans la classe en tant que variable
var locationManager = CLLocationManager ()
Et il fonctionne!!
Il affichera une invite lorsque l'autorisation d'emplacement pour votre application n'est pas définie et une fois qu'elle est définie, les appels suivants n'apparaissent pas appel a été avalé).
De Documents Apple :
Discussion Lorsque le statut d'autorisation actuel n'est pas déterminé, cette méthode s'exécute de manière asynchrone et invite l'utilisateur à accorder autorisation à l'application d'utiliser les services de localisation. L'utilisateur invite contient le texte de la clé NSLocationAlwaysUsageDescription dans le fichier Info.plist de votre application, et la présence de cette clé est requise en appelant cette méthode. Une fois le statut déterminé, l'emplacement gestionnaire transmet les résultats au délégué locationManager (: didChangeAuthorization :) méthode. Si le courant le statut de l'autorisation est autre que non déterminé, cette méthode ne fait rien et n'appelle pas le locationManager (: didChangeAuthorization :) méthode, à une exception près . Si votre application n'a jamais demandé toujours l'autorisation et son actuel le statut de l'autorisation est autoriséQuandInUse, vous pouvez appeler ceci méthode une fois pour essayer de changer le statut d’autorisation de votre application en autoriséToujours.
Veuillez vérifier ceci Lien de référence
Il a décrit tous les changements concernant iOS 11. Votre problème semble également être l'un des cas décrits. Cela pourrait vous donner une idée des modifications à apporter dans votre code pour corriger le problème.