【问题标题】:CLLocationManager - Authorization prompt goes away?CLLocationManager - 授权提示消失?
【发布时间】:2018-08-13 02:04:12
【问题描述】:

我尝试构建一个 locationHelper 类来处理使用 CLLocation 的方法,这样我就不必在每个视图控制器中重写它们。我的 LocationHelper 类有一个方法 checkStatus() 来检查用户是否已经授予使用他的位置的身份验证。但是,如果我调用该方法并且用户没有授予权限,则提示会出现,但会在它出现 2 秒后消失。我认为问题出在类的实现上,因为如果我在 ViewController 中编写代码,提示会一直存在,直到用户做出决定。 我的 LocationHelper.swift:

    import Foundation
import CoreLocation

class LocationHelper: NSObject, CLLocationManagerDelegate{
    var locationManager: CLLocationManager!
    var delegate: CLLocationManagerDelegate!
    override init(){
        super.init()
        self.locationManager = CLLocationManager()
        locationManager.delegate = self
    }

    func requestPermission() -> Void {
        self.locationManager?.requestWhenInUseAuthorization()
    }

    //func getLocationInstance() -> CLLocationManager {
    //    return self.locationManager?
    //}
    func checkStatus() -> Void {
        switch CLLocationManager.authorizationStatus() {
        case .notDetermined:
            // Request when-in-use authorization initially
            print("not determined")
            locationManager?.requestWhenInUseAuthorization()

        case .restricted, .denied:
            // Disable location features
            print("status: fail")

        case .authorizedWhenInUse:
            // Enable basic location features
            print("in use")


        case .authorizedAlways:
            print("always")
        }
    }

}

我的视图控制器:

import UIKit

class LiveDataViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.view.backgroundColor = UIColor(red: 0.12, green: 0.67, blue: 0.478, alpha: 1)
        let locHelp = LocationHelper()
        locHelp.checkStatus()


        //locHelp LocationHelper = LocationHelper()
        //locHelp.requestPermission()

    }

如果有人可以帮助我,我会很高兴。

【问题讨论】:

  • 不相关,但你为什么继承自NSObject?在 Swift 中,类不必从基类继承,所以除非你需要一些 NSObject 特定的功能,否则不要从它继承。此外,将locationManager 声明为隐式展开的可选选项没有任何意义,只需将其声明为let locationManager = CLLocationManager()。也不需要将委托存储为变量,因为您甚至不需要为其赋值,locationManager.delegate = self 就足够了。
  • 我认为你应该检查一次stackoverflow.com/a/9474095/9130596
  • 尝试添加这两行代码 let locHelp = LocationHelper() locHelp.checkStatus() on viewDidAppear()
  • 嗨!我的新 LocationHelper 现在看起来像这样:pastebin.com/cFCFViBN 但提示会在一秒钟后消失。我无法弄清楚我必须改变什么,它是一个类级实例变量,它在类被卸载之前不会关闭。
  • @wannabe_informatiker 不要将编辑后的代码发布到外部站点。 Edit 你的问题用你更新的代码代替。

标签: ios swift class cllocationmanager


【解决方案1】:

尝试保存对位置助手的引用。

它可能会在视图加载后自动释放。

像这样:

import UIKit

class LiveDataViewController: UIViewController {

    let locHelp = LocationHelper()

    override func viewDidLoad() {
        super.viewDidLoad()

        locHelp.checkStatus()
    }
}

【讨论】:

  • @wannabe_informatiker 但你可以接受他的回答
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 2014-08-31
  • 2013-10-02
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多