我想在加载应用时询问用户他的许可,但稍后会获取该位置。我意识到这可以在iOS 8中完成,但在iOS 7中,根据我的研究,当您开始更新位置时,将自动要求权限。 所以在iOS 8中
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
[self.locationManager requestWhenInUseAuthorization];
}
然后你可以得到位置, 但在iOS 7中,仅在
上需要授权[locationManager startUpdatingLocation];
答案 0 :(得分:2)
编辑2 :查看this NSHipster article。
重要的是要注意您不会在不同的API上使用相同的行为。 iOS 8 API的设计与众不同。
如果您希望自己的应用在iOS 7
和iOS 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];
这样,您无需了解(或关心)正在使用的操作系统。您唯一关心的是您是否支持要实现的选择器(或类)。