CLLocationManager didUpdateLocations 没有被称为 iOS 8 的 plist 条目

Posted

技术标签:

【中文标题】CLLocationManager didUpdateLocations 没有被称为 iOS 8 的 plist 条目【英文标题】:CLLocationManager didUpdateLocations not being called iOS 8 with plist entries 【发布时间】:2015-04-24 11:30:10 【问题描述】:

我在使用 CLLocationManager 时遇到了一些问题。此代码曾经在 ios 8.2 上工作,但自从升级到 8.3 后它就不起作用了。这是设置在启动时调用的位置管理器的代码。

let distanceThreshold:CLLocationDistance = 100.0

var currentLocation:CLLocationCoordinate2D?

override init() 
    assert(locMan == nil)
    super.init()
    locMan = self

    let locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
    locationManager.requestAlwaysAuthorization()
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()


func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) 
    currentLocation = manager.location.coordinate

    if UIApplication.sharedApplication().applicationState == .Background 
        PlacesManager.fetchNearbyPlaces(LocationManager.getLocationManager().currentLocation!, radius: distanceThreshold, callback: placesCallback)
    

使用此代码,didUpdateLocations 永远不会被调用,尽管它之前被调用过。 我已将相关条目添加到 Info.plist 文件中:

我在设备和模拟器上都试过了,都不管用。事实上,如果我删除应用并重新安装,它似乎不再请求位置授权。

我知道我错过了一些愚蠢的东西,但我无法锻炼它到底是什么。

如果有人能提供任何帮助,我将不胜感激。

干杯, 杰拉德

【问题讨论】:

不应该locationManager 是实例变量而不是init 中的局部变量? 是的,我注意到很多人这样做,但从未真正使用实例变量。每个位置管理器回调都提供管理器,因此实际上不需要保留对它的引用,除非您想停止它或在回调之外使用它。 CLLocationManager documentation 说:“要配置和使用 CLLocationManager 对象来传递事件...创建 CLLocationManager 类的实例并将对它的强引用存储在应用程序的某处。保持强在涉及该对象的所有任务完成之前,需要对位置管理器对象的引用。因为大多数位置管理器任务是异步运行的,所以将位置管理器存储在局部变量中是不够的。" 太棒了。谢谢,我真的不明白为什么需要这样做,但那是固定的。我猜必须是垃圾收集吗?让它成为一个答案,我会给你信用。谢谢安娜。 【参考方案1】:

安娜的回答:

CLLocationManager 文档说:“要配置和使用 CLLocationManager 对象来传递事件...创建 CLLocationManager 类的实例并将对它的强引用存储在应用程序的某处。保持对位置管理器对象的强引用在涉及该对象的所有任务完成之前是必需的。因为大多数位置管理器任务都是异步运行的,所以将位置管理器存储在局部变量中是不够的。"

【讨论】:

所有引用默认都是强引用,除非在 Swift 中另有说明。 在这种情况下,它们并不意味着强引用。它们表示在仍在使用时不会超出范围的参考。在我的情况下,它在初始化后并没有超出范围。【参考方案2】:

除了接受的答案,如果您使用的是模拟器。您必须应用运行后选择一个位置(Debug->Location->apple 代表苹果总部)。我设置了位置,并假设下次我运行应用程序时,didUpdateLocations 将使用我之前设置的内容调用,但这个假设是错误的。

【讨论】:

以上是关于CLLocationManager didUpdateLocations 没有被称为 iOS 8 的 plist 条目的主要内容,如果未能解决你的问题,请参考以下文章

为啥'CLLocationManager.locationServicesEnabled()'默认为真?

Xcode 6 GM - CLLocationManager

CLLocationManager 和 CLGeoCoder

CLLocationManager:没有调用 didChangeAuthorization 和 didRangeBeacons

CLLocationManager 最后一个已知位置

CLLocationManager 从不调用委托方法[重复]