使用 requestLocation 只请求一次用户的位置
Posted
技术标签:
【中文标题】使用 requestLocation 只请求一次用户的位置【英文标题】:Request a user's location only once using requestLocation 【发布时间】:2017-11-08 17:50:54 【问题描述】:我试图在应用第一次打开时仅获取一次用户位置。 (其他开口我不想知道)
我不希望用户允许。
我正在使用下面的代码,但它没有告诉我位置,它给了我这样的错误:操作无法完成。 (kCLErrorDomain 错误 0。)
PS:我没有使用模拟器,而是在真实设备上尝试
代码:
import CoreLocation
import UIKit
class ViewController: UIViewController, CLLocationManagerDelegate
let manager = CLLocationManager()
override func viewDidLoad()
manager.delegate = self
manager.requestLocation()
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
if let location = locations.first
print("Found user's location: \(location)")
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error)
print("Failed to find user's location: \(error.localizedDescription)")
【问题讨论】:
您不能就这样在应用启动时开始请求位置信息。获取位置服务用户授权的代码在哪里? requestLocation 会要求用户授权,所以这应该没问题。我有完全相同的代码,几周前它还在工作,现在它停止工作,出现这篇文章中描述的相同错误。有人遇到同样的问题吗? 【参考方案1】:它可能无法正常工作,因为您必须请求用户对其位置的许可,即使这只是一次。恐怕没有办法绕过它,而且应该如此。只有在用户授权的情况下才会起作用。
你需要这个在ViewDidLoad()
manager.requestWhenInUseAuthorization()
并添加了相关的 Info.plist 隐私密钥:
隐私 - 使用时的位置使用说明
【讨论】:
无论我如何处理授权,我仍然遇到作者描述的相同错误(kCLErrorDomain 错误 0)【参考方案2】:我知道为什么了。在请求位置之前,您需要先调用请求授权。如果您不请求授权,则会收到 kCLErrorDomain 错误 0。如果您在 manager.requestLocation 之前请求授权,则根本不会调用您的 locationManager 委托方法。您可以在需要用户位置时使用:
[self.locationManager requestWhenInUseAuthorization];
[self.locationManager requestLocation]; // Second time and beyond, didChangeAuthorizationStatus will not be called.
然后在回调中您可以从 locationManager 请求位置。
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
if (status == kCLAuthorizationStatusDenied)
// The user denied authorization
else if (status == kCLAuthorizationStatusAuthorizedWhenInUse)
[self.locationManager requestLocation];
【讨论】:
以上是关于使用 requestLocation 只请求一次用户的位置的主要内容,如果未能解决你的问题,请参考以下文章
是否有类似 RequestLocal(如 ThreadLocal)的东西?
requestLocation() 无法提供有关手表硬件的课程,但在 Sim 中工作
Android:使用FusedLocationProviderClient获取一次位置?