Ios 应用程序未请求访问位置的权限,弹出窗口停留在后台

Ios 应用程序未请求访问位置的权限,弹出窗口停留在后台,ios,swift,permissions,location,mapkit,Ios,Swift,Permissions,Location,Mapkit,我正在我的Swift iOS应用程序中使用MapKit。 问题是,当应用程序正在使用时,我正在请求访问用户位置的权限,但当我第一次在iPhone中运行应用程序时,它在启动屏幕中保持冻结状态,因为权限请求不会弹出,但是,如果我按下home按钮,弹出窗口似乎会请求权限。如果我接受的话,下一次运行应用程序会正常工作,但它不应该像这样工作。 因此,在代码中,调试器在此崩溃,因为他无法获得权限: let initialLocation:CLLocation = CLLocation(latitude: (

我正在我的Swift iOS应用程序中使用MapKit。 问题是,当应用程序正在使用时,我正在请求访问用户位置的权限,但当我第一次在iPhone中运行应用程序时,它在启动屏幕中保持冻结状态,因为权限请求不会弹出,但是,如果我按下home按钮,弹出窗口似乎会请求权限。如果我接受的话,下一次运行应用程序会正常工作,但它不应该像这样工作。 因此,在代码中,调试器在此崩溃,因为他无法获得权限:

let initialLocation:CLLocation = CLLocation(latitude: (locationManager.location?.coordinate.latitude)!, longitude: (locationManager.location?.coordinate.longitude)!)
指示下一个问题:线程1:EXC_断点(代码=1,子代码=0x1000b5d00)

因此,我已经在ViewWillAspect方法中询问了权限:

let locationManager = CLLocationManager()

    // Ask for Authorisation from the User.
    // locationManager.requestAlwaysAuthorization()

    // For use in foreground
    locationManager.requestWhenInUseAuthorization()
    //locationManager.requestAlwaysAuthorization()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        //locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()
        mapView.showsUserLocation = true
    }
我还在Info.plist:Privacy-Location-When-in-Use-Usage-Description中有一个条目

为什么弹出窗口不显示在前台而是显示在后台

提前感谢你的帮助

干杯

编辑:

我在地图视图前有一个带有徽标的闪屏。这就是问题所在吗

编辑回答@Dan Clark的第2条

好的,我在viewDidLoad中添加了此检查,如下所示:

编辑3

    let locationManager = CLLocationManager()
    override func viewDidLoad() {
    super.viewDidLoad()

    locationManager.delegate = self
    print("viewdidload")
    if CLLocationManager.authorizationStatus() != .AuthorizedWhenInUse    // Check authorization for location tracking
    {
        print("requestingautorization")
        locationManager.requestWhenInUseAuthorization()
        print("afterrequestingauthorization")
       // LocationManager will callbackdidChange... once user responds
    } else {
        print("startupdatinglocation")
        addPins(locationManager)

    }  
}
但是请求授权的弹出窗口没有出现:(我有之前和之后的两个打印,但是弹出窗口没有显示

我还在同一个类中添加了您编写的函数

    @nonobjc func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    print("instatuscheck")
    switch status
    {
    case .AuthorizedWhenInUse:
        print("statusauthorized")
        addPins(manager)

    default:
        print("statusdefault")
        manager.requestWhenInUseAuthorization()
        // User denied access, handle as appropriate

    }
}
但我不清楚…当授权状态更改时,会自动调用此函数吗


再次感谢您的帮助:)

问题是,在您提出请求后,您可能需要一段时间才能获得LocationManager的授权。因此,在您的第一次尝试中,您在请求后到达关闭之前没有授权。我已经通过测试授权解决了这个问题,如果我没有授权,那么在开始位置更新之前,输入请求,然后等待回调到didChangeAuthorizationStatus。如果我已经获得授权,我会立即开始位置更新

第二次运行应用程序时,您已获得授权,因此不会出现延迟,您可以继续运行

要尝试这种方法,请在ViewDidLoad中包含此部分(我假设您不需要在视图出现时运行此部分,而只需要在视图首次启动时运行):

并将此委托函数添加到您的类中,以便在获得授权后由LocationManager调用:

// If we've been authorized to use location, start the processes, otherwise abort the operation
// since we can't proceed without locations

