#ifdef __IPHONE_8_0
NSUInteger code = [CLLocationManager authorizationStatus];
if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
// choose one request according to your business.
if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
[self.locationManager requestAlwaysAuthorization];
} else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
[self.locationManager requestWhenInUseAuthorization];
} else {
NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
}
}
#endif
[self.locationManager startUpdatingLocation];
6
这是ios 8的问题将此添加到您的代码中
if (IS_OS_8_OR_LATER)
{
[locationmanager requestWhenInUseAuthorization];
[locationmanager requestAlwaysAuthorization];
}
和info.plist:
<key>NSLocationUsageDescription</key>
<string>I need location</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>I need location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>I need location</string>
2
要在iOS 8中访问用户位置,您必须添加,
NSLocationAlwaysUsageDescription in the Info.plist
这将要求用户获得获取其当前位置的许可 .
4
询问位置的旧代码在iOS 8中不起作用 . 您可以尝试使用此方法进行位置授权:
- (void)requestAlwaysAuthorization
{
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
// If the status is denied or only granted for when in use, display an alert
if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusDenied) {
NSString *title;
title = (status == kCLAuthorizationStatusDenied) ? @"Location services are off" : @"Background location is not enabled";
NSString *message = @"To use background location you must turn on 'Always' in the Location Services Settings";
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
message:message
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Settings", nil];
[alertView show];
}
// The user has not enabled any location services. Request background authorization.
else if (status == kCLAuthorizationStatusNotDetermined) {
[self.locationManager requestAlwaysAuthorization];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) {
// Send the user to the Settings for this app
NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:settingsURL];
}
}
<key>NSLocationUsageDescription</key>
<string>I need location</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>I need location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>I need location</string>
Add this to your code
if (IS_OS_8_OR_LATER)
{
[locationmanager requestWhenInUseAuthorization];
[locationmanager requestAlwaysAuthorization];
}
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
import CoreLocation
class ViewController: UIViewController ,CLLocationManagerDelegate {
var locationManager = CLLocationManager()
//MARK- Update Location
func updateMyLocation(){
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
if locationManager.respondsToSelector(#selector(CLLocationManager.requestWhenInUseAuthorization)){
locationManager.requestWhenInUseAuthorization()
}
else{
locationManager.startUpdatingLocation()
}
}
代表方法
//MARK: Location Update
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
NSLog("Error to update location :%@",error)
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
switch status {
case .NotDetermined: break
case .Restricted: break
case .Denied:
NSLog("do some error handling")
break
default:
locationManager.startUpdatingLocation()
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location = locations.last! as CLLocation
var latitude = location.coordinate.latitude
var longitude = location.coordinate.longitude
}
5
// ** Don't forget to add NSLocationWhenInUseUsageDescription in MyApp-Info.plist and give it a string
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];
// Location Manager Delegate Methods
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
NSLog(@"%@", [locations lastObject]);
}
最后,我把它放在info.plist中:信息属性列表: NSLocationWhenInUseUsageDescription 值: App needs location servers for staff
9
为了访问iOS中的用户位置 . 您需要添加两个键
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
进入Info.plist文件 .
<key>NSLocationWhenInUseUsageDescription</key>
<string>Because I want to know where you are!</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Want to know where you are!</string>
26 回答
对于那些使用 Xamarin 的人,我必须手动将密钥 NSLocationWhenInUseUsageDescription 添加到info.plist,因为它在Xamarin 5.5.3 Build 6或XCode 6.1的下拉列表中不可用 - 只有
NSLocationUsageDescription
在列表中,这导致CLLocationManager
继续默默地失败 .我最终解决了自己的问题 .
显然在iOS 8 SDK中,
requestAlwaysAuthorization
(用于后台位置)或requestWhenInUseAuthorization
(仅在前景时的位置)在开始位置更新之前需要调用CLLocationManager
.Info.plist
中还需要NSLocationAlwaysUsageDescription
或NSLocationWhenInUseUsageDescription
键,并在提示中显示消息 . 添加这些解决了我的问题 .希望它可以帮助别人 .
编辑:有关更多信息,请查看:Core-Location-Manager-Changes-in-ios-8
我也在用同样的问题拔出头发 . Xcode为您提供错误:
但即使您实现上述方法之一,它也不会提示用户,除非info.plist中有
NSLocationAlwaysUsageDescription
或NSLocationWhenInUseUsageDescription
的条目 .将以下行添加到info.plist,其中字符串值表示您需要访问用户位置的原因
我认为自从我在Xcode 5中启动这个项目后,这些条目可能已经丢失 . 我猜Xcode 6可能会为这些键添加默认条目但尚未确认 .
您可以在这两个设置上找到更多信息here
为了确保这与iOS 7向后兼容,您应该检查用户是运行iOS 8还是iOS 7.例如:
并到您的info.plist文件
根据Apple文档:
https://developer.apple.com/documentation/corelocation/requesting_permission_to_use_location_services
https://developer.apple.com/documentation/corelocation/cllocationmanager/1620562-requestwheninuseauthorization
从iOS 8开始,在注册位置更新之前,还需要在您的app 's Info.plist file is required. It'中存在
NSLocationWhenInUseUsageDescription
或NSLocationAlwaysUsageDescription
键值,以便根据需要调用[self.myLocationManager requestWhenInUseAuthorization]
或[self.myLocationManager requestAlwaysAuthorization]
来请求用户的许可 . 然后,您在Info.plist中输入的字符串将显示在随后的对话框中 .如果用户授予权限,则照常营业 . 如果他们拒绝许可,则不会通知代表位置更新 .
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
这两个键都带有一个字符串
我的解决方案可以在Xcode 5中编译:
这是ios 8的问题将此添加到您的代码中
和info.plist:
要在iOS 8中访问用户位置,您必须添加,
这将要求用户获得获取其当前位置的许可 .
询问位置的旧代码在iOS 8中不起作用 . 您可以尝试使用此方法进行位置授权:
在iOS 8中,您需要做两件额外的事情才能使位置正常工作:在Info.plist中添加一个密钥,并向位置管理员请求授权,要求它启动
info.plist:
Add this to your code
One common error for Swift developers:
首先确保为
NSLocationWhenInUseUsageDescription
或NSLocationAlwaysUsageDescription
的plist添加值 .如果您仍然没有看到弹出窗口要求授权,请查看是否将
var locationManager = CLLocationManager()
行放在View Controller的viewDidLoad
方法中 . 如果你这样做,那么即使你打电话locationManager.requestWhenInUseAuthorization()
,也不会显示任何内容 . 这是因为在viewDidLoad执行之后,将取消分配(清除)locationManager变量 .解决方案是将行
var locationManager = CLLocationManager()
定位在类方法的顶部 .在
[locationManager startUpdatingLocation];
之前,添加iOS8位置服务请求:编辑您的应用
Info.plist
并添加密钥NSLocationAlwaysUsageDescription
,将显示给用户的字符串值(例如,We do our best to preserve your battery life.
)如果您的应用仅在应用开放时需要位置服务,请替换:
requestAlwaysAuthorization
与requestWhenInUseAuthorization
和NSLocationAlwaysUsageDescription
与NSLocationWhenInUseUsageDescription
.我正在开发一个升级到iOS 8且位置服务停止运行的应用程序 . 您可能会在调试区域中得到错误,如下所示:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
我做了最少侵入性的程序 . 首先将
NSLocationAlwaysUsageDescription
条目添加到info.plist:注意我没有填写此密钥的值 . 这仍然有效,我并不担心,因为这是一个内部应用程序 . 此外,已经有一个 Headers 要求使用位置服务,所以我不想做任何多余的事情 .
接下来我为iOS 8创建了一个条件:
在此之后调用
locationManager:didChangeAuthorizationStatus:
方法:现在一切正常 . 一如既往,请查看documentation .
向后兼容的解决方案:
在Info.plist中设置NSLocationWhenInUseUsageDescription键
具有向后兼容性的解决方案,不会产生Xcode警告:
在
Info.plist
中设置NSLocationWhenInUseUsageDescription
键 .For iOS version 11.0+ :在
Info.plist
中设置NSLocationAlwaysAndWhenInUseUsageDescription
键 . 以及其他2个键 .Objective-C Procedure 按照以下说明操作:
For iOS-11 对于iOS 11看看这个答案:iOS 11 location access
需要在plist中添加两个密钥并提供如下图所示的消息:
For iOS-10 and below:
代表方法
Swift Procedure
请按照以下说明操作:
For iOS-11 对于iOS 11看看这个答案:iOS 11 location access
需要在plist中添加两个密钥并提供如下图所示的消息:
For iOS-10 and below:
代表方法
对于拥有多个Info.plist文件的所有人来说,这是一个小帮手......
它会将所需的标记添加到当前目录(和子文件夹)中的所有Info.plist文件中 .
另一个是:
它会将您的描述添加到所有文件中 .
保持 Cocoa Keys 信息总是触手可及,以获取这些更新,以下是链接:
https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26
请享用 .
我在iOS9中遇到了类似的错误(使用Xcode 7和Swift 2): Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first. 我正在关注一个教程,但导师使用的是iOS8和Swift 1.2 . 在Xcode 7和Swift 2中有一些变化,我找到了这个代码,它对我来说很好(如果有人需要帮助):
最后,我把它放在info.plist中:信息属性列表: NSLocationWhenInUseUsageDescription 值: App needs location servers for staff
为了访问iOS中的用户位置 . 您需要添加两个键
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
进入Info.plist文件 .
见下图 .
添加键
NSLocationWhenInUseUsageDescription
或NSLocationAlwaysUsageDescription
(背景GPS使用),字符串要求在每个目标的每个info.plist
上使用GPS .通过运行请求权限:
[self initLocationManager:locationManager];
initLocationManager
的位置是:请记住,如果每个目标上的键都没有
info.plist
,则应用程序不会询问用户 .if
提供与iOS 7的兼容性,respondsToSelector:
方法保证了未来的兼容性,而不仅仅是解决iOS 7和8的问题 .对我来说问题是
CLLocationManagerDelegate
的类是私有的,它阻止了所有委托方法的调用 . 猜猜's not a very common situation but thought I' d提到它,以防t帮助任何人 .我在 iOS 8.4, iPad mini 2. 中添加了这些键 iOS 8.4, iPad mini 2. 它也有效 . 我没有在
Info.plist
中设置任何键,如NSLocationWhenInUseUsageDescription
.InfoPlist.strings:
Base on this thread,它说,
as in iOS 7
,可以在InfoPlist.strings中本地化 . 在我的测试中,这些键可以直接在文件InfoPlist.strings
中配置 .UPDATE:
我认为@IOS's method is better.使用空值为
Info.plist
添加键并将本地化字符串添加到InfoPlist.strings
.