Ios 在未获得用户位置授权的情况下请求用户位置授权

Ios 在未获得用户位置授权的情况下请求用户位置授权,ios,objective-c,ios7,core-location,cllocationmanager,Ios,Objective C,Ios7,Core Location,Cllocationmanager,我想在加载应用程序时请求用户的许可,但以后再获取位置。我意识到这可以在iOS 8中完成,但在iOS 7中,据我所研究,当您开始更新位置时,将自动请求权限。 所以在iOS 8中 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { [self.locationManager requestWhenInUseAuthorization]; } 然后你就可以知道位置了, 但在iOS 7中,仅在 [locationManager star

我想在加载应用程序时请求用户的许可,但以后再获取位置。我意识到这可以在iOS 8中完成,但在iOS 7中,据我所研究,当您开始更新位置时,将自动请求权限。 所以在iOS 8中

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
    [self.locationManager requestWhenInUseAuthorization];
}
然后你就可以知道位置了, 但在iOS 7中,仅在

[locationManager startUpdatingLocation];

启动时只需致电startUpdatingLocation。当您得到一个位置时,请停止更新。

编辑2:查看

重要的是要注意,不同的API不会有相同的行为。iOS 8 API的设计与众不同。

如果您希望您的应用程序在
iOS 7
iOS 8
上表现相同,您可以显示一些UI,通知用户需要启用位置。在我的应用程序中,我通过欢迎演练中的一个按钮来实现这一点。你可以把这个按钮放在菜单上或者别的什么地方

当用户点击按钮时,我将按照上述方式处理逻辑流,除非授权发生变化,否则我将在iOS 8上开始位置更新,而不是结束更新

if (iOS8) {
   // Request permission
}
else {
   // Begin updates - implicitly ask for permission
}

// .... In authorization did change:
[manager startUpdatingLocation]; // By now, both versions have permission and are ready to update.
这样,即使代码路径略有不同,您也会有相同的行为

我有一个类为我处理所有逻辑,它可以作为一个单例或单个实例。如果你愿意的话,请看一看

原始答案:

如果您担心电池问题,我建议您在iOS 7上触发更新,然后在您的权限更改或获得位置时禁用位置

从:

只要应用程序使用位置服务的能力发生变化,就会调用此方法。发生更改的原因可能是用户允许或拒绝对您的应用程序或整个系统使用位置服务

因此,请这样做:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
    [self.locationManager requestWhenInUseAuthorization];
}
else 
{
   [self.locationManager startUpdatingLocation];
}
然后,在
locationManager:didChangeAuthorizationStatus:
实现中,您可以调用StopUpdateLocation

 - (void)locationManager:(CLLocationManager *)manager
didChangeAuthorizationStatus:(授权状态)状态{ [管理器停止更新位置]; }


你甚至可能在没有通过这种方式成功触发位置更新的情况下“逃脱”。不清楚您为什么要推迟位置更新,但这是一种方法。

为什么不直接使用:

if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
    [self.locationManager requestWhenInUseAuthorization];

这样,您就不需要知道(或关心)正在使用什么操作系统。您唯一关心的是您要实现的选择器(或类)是否受支持。

是否有特定原因导致您不立即获取位置?我想问用户,当他第一次启动应用程序时,此应用程序使用位置。请查看。基本的想法是…让iOS 7.x做它的事情。对于iOS 8.x,在(1)
CLLocationManagerDelegate
(2)授权更改的自定义观察者中处理位置授权更改。这正是我在我的应用程序中管理位置服务的方式,以实现iOS版本的统一性。感觉用户当时不会知道他的位置正在被收购。我希望应用程序在iOS 7和iOS 8中的行为相同如果你在启动时只调用
startUpdatingLocation
,iOS 8将记录一个关于需要权限的错误,并且什么也不做。这与电池无关。我只希望该应用程序在iOS 7和iOS 8中表现相同谢谢。虽然这感觉有点像是一种变通方法,但似乎这是我想做的唯一方法。我会试试你的方法,让你知道祝你好运。不过,这不是一个解决办法。这就是当你为一个API提供旧版支持时会发生的情况,该API在用户隐私方面得到了改进。位置更新仍然会被触发。我只是创建了我的UI,要求用户稍后转到“设置”并切换位置服务。如果您可以自己操作,为什么要让您的用户在应用程序中进行切换并手动启用某些功能?这不会要求在iOS7中获得权限在iOS7及更早版本中获得位置服务的权限由系统处理。你不需要处理这个问题。这是正确的,但你似乎不理解我的问题。我正在寻找一种方法,只需请求授权,但实际上可以在稍后的iOS7中获得位置。在iOS 8中,这似乎是可能的。我不建议尝试让iOS 7冒充iOS 8。苹果不喜欢我们试图覆盖系统级事件,除非我们有很好的理由。此外,除非需要定位服务,否则不建议在启动时启动定位服务。将此作为一种解决方法,充其量是笨拙的。如果是iOS7或更早版本,只需让系统处理权限即可。