询问用户位置授权而不获取它

时间:2014-12-03 15:44:49

标签: 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 startUpdatingLocation];

3 个答案:

答案 0 :(得分:2)

编辑2 :查看this NSHipster article

重要的是要注意您不会在不同的API上使用相同的行为。 iOS 8 API的设计与众不同。

如果您希望自己的应用在iOS 7iOS 8上的行为相同,则可以显示一些用户界面,告知用户需要启用位置。在我的应用程序中,我使用欢迎演练中的按钮执行此操作。您可以将此按钮放在菜单中或其他任何位置。

当用户点击按钮时,我处理逻辑流程,如上所述,除非授权发生变化,我将在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.

这样,即使代码路径略有不同,您也会有相同的行为。

我有一个为我处理所有逻辑的类,它可以表现为单例或单个实例。如果您愿意,请查看on GitHub (link)

原始答案:

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

来自CLLocationManagerDelegate documentation

  

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

所以做这样的事情:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
    [self.locationManager requestWhenInUseAuthorization];
}
else 
{
   [self.locationManager startUpdatingLocation];
}

然后,在locationManager:didChangeAuthorizationStatus:实现中,您可以调用stopUpdatingLocation。

 - (void)locationManager:(CLLocationManager *)manager

didChangeAuthorizationStatus:(CLAuthorizationStatus)status {         [经理stopUpdatingLocation];     }

你甚至可能会离开"没有以这种方式成功触发位置更新。目前还不清楚为什么要推迟位置更新,但这是一种方法。

答案 1 :(得分:0)

启动时只需调用startUpdatingLocation即可。当你到达一个位置时就停止更新。

答案 2 :(得分:0)

为什么不简单地使用:

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

这样,您无需了解(或关心)正在使用的操作系统。您唯一关心的是您是否支持要实现的选择器(或类)。