iOS 8 requestWhenInUseAuthorization没有弹出窗口

时间:2014-07-20 11:40:43

标签: objective-c geolocation ios8 privacy

我试着让我的AppProject iOS 8做好准备。我读过很多关于

的文章
[_locationManager requestWhenInUseAuthorization];

和plist中的条目

NSLocationWhenInUseUsageDescription

所以我改变了所有必要的代码行。

它工作正常,但现在我已经从我的iOS 7基础复制了我的项目以包含新功能。但是,当我对iOS8位置隐私进行更改时,Popup不再出现。

我的代码一直有效,直到我复制。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>NSLocationWhenInUseUsageDescription</key>
        <string>tolle sache </string>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
        <key>CFBundleExecutable</key>
        <string>${EXECUTABLE_NAME}</string>
        <key>CFBundleIdentifier</key>
        <string>fapporite.${PRODUCT_NAME:rfc1034identifier}</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundlePackageType</key>
        <string>BNDL</string>
        <key>CFBundleShortVersionString</key>
        <string>1.0</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
        <string>1</string>
    </dict>
</plist>

这是我的电话

- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {

        _UserLocation = [[CLLocation alloc]init];
        _locationManager = [[CLLocationManager alloc]init]; // initializing locationManager
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest; // setting the accuracy
        [_locationManager requestWhenInUseAuthorization]; // iOS 8 MUST
        [_locationManager startUpdatingLocation];  //requesting location updates

        NSLog(@"passed initwithcode");

    }
    return self;
}

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:101)

来自文档

  

NSLocationWhenInUseUsageDescription(String - iOS)描述了   应用程序在运行时正常访问用户位置的原因   在前台。当您的应用使用位置时,请包含此密钥   用于直接跟踪用户当前位置的服务。这把钥匙呢   不支持使用位置服务来监控区域或监控区域   用户使用重要位置更改服务的位置。该   系统在显示的警报面板中包含此键的值   用户在请求使用位置服务的权限时。

     

使用requestWhenInUseAuthorization时需要此密钥   CLLocationManager类的方法,用于请求授权   位置服务。 如果您拨打电话时钥匙不存在   requestWhenInUseAuthorization方法不包含此键,   系统会忽略您的请求。

     

iOS 8.0及更高版本支持此密钥。如果你的Info.plist文件   包括此密钥和NSLocationUsageDescription密钥,   system使用此密钥并忽略NSLocationUsageDescription密钥。

了解它here

我发现将此密钥添加到info.plist的最简单方法是右键单击info.plist并选择

打开As-&gt;源代码

然后在 </dict></plist>

之前添加以下
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>

如果您愿意,可以在<string></string>之间添加一个文本,向用户描述您为什么要使用他/她的位置。此文本将显示在警报中的默认文本下。

答案 1 :(得分:19)

尝试在Info.plist中编写NSLocationWhenInUseUsageDescription

答案 2 :(得分:10)

iOS 8.3,Xcode 6.3.1,启用了ARC

这个问题已经解决,但我有(2)从我最近参与CLLocationManager中添加的注意事项。

1)您必须在* .plist文件中输入以下密钥:

enter image description here

最常用的密钥具有通用的更具描述性的名称,例如“隐私 - 位置使用说明”,它实际上是“NSLocationUsageDescription”密钥。

要查看“原始”键名称,请转到“* -Info.plist”并右键单击列出键的导航器区域,如下所示:

enter image description here

你得到以下结果:

enter image description here

与本文相关的三个键是:

enter image description here

2)在尝试请求授权或更新位置之前,请确保分配并初始化CLLocationManager的实现。

*。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];
}

希望这能节省时间!感谢。

答案 3 :(得分:3)

这里有点陷阱。确保您将NSLocationAlwaysUsageDescription或NSLocationWhenInUseUsageDescription键添加到主束plist而不是您的测试目标plist之一!

答案 4 :(得分:1)

由于我在方法中的局部变量中实例化stdio.h而导致同样的问题,解决了它使CLLocationManager成为类属性。 过了一会儿,我在这里找到了解决方案,但是我将它留在这里,因为这是谷歌的第一个结果,希望我能节省你一些时间:

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

答案 5 :(得分:0)

与Apple Watch有关:

您需要将requestWhenInUseAuthorization密钥放入iPhone的Info.plist,而不是WatchKit应用程序。

现在已经咬了我两次。