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