快速处理位置权限

Posted

技术标签:

【中文标题】快速处理位置权限【英文标题】:handling location permissions instantaneously in swift 【发布时间】:2015-09-05 04:02:12 【问题描述】:

我正在尝试实现一个基本的地图视图并将用户的当前位置作为注释添加到地图中。我已将 requestwheninuse 键添加到我的 info.plist 并导入了 coreLocation。

在我的视图控制器的加载方法中,我有以下内容:

locManager.requestWhenInUseAuthorization()
var currentLocation : CLLocation

if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedWhenInUse)

    currentLocation = locManager.location
    println("currentLocation is \(currentLocation)")      

else
    println("not getting location")
    // a default pin

我正在收到提示。检索位置的权限。发生这种情况时,我的打印显示没有获取位置,显然是因为它在用户有机会点击 OK 之前运行。如果我启动应用程序并返回,我可以检索位置并将其添加到地图中。但是,我希望当用户第一次点击 OK 时能够抓住当前位置并将其添加到地图中。我怎样才能做到这一点?我有以下添加图钉的方法:

func addPin(location2D: CLLocationCoordinate2D)
    self.mapView.delegate = self
    var newPoint = MKPointAnnotation()
    newPoint.coordinate = location2D
    self.mapView.addAnnotation(newPoint)

【问题讨论】:

【参考方案1】:

为此,您需要为您的位置管理器委托实现方法didChangeAuthorizationStatus,该方法在CLLocationManager 初始化后不久被调用。

首先,不要忘记在文件顶部添加:import CoreLocation

为此,在您使用该位置的班级中,添加委托协议。然后在viewDidLoad 方法(或applicationDidFinishLaunching,如果你在AppDelegate)中初始化你的位置管理器并将它的delegate 属性设置为self

class myCoolClass: CLLocationManagerDelegate 
    var locManager: CLLocationManager!

    override func viewDidLoad() 
        locManager = CLLocationManager()
        locManager.delegate = self
    
 

最后,在你之前声明的类的主体中实现 locationManager(_ didChangeAuthorizationStatus _) 方法,当授权状态改变时,这个方法会被调用,所以只要你的用户点击按钮。你可以这样实现它:

private func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) 
    switch status 
    case .notDetermined:
        // If status has not yet been determied, ask for authorization
        manager.requestWhenInUseAuthorization()
        break
    case .authorizedWhenInUse:
        // If authorized when in use
        manager.startUpdatingLocation()
        break
    case .authorizedAlways:
        // If always authorized
        manager.startUpdatingLocation()
        break
    case .restricted:
        // If restricted by e.g. parental controls. User can't enable Location Services
        break
    case .denied:
        // If user denied your app access to Location Services, but can grant access from Settings.app
        break
    default:
        break
    

Swift 4 - 新的枚举语法

对于 Swift 4,只需将每个枚举大小写的首字母切换为小写(.notDetermined、.authorizedWhenInUse、.authorizedAlways、.restricted 和 .denied)

这样你就可以处理每一个案例,无论用户只是给予或撤销它。

【讨论】:

感谢您的回复。 locManger.delegate = self 行给了我一个错误“预期声明” @user2363025 你能详细说明一下吗?单击错误,它应该会告诉您更多信息 这就是错误的全部内容。悬停时不会弹出其他信息。我在这里看到***.com/questions/24121761/…,也许我应该在 appdelegate 中定义 locManager?在 switch 语句的每种情况下,我也收到错误,说无论我是在 appdelegate 还是我的视图控制器中定义了 locManager ,都不能在没有参数的情况下调用每个方法 你在哪里调用 locManager.delegate = self 以及你把你的函数放在哪里? 最初.. 我将 locManager.delegate = self 放在 var locManager = CLLocationManager() 之后的视图控制器中,该控制器具有地图视图并在下方调用 func locationManager。然后我尝试将 func locationManager 移动到视图中,并使用地图加载了我的视图控制器。然后我看到了上面发布的链接并将 var locationManager: CLLocationManager = CLLocationManager() locationManager.delegate = self 移到了应用程序委托中,并将 func locationManager 留在了 appdelegate 中的 didFinishLaunchingWithOptions 中

以上是关于快速处理位置权限的主要内容,如果未能解决你的问题,请参考以下文章

windows10 无文件修改权限快速解决方案

我们可以通过快速编程来禁用应用程序级别的权限吗?

php 简单的认证类。不处理权限或类似的东西。只是把事情放在一起真实快速和肮脏。

Andoid app三方库权限位置查找和处理

Andoid app三方库权限位置查找和处理

再次请求位置权限 onRequestPermissionsResult