iOS 应用程序在启动屏幕上崩溃,应用程序崩溃后请求位置(Xcode 8.3.3)

iOS app crashes on launch screen, location is requested after app crashes (Xcode 8.3.3)

当我 运行 我的 iOS 应用程序从 Xcode 到 iOS 模拟器或我的物理设备时,该应用程序会在几秒钟内崩溃。当应用程序随后进入后台并且我返回到 iPhone 主屏幕时,请求使用我的位置的权限的警报视图弹出,但在我可以 select 回答之前迅速消失。

在声明并初始化一个名为 "locationManager" 的 CLLocationManager 之后,我相信错误是由这些语句触发的:

    locationManager.requestWhenInUseAuthorization()
    locationManager.requestLocation()

控制台日志中出现的主要错误是:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Delegate must respond to locationManager:didFailWithError:'

我已经使用 "NSLocationWhenInUseUsageDescription" 设置了我的使用说明,这样我的应用程序就可以向用户展示他们的位置将用于什么,从而授予该应用程序访问其位置的权限。我还缺少其他可能导致此错误的内容吗?

为了获取用户的位置,我只需要通过在Info.plist文件中添加"NSLocationWhenInUseUsageDescription"键来请求它,还是我需要采取更多措施?

解决您的问题:

创建一个class like,并覆盖如下方法:

class LocationDelegate : NSObject, CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
         // here you will receive your location updates on `locations` parameter

    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        // if something goes wrong comes to here
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
       // here you can monitor the authorization status changes
    }

}

在任意位置创建此 class 的全局实例。

let locationDelegate: LocationDelegate = LocationDelegate()

然后在您请求许可之前设置委托:

locationManager.delegate = locationDelegate