更新:这不是重复的。我已经在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)模拟器。
答案 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
#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模拟器,我可能错了这个部分有任何帮助......