@nonobjc func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status
    {
    case .authorizedAlways:
        locationManager.startUpdatingLocation()

    default:
        // User denied access, handle as appropriate

    }
}
下面是我用来实例化/配置locationManager的代码:

lazy var locationManager: CLLocationManager = {
    [unowned self] in
    var _locationManager = CLLocationManager()
    _locationManager.delegate = self
    _locationManager.desiredAccuracy = [a user setting in my app]
    _locationManager.allowsBackgroundLocationUpdates = true
    _locationManager.pausesLocationUpdatesAutomatically = false  // So doesn't shut off if user stops to rest
    _locationManager.activityType = .fitness
    _locationManager.distanceFilter = Double([a user setting in my app])
    return _locationManager
    }()

这对我很有用,希望能有所帮助。

问题是,在您提出请求后,您可能需要一段时间才能获得LocationManager的授权。因此,在您的第一次尝试中,您在请求后到达关闭之前没有授权。我已经通过测试授权解决了这个问题,如果我没有授权,那么在开始位置更新之前,输入请求,然后等待回调到didChangeAuthorizationStatus。如果我已经获得授权,我会立即开始位置更新

第二次运行应用程序时,您已获得授权,因此不会出现延迟,您可以继续运行

要尝试这种方法,请在ViewDidLoad中包含此部分(我假设您不需要在视图出现时运行此部分,而只需要在视图首次启动时运行):

并将此委托函数添加到您的类中,以便在获得授权后由LocationManager调用:

// If we've been authorized to use location, start the processes, otherwise abort the operation
// since we can't proceed without locations

@nonobjc func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status
    {
    case .authorizedAlways:
        locationManager.startUpdatingLocation()

    default:
        // User denied access, handle as appropriate

    }
}
下面是我用来实例化/配置locationManager的代码:

lazy var locationManager: CLLocationManager = {
    [unowned self] in
    var _locationManager = CLLocationManager()
    _locationManager.delegate = self
    _locationManager.desiredAccuracy = [a user setting in my app]
    _locationManager.allowsBackgroundLocationUpdates = true
    _locationManager.pausesLocationUpdatesAutomatically = false  // So doesn't shut off if user stops to rest
    _locationManager.activityType = .fitness
    _locationManager.distanceFilter = Double([a user setting in my app])
    return _locationManager
    }()

这对我很有用,希望能有所帮助。

您好,我已经在info.plist:Privacy-Location in Use Usage Description中添加了该密钥。如果两个打印都执行,我会猜它是p-list条目,但您说这已经包括在内了。我注意到你说它会卡在启动屏幕上。我还没有看到任何这样的效果,但您可能需要访问其中一个视图,以便允许弹出警报窗口以请求许可。这似乎与home按钮相匹配,允许它进入对话框。也许可以试试viewDidAppear方法?另外,是的,第二种方法是一个委托回调函数,当授权发生变化时会调用该函数。很抱歉,在更新中不清楚,经过您告诉我的修改,应用程序不会卡在启动屏幕上。地图视图已加载,但从未请求授权。因此,地图中的图像显示为一个大区域,而没有聚焦在用户位置,因为从未授予授权。locationManager.RequestWhenUseAuthorization()出现问题。我尝试使用ViewDidDisplay而不是viewDidLoad,但其行为是相同的:(您好,我已经在info.plist:Privacy-Location-When-Use-Use-Description中添加了该键。如果两个打印都执行,我会猜它是p-list条目,但您说它已被覆盖。我注意到您说它被卡在启动屏幕中。我没有看到任何类似的效果,但您可能需要在命令允许警报窗口弹出以请求权限。这似乎与允许其进入对话框的“主页”按钮相匹配。也许可以尝试ViewDidDisplay方法?是的,第二种方法是一个代理回调函数,当授权发生更改时会调用该函数。很抱歉,更新中没有清除,请h根据您告诉我的修改,应用程序不会卡在启动屏幕上。mapview已加载,但从未请求授权。因此,地图中的显示区域很大,但没有集中在用户位置,因为从未授予授权。locationManager发生了一些事。RequestWhenUseAuthorization().我尝试使用ViewDidDisplay而不是viewDidLoad,但其行为是相同的:(您好,谢谢您的帮助