未提示在应用程序中启用位置服务

时间:2014-12-29 18:19:41

标签: ios objective-c cllocationmanager cllocation

更新:这不是重复的。我已经在info.plist中添加了所需的密钥,如我原始问题中所述,问题仍然存在。我已经尝试了各种组合的所有三个键。

在任何人感到不安之前,我已阅读了许多Apple Dev论坛帖子和堆栈溢出帖子,无法弄清楚为什么我的应用拒绝提示用户允许使用授权。

我已将以下密钥添加到我的Info.plist文件中,并附带一个字符串值:

NSLocationWhenInUseUsageDescription

然后我写了(在Swift和Obj-C中)应该提示用户的代码:

@property CLLocationManager *location;
...
@synthesize location;
...
location = [[CLLocationManager alloc] init];
location.delegate = self;

location.desiredAccuracy = kCLLocationAccuracyBest;
location.distanceFilter = kCLDistanceFilterNone;

[location requestWhenInUseAuthorization];
[location startUpdatingLocation];


I'm using the following CLLocationManagerDelegate methods.
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
- (void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status

这基本上是直接从Apple“LocateMe”示例代码中复制的。

无论我尝试哪种不同的序列或细微的变化,应用程序都不会提示允许授权。我使用了switch语句来确定[CLLocationManager authorizationStatus]的状态,但不断收到“未确定”的响应。

if ([CLLocationManager locationServicesEnabled]) {
        switch ([CLLocationManager authorizationStatus]) {
            case kCLAuthorizationStatusAuthorizedAlways:
                NSLog(@"Always Authorized");
                break;
            case kCLAuthorizationStatusDenied:
                NSLog(@"Denied");
                break;
            case kCLAuthorizationStatusAuthorizedWhenInUse:
                NSLog(@"Authorized in Use");
                break;
            case kCLAuthorizationStatusNotDetermined:
                NSLog(@"Not Determined");
                break;
            case kCLAuthorizationStatusRestricted:
                NSLog(@"Restricted");
                break;
        }

    }

非常感谢任何帮助。我正在运行带有iOS 8.1.2物理设备的Xcode 6.2(6C101)和用于测试的iOS 8.2(12D5452a)模拟器。

5 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,经过两天的挖掘,结果发现应用程序没有读取项目导航器窗格中包含的info.plist文件,因为它已经本地化为另一个正在使用语言和基础国际化,这意味着在Finder中将有3个info.plist文件:

1-在Tests文件夹下

在base.lproj文件夹下

2-

ar.lprj下的

3-(ar指的是阿拉伯语)。

项目从base.lproj的版本中读取,该版本未包含在项目导航器窗格的包中。

我所做的是我获取了我想要的plist文件的备份副本(上面的数字2),并删除了项目导航器中的info.plist文件的本地化,并选择从磁盘删除以完全删除它,然后我把备份副本放在Finder的项目根目录下并将其导入Xcode中,现在项目从新的info.plist文件读取,并且密钥NSLocationWhenInUseUsageDescription在应用程序启动时激活用户授权警报。

希望这会有所帮助。

答案 1 :(得分:1)

我发现在你的info.plst文件中你不能使用隐私 - 位置使用说明键,你必须有一个名为NSLocationWhenInUseUsageDescription的密钥和一个值。通过将此密钥添加到我的info.plist

,我能够使您的代码正常工作

enter image description here

#import <MapKit/MapKit.h>

@interface ViewController ()

@property CLLocationManager * location;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _location = [[CLLocationManager alloc] init];

    self.location.delegate = self;
    self.location.desiredAccuracy = kCLLocationAccuracyBest;
    self.location.distanceFilter = kCLDistanceFilterNone;

    [_location requestWhenInUseAuthorization];
    [self.location startUpdatingLocation];
}

答案 2 :(得分:1)

这里有很多有用的比较:http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

另外,愚蠢的问题时间:你混合了_location和self.location但你没有显示你的属性/合成代码。你确定你在同一个物体上操作吗?

答案 3 :(得分:0)

这可能很愚蠢,但我花了将近2个小时的时间来仔细检查所有关于CLLocationManager权限的答案。

当我终于意识到我有2个info.plist文件并且我使用了错误的文件时,我觉得很愚蠢!

您可以检查项目的构建设置 - 有一个名为 Info.plist文件的值。

只想留待未来读者使用。

答案 4 :(得分:0)

如果您更改了iPhone模拟器中的“位置设置”,则可能会导致提示无法显示。例如,如果您已通过“允许位置”访问iOS提示设置了“位置”权限并做出决定,则会将其存储在iPhone模拟器的“隐私”设置中,因此后续调用locationManager.requestAlwaysAuthorization()locationManager.requestWhenInUseAuthorization()将不会显示iOS提示,因为您已经定义了隐私 - &gt;您应用的位置设置。

清除iPhone模拟器的设置:"iOS Simulator" -> "Reset Content and Settings..."

另外我在Xcode中做了一个Clean build并且在某个时候退出并重新启动了iPhone模拟器,我可能错了这个部分有任何帮助......