在位置访问弹出窗口中检测用户选择 Swift

Detect user selection in Location Access Popup Swift

我有一个视图控制器,它获取用户位置并显示附近的商店。

当用户第一次打开该应用时,该应用会显示一个弹出窗口,让用户允许访问位置信息。如果用户允许位置,我在 didUpdateLocations

中调用 API
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if !isNearbyAlreadyLoaded {
        self.apiNearbyBakers()
        isNearbyAlreadyLoaded = true
    }
}

但是如果用户不允许该位置,我的 API 永远不会被调用。在那种情况下,我需要给他看一个允许定位的按钮。

问题

我如何检测用户是否点击了允许位置弹出窗口中的不允许按钮。

您可以使用didChangeAuthorization回调方法。当用户从弹出窗口中选择一个选项时调用此方法。

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedAlways {
        if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
            if CLLocationManager.isRangingAvailable() {
                // do stuff
            }
        }
    }
    if status == .denied {
        // handle your case
    }
}

有一篇关于此的完整文章here

为 CLLocationManagerDelegate 创建一个扩展
然后检查状态并相应地执行您的功能,如果未设置权限则打开设置。

extension HomeVC: CLLocationManagerDelegate {

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

        guard status == .authorizedAlways || status == .authorizedWhenInUse else {
            if status == .denied || status == .notDetermined || status == .restricted || status == .authorizedWhenInUse {

                let alert = UIAlertController(title: "Title", message:"Some Descriptions" , preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
                alert.addAction(UIAlertAction(title: "Settings", style: .default, handler: { _ in
                    let url = URL(string: UIApplication.openSettingsURLString)!
                    UIApplication.shared.open(url, options: [:], completionHandler: nil)
                }))
                self.present(alert, animated: true, completion: nil)
            }
            return
        }
    }
}