2016-05-20 2 views
0

Comment puis-je obtenir l'autorisation de l'utilisateur pour accéder au service de localisation à partir d'une classe non UI (iOS 8 et supérieur)? Peu importe ce que je fais - requestWhenInUseAuthorization n'alerte pas l'utilisateur. J'utilise l'objectif c.Autorisation de service de localisation iOS 8

J'ai également ajouté la clé dans le fichier plist.

LocationController.h

@interface LocationController : NSObject <CLLocationManagerDelegate>{ 
    BOOL _debug; 
} 

@property (strong, nonatomic) CLLocationManager *locationManager; 

@property (strong, nonatomic) CLLocation *location; 

- (id)initWithDebug:(BOOL)debug_flag; 

@end 

LocationController.m

@implementation LocationController { 
} 

@synthesize debug, locationManager, location; 

#define IOS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 

- (id)initWithDebug:(BOOL)debug_flag { 
    self = [super init]; 
    if (self) { 
    [self findLocation]; 
    } 
    return self; 
} 


-(void) findLocation{ 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    self.locationManager.distanceFilter = kCLDistanceFilterNone; 
    [self checkLocationPermissions]; 
    self.location = self.locationManager.location; 
} 

-(void)checkLocationPermissions { 
    if ([CLLocationManager locationServicesEnabled]) { 
     if (IOS_8_OR_LATER) { 
      [self.locationManager requestWhenInUseAuthorization]; 
     } else { 
      [self.locationManager startUpdatingLocation]; 
     } 
    } 
} 

