Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用授权不起作用时的Swift请求_Swift_Location_Cllocationmanager - Fatal编程技术网

使用授权不起作用时的Swift请求

使用授权不起作用时的Swift请求,swift,location,cllocationmanager,Swift,Location,Cllocationmanager,我正在使用swift为iOS 9.3编写一个应用程序,需要一个地图来显示用户位置。 初始化CLLocationManager及其委托,配置info.plist 隐私-位置使用说明字符串和invoke RequestWhenUseAuthorization,但不显示任何授权请求 这是我的密码: import UIKit import MapKit class DetailController: UIViewController, CLLocationManagerDelegate {

我正在使用swift为iOS 9.3编写一个应用程序,需要一个地图来显示用户位置。 初始化CLLocationManager及其委托,配置info.plist 隐私-位置使用说明字符串和invoke RequestWhenUseAuthorization,但不显示任何授权请求

这是我的密码:

import UIKit
import MapKit

class DetailController: UIViewController, CLLocationManagerDelegate {

    var locManager: CLLocationManager!

    @IBOutlet var myMap: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()

        mostraPosizione()
    }

    func mostraPosizione(){
        locManager = CLLocationManager()
        locManager.delegate = self
        locManager.desiredAccuracy = kCLLocationAccuracyBest

        let authorizationStatus = CLLocationManager.authorizationStatus()

        if (authorizationStatus == CLAuthorizationStatus.NotDetermined) {
            locManager.requestWhenInUseAuthorization()
        } else {
            locManager.startUpdatingLocation()
        }


        myMap.showsUserLocation = true
    }

    func locManager(manager: CLLocationManager, 
    didChangeAuthorizationStatus status: CLAuthorizationStatus) {

        if (status == CLAuthorizationStatus.NotDetermined) {
            locManager.requestWhenInUseAuthorization()

        } else {
            locManager.startUpdatingLocation()
        }
    }
}
还有我的info.plist的截图

Xcode输出:

尝试在不提示位置授权的情况下启动MapKit位置更新。 必须调用-[CLLocationManager RequestWhenUseAuthorization] 或首先-[CLLocationManager请求始终授权]

我正在iPhone5s(iOS9.3)模拟器上测试它

这东西有什么问题吗? 有人有什么建议吗?

我想是因为

let authorizationStatus = CLLocationManager.authorizationStatus()
nil
,因此从不调用您的
请求whenUseAuthorization()

  let authorizationStatus = CLLocationManager.authorizationStatus()

    if (authorizationStatus == CLAuthorizationStatus.NotDetermined) || (authorizationStatus == nil) {
        locManager.requestWhenInUseAuthorization()
    } else {
        locManager.startUpdatingLocation()
    }
他应该在工作

编辑

如果用户拒绝请求,您还应该处理该情况

if (authorizationStatus == CLAuthorizationStatus.Denied ) {
  // Display a message, do what you want 
}
事实上,一旦用户拒绝了授权,您就不能让弹出窗口再次出现,用户必须进入应用程序设置并自行设置使用其位置的授权。不过,你现在可以直接从你的应用程序链接到设置,这样对用户来说就更容易了

// Open the settings of your app
if let url = NSURL(string:UIApplicationOpenSettingsURLString) {
    UIApplication.sharedApplication().openURL(url)
}

如果解决方案是将nUsageDescription key添加到info.plist中,请添加nLocation。

请尝试此选项以了解大小:

override func viewDidLoad() {
    super.viewDidLoad()

    //put code here
    locManager = CLLocationManager()
    locManager.delegate = self
    locManager.desiredAccuracy = kCLLocationAccuracyBest
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    //make sure the view is loaded first before adding subviews
    mostraPosizione()
}

func mostraPosizione(){
    let authorizationStatus = CLLocationManager.authorizationStatus()

    if (authorizationStatus == .authorizedWhenInUse) {
        locManager.startUpdatingLocation()
        myMap.showsUserLocation = true
    } else {
        locManager.requestWhenInUseAuthorization()
        mostraPosizione()
    }
}
请求未显示的原因是调用请求时未完成加载视图。使用ViewDidAspect()修复了该问题

我也对代码做了一些修改,看起来效果不错。我只对下面的代码进行了更改,其他功能保持不变


我正在用Swift 3编写这段代码,但原则是一样的。

我的目标是iOS 14。我只在使用时使用

我必须有三条弦:

但这还不够。Ellight(1月25日,19日)关于将对CLLocationManager的调用与请求分离的评论也被证明是必要的。我必须声明一个属性,在viewDidLoad()中初始化它,然后稍后调用requestWhenInUseAuthorization()

最后,在测试时,删除应用程序是不够的。我在另一个SO答案上看到一条评论,该开发人员在删除应用程序后必须打开设置应用程序才能再次测试。事实证明,这在我的情况下也是必需的


说真的,我不是在开玩笑。

我认为你缺少位置,因为plistauthorizationStatus==nil中的用法描述码不可能是一个解决方案,因为“CLAuthorizationStatus类型的值永远不能为零,不允许比较”很好,可以直接从我们的应用程序中转到设置来设置授权!在mostraPosizione()内调用mostraPosizione()会创建一个无限循环,直到用户不与视图交互为止。这很糟糕。在最后一部分,正确的答案是Chajmz的答案:如果用户拒绝授权,弹出窗口将不会再次显示。在我的例子中,RequestWhenUseAuthorization提供了一个模式,该模式立即被驳回。即使您及时单击“接受”,它也不会调用didChangeAuthorization委托方法。通过将CLLocationManager init调用与viewDidLoad和ViewDidDisplay中的方法调用分离,我终于看到了预期的行为我不知道为什么-我删除了以前的键并将其更改为新键,瞧,它工作了!!!:-)