CLLocationManager requestWhenInUseAuthorization() 不能在 ios7 上使用 swift 2.0

Posted

技术标签:

【中文标题】CLLocationManager requestWhenInUseAuthorization() 不能在 ios7 上使用 swift 2.0【英文标题】:CLLocationManager requestWhenInUseAuthorization() not working on ios7 using swift 2.0 【发布时间】:2016-03-16 10:00:59 【问题描述】:

我正在使用 swift 2.0 和一个部署目标为 7.0 的项目。当我使用

location.requestAlwaysAuthorization()

错误被抛出。而且我知道这种特殊方法不适用于 ios 7。我的问题是 .. 如果我添加

@available(ios 8.0 , *)

它是否可以在具有 ios 7.0 的设备上工作,或者只有当设备 >= ios 8.0 时才会处理此特定功能?请帮忙。

【问题讨论】:

***.com/questions/24167791/… ? @Larme,我已经完成了那个答案,但无法理解清楚。那你能说清楚一点吗? 【参考方案1】:

仅当设备 >= iOS 8.0 时才会处理特定功能。

if #available(iOS 8, *)

    location.requestAlwaysAuthorization()
 
else

    locationManager.startUpdatingLocation()

对于在 iOS 8+ 上运行的设备,使用此方法将调用 requestAlwaysAuthorization(),否则将调用 startUpdatingLocation()

【讨论】:

我也在检查这个@ebby94 if (location.respondsToSelector(Selector(location.requestWhenInUseAuthorization()))‌​) 。我该如何检查? 您不能在运行 iOS 7 及更低版本的设备中使用requestWhenInUseAuthorization()。即使您使用respondsToSelector 方法,如果您的部署目标低于iOS 8,Xcode 也会抛出错误,并要求您使用if #available(iOS 8, *) 修复它。【参考方案2】:

在 iOS7 上,CLLocationManager 在调用startUpdatingLocation 时向用户请求位置授权。通常,在 iOS7 兼容的应用程序上,您最终会编写

if #available(iOS 8.0, *) 
  locationManager.requestAlwaysAuthorization()

locationManager.startUpdatingLocation()

这样,位置授权由requestAlwaysAuthorizationstartUpdatingLocation 请求,具体取决于操作系统。

【讨论】:

我也在检查这个@tomahh if (location.respondsToSelector(Selector(location.requestWhenInUseAuthorization()))) 。我该如何检查? 从 Swift 2 开始,检查 API 可用性的推荐方法是通过 #available() 语句。有关详细信息,请参阅this apple blog post(在可用性标题下)。

以上是关于CLLocationManager requestWhenInUseAuthorization() 不能在 ios7 上使用 swift 2.0的主要内容,如果未能解决你的问题,请参考以下文章

为啥'CLLocationManager.locationServicesEnabled()'默认为真?

Xcode 6 GM - CLLocationManager

CLLocationManager 和 CLGeoCoder

CLLocationManager:没有调用 didChangeAuthorization 和 didRangeBeacons

CLLocationManager 最后一个已知位置

CLLocationManager 从不调用委托方法[重复]