#pragma mark - CLLocationManagerDelegate 
- (void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status 
{ 
    switch (status) { 
     case kCLAuthorizationStatusNotDetermined: { 
      [self.locationManager startUpdatingLocation]; 
     } break; 
     case kCLAuthorizationStatusDenied: { 
      [self.locationManager stopUpdatingLocation]; 
     } break; 
     case kCLAuthorizationStatusAuthorizedWhenInUse: 
     case kCLAuthorizationStatusAuthorizedAlways: { 
      [self.locationManager startUpdatingLocation]; 
     } break; 
     default: 
      break; 
    } 
} 

@end 

EDIT: Le code atteint jusqu'à [self.locationManager requestWhenInUseAuthorization]; mais ne montre jamais l'alerte.

Ce code est appelé à partir d'une opération blockOperation dans un SDK. Le SDK est initialisé en tant que singleton

+0

Consultez cette réponse mai il aider: [http://stackoverflow.com/a/24063578/5575752]http://stackoverflow.com/a/24063578/5575752) –

+0

Merci @ RonakChaniyara pour l'aide. J'ai regardé ça avant. Je devine que mon problème est dû à une classe de non-interface utilisateur que j'emploie pour obtenir des emplacements –

+0

http://nshipster.com/core-location-in-ios-8/ – Sanju

Répondre

0

Apparemment dans iOS 8 SDK, l'appel requestAlwaysAuthorization (pour l'emplacement d'arrière-plan) ou requestWhenInUseAuthorization (emplacement uniquement au premier plan) sur CLLocationManager est nécessaire avant le démarrage des mises à jour d'emplacement.

Vous devez également indiquer la clé NSLocationAlwaysUsageDescription ou NSLocationWhenInUseUsageDescription dans Info.plist avec un message à afficher dans l'invite. Ajouter ceux-ci a résolu mon problème.

essayez celui-ci

#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 

    //In ViewDidLoad 
    if(IS_OS_8_OR_LATER) { 
     [self.locationManager requestAlwaysAuthorization]; 
    } 

    [self.locationManager startUpdatingLocation]; 

Plus de détails se référer ce lien ----->http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

+0

J'ai tout en place. C'est juste que je n'utilise pas ce code dans une classe UIViewController, reposez tout ce que j'ai ajouté au besoin. Je ne vois pas l'alerte du tout :( –

+0

s'il vous plaît ajouter ce code.first cela a fonctionné pour moi –

+0

J'ai déjà ce code –

0

Ajouter dans votre fichier .m:

#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 


#import "ViewController.h" 
@interface ViewController() 
@end 
@implementation ViewController 
- (void)viewDidLoad { 
[super viewDidLoad]; 




// Do any additional setup after loading the view, typically from a nib. 



self.locationManager = [[CLLocationManager alloc] init]; 
self.locationManager.delegate = self; 

#ifdef __IPHONE_8_0

if(IS_OS_8_OR_LATER) { 
    // Use one or the other, not both. Depending on what you put in info.plist 
    [self.locationManager requestWhenInUseAuthorization]; 
    [self.locationManager requestAlwaysAuthorization]; 
} 

#endif[self.locationManager startUpdatingLocation];

NSLog(@"latitude: %f, longitude: %f",self.locationManager.location.coordinate.latitude,self.locationManager.location.coordinate.longitude); 

}

+0

Ce ne fonctionne pas non plus –

+0

@ armure - ... s'il vous plaît vérifier votre info.plist une fois ... et confirmer que vous ajoutez NSLocationWhenInUseUsageDescription ou NSLocationAlwaysAuthorization dans ce ..? –

+0

J'ai NSLocatio nWhenInUseUsageDescription dans mon fichier plist SDK –

0

cadre Ajouter à votre projet et à votre importation viewcontroller: CoreLocation.framework

Ajouter ce délégué à vous viewcontroller: CLLocationManagerDelegate

Ajouter valeur clé fichier .plist: NSLocationWhenInUseUsageDescription: "Votre message"

EDIT

+ (YourNSObjectClasssName*)sharedInstance { 

    @synchronized(self) { 
     if (location == nil) { 
      location = [[super allocWithZone:NULL] init] ; 
     } 
    } 
    return location; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) {} 
    return self; 
} 

#pragma mark - Start Location Updates 

-(void)startLocationUpdate{ 

    CLLocationManager *locationManager = [[CLLocationManager alloc]init]; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
    locationManager.delegate = self; 
    locationManager.distanceFilter = 10.0f; 

    if(![CLLocationManager locationServicesEnabled] || 
     [CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied){ 

     UIAlertView* failedStatus=[[UIAlertView alloc]initWithTitle:APP_NAME 
                  message:@"Would like to Use your location Please Enable Location Service in Setting" 
                  delegate:self 
                cancelButtonTitle:@"Setting" 
                otherButtonTitles:@"Cancel", nil]; 
     [failedStatus show]; 
    } 
    else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) { 
     [locationManager requestWhenInUseAuthorization]; 
    } 
    else{ 
     [locationManager startUpdatingLocation]; 
     [locationManager startMonitoringSignificantLocationChanges]; 
    } 
} 

Et ce que vous appelez la fonction startUpdate d'une autre classe

[[LocationTracker sharedInstance] startLocationUpdate]; 

Ici, je ne suis pas pour ajouter la condition < iOS 8.0. Pour cela, vous pouvez consulter la réponse de Vijay. (Ici distanceFiltre = 10.0 met à jour l'emplacement si l'utilisateur se déplace de plus de 10 mètres.)

Si ce code fonctionne toujours pas, essayez ci-dessous le cas:

  • Supprimer votre application iPhone et redémarrez votre appareil.
  • Changer la date de votre iPhone et autre date devrait être plus de 24 heures et redémarrez à nouveau votre iPhone.
  • Exécutez votre application Il vous demandera la permission.

La raison principale derrière ceci est Apple demandera toute permission pour accéder à la vie privée des utilisateurs est de plus de 24 heures.

Espérons que cela pourrait vous aider.

+0

Je travaille sur un SDK qui veut obtenir les détails de localisation. La classe SDK LocationController est de type NSObject. Je n'ai pas de ViewController dans le SDK –

+0

J'utilise aussi la classe NSObject et j'ai fait tout ce truc dans cette classe seulement. Faites une chose, créez une méthode d'instance partagée et appelez votre mise à jour d'emplacement en fonction de cela. Je met à jour la réponse s'il vous plaît vérifier. –

+0

N'oubliez pas d'ajouter la méthode delagate pour mettre à jour l'emplacement. :) Et pour arrêter la mise à jour de l'emplacement, vous pouvez créer une méthode et appeler la méthode startUpdate. –