iOS 8 requestWhenInUseAuthorization no Popup

怎甘沉沦 提交于 2019-11-27 17:26:37

From the documentation

NSLocationWhenInUseUsageDescription (String - iOS) describes the reason why the app accesses the user’s location normally while running in the foreground. Include this key when your app uses location services to track the user’s current location directly. This key does not support using location services to monitor regions or monitor the user’s location using the significant location change service. The system includes the value of this key in the alert panel displayed to the user when requesting permission to use location services.

This key is required when you use the requestWhenInUseAuthorization method of the CLLocationManager class to request authorization for location services. If the key is not present when you call the requestWhenInUseAuthorization method without including this key, the system ignores your request.

This key is supported in iOS 8.0 and later. If your Info.plist file includes both this key and the NSLocationUsageDescription key, the system uses this key and ignores the NSLocationUsageDescription key.

Read about it here.

I find that the easiest way to add this key to your info.plist is to right click you info.plist and choose

Open As->Source Code

and then add the following in the end before </dict></plist>

<key>NSLocationWhenInUseUsageDescription</key>
<string></string>

If you want you can add a text in between <string></string> that describes to the user why you want to use his/hers location. This text will show up under the default text in the alert.

Try writing a NSLocationWhenInUseUsageDescription in Info.plist

iOS 8.3, Xcode 6.3.1, ARC enabled

The question has been resolved, but I have (2) notes to add from my recent involvement with CLLocationManager.

1) You must have the following keys entered into your *.plist file:

Most commonly used keys have generic more descriptive names, such as "Privacy - Location Usage Description", which really is the "NSLocationUsageDescription" key.

To see the "raw" key names go to "*-Info.plist" and right click in the Navigator area where the keys are listed, see below:

And you get the following results:

The three keys that are related to this article are:

2) Make certain that you allocate and initialize your implementation of CLLocationManager before you try to request authorization or update location.

*.h file:

@interface SomeController : UIViewController <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *locationManager;

*.m file:

- (IBAction)locationButton:(UIButton *)sender
{
    if (self.locationManager == nil)
    {
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
    }
    else
    {
        nil;
    }

    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
    {
        [self.locationManager requestWhenInUseAuthorization];
    }
    else
    {
        nil;
    }

    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
}

Hope this saves someone time! Thanks.

Here's a little gotcha. Make sure you're adding the NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription keys to the main bundle plist and not one of your test target plists!

Mark E

Had the same problem caused because I was instantiating CLLocationManager in a local var inside a method, solved it making the CLLocationManager a class property.
After a while I found the solution here, but I'm leaving it here since this is the first result in google, hope I save you some time:

requestWhenInUseAuthorization() not Work in iOS 8 With NSLocationWhenInUseUsageDescription Key in Info.plist

Pertaining to the Apple Watch:

You need to put the requestWhenInUseAuthorization key in the iPhone's Info.plist, not the WatchKit App's.

This has bitten me twice now.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!