web-dev-qa-db-fra.com

requestAlwaysAuthorization ne montrant pas l'alerte d'autorisation

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

27
Carlos Pastor

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.

30
Elist

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 ...

19
chris

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];
}
13
balkoth

Ajoutez simplement ces lignes à votre fichier .plist

<key>NSLocationAlwaysUsageDescription</key>
<string>Optional message</string>
7
Artyom Devyatov

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. 

2
Josh B

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)")

    }
2
SwiftDeveloper

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

2
Carlos Pastor

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:

  • Confidentialité - Emplacement en cours d'utilisation Description de l'utilisation
  • Confidentialité - Emplacement Description de l'utilisation
  • Confidentialité - Emplacement Toujours Description de l'utilisation
  • Confidentialité - Emplacement toujours et lors de l'utilisation Description d'utilisation
2
Bachir

Essayez de commencer à mettre à jour l'emplacement (ont aidé pour moi)

[self.locationManager startUpdatingLocation];
2
Anthony Marchenko

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!!

0
user3069232

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.

0
Crag

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.

0
Aanchal Chaurasia