【问题标题】:Ask for user location authorisation without getting it请求用户位置授权而不获取它
【发布时间】:2015-02-01 06:12:00
【问题描述】:

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

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

然后你可以得到位置, 但在 iOS 7 中,仅在

上需要授权
[locationManager startUpdatingLocation];

【问题讨论】:

  • 您是否有特定原因不想立即获取位置?
  • 我想问一下用户在他第一次启动应用程序时知道这个应用程序使用位置。
  • 看看THIS。基本思想是……让 iOS 7.x 做这件事。对于 iOS 8.x,在 (1) CLLocationManagerDelegate (2) 自定义观察者中处理授权更改中的位置授权更改。这正是我在我的应用中管理位置服务以实现跨 iOS 版本的统一的方式。

标签: ios objective-c ios7 core-location cllocationmanager


【解决方案1】:

编辑 2: 看看this NSHipster article

请务必注意,使用不同的 API,您不会有相同的行为。 iOS 8 API 的设计与众不同。

如果您希望您的应用在 iOS 7iOS 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.

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

我有一个为我处理所有逻辑的类,它可以表现为单例或单个实例。如果您愿意,请查看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 { [经理停止更新位置]; }

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

【讨论】:

  • 这与电池无关。我只是希望应用程序在 iOS 7 和 iOS 8 中表现相同
  • 谢谢。虽然感觉有点像一种解决方法,但似乎这是做我想做的唯一方法。我会尝试你的方式,让你知道
  • 祝你好运。不过,这不是一种解决方法。当您为改进了用户隐私的 API 提供旧版支持时,就会发生这种情况。
  • 位置更新仍然被触发。我刚刚制作了我的 UI,要求用户稍后转到设置并切换位置服务。
  • 您为什么要让您的用户在您的应用程序中四处走动并手动启用某些东西,而您可以自己做呢?
【解决方案2】:

只需在启动时调用 startUpdatingLocation。当您获得位置时,请停止更新。

【讨论】:

  • 感觉那个时候用户不会知道他的位置正在被获取。我希望该应用程序在 iOS 7 和 iOS 8 中表现相同
  • 如果你只是在启动时调用startUpdatingLocation,iOS 8 将记录一个关于需要权限的错误并且什么都不做。
【解决方案3】:

你为什么不简单地使用:

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

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

【讨论】:

  • 这不会在 iOS7 中请求许可
  • iOS7及更早版本的位置服务权限由系统处理。你不需要处理它。
  • 没错,但您似乎没有理解我的问题。我正在寻找一种仅请求授权的方法,但实际上稍后会在 iOS7 中获得该位置。在 iOS 8 中这似乎是可能的。
  • 我不建议尝试让 iOS7 冒充 iOS8。当我们尝试覆盖系统级事件时,Apple 不喜欢它,除非我们有充分的理由。此外,除非需要定位服务,否则不建议在启动时启动定位服务。将其用作解决方法充其量是笨拙的。如果是iOS7或更早的,让系统处理权限即可。
猜你喜欢
  • 2014-10-01
  • 2021-07-02
  • 2021-03-22
  • 2016-06-05
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多