使用 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获取一次位置?

如何在继续之前等待 requestLocation?

php 一个逻辑连续两次不同的curl请求,第二次请求失败问题

填坑纪事一次用System.nanoTime()填坑System.currentTimeMills()的实例记录