CLLocation Manager 使用默认位置而不是使用实际位置进行更新

Posted

技术标签:

【中文标题】CLLocation Manager 使用默认位置而不是使用实际位置进行更新【英文标题】:CLLocation Manager using default location and not updating with actual location 【发布时间】:2016-08-07 19:25:21 【问题描述】:

所以我不知道发生了什么。我的代码工作得非常好,然后我在故事板中工作了一段时间,突然我开始收到错误,即我的 CLLocation 在展开时总是为零。我做了所有我能想到或在网上读到的东西。

已添加到 .plist 在不同位置复制代码 将 didUpdateLocations 移至 viewDidLoad

如果我将方案更新为具有默认位置,那么它只会一直使用默认位置,并且永远不会更新我当前的位置,当我在实际设备上尝试时也是如此,但如果我将其保留为无,则代表调用错误didFailWithError 的方法,表示返回的值为零。我在这里丢了。请帮忙。

override func viewDidLoad() 
        super.viewDidLoad()

        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.distanceFilter = kCLDistanceFilterNone
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()

        


 func locationManager(manager: CLLocationManager, didFailWithError error: NSError) 
        print("In the location, seems we got some shit --> didFailWithError: \(error.description)")

        
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 

        let locValue : CLLocationCoordinate2D = locationManager.location!.coordinate
        let geoFire = GeoFire(firebaseRef: self.geofireRef.child("Posts"))

        let center = CLLocation(latitude: locValue.latitude, longitude: locValue.longitude)

        let circleQuery = geoFire.queryAtLocation(center, withRadius: 10)

        circleQuery.observeEventType(.KeyEntered, withBlock:  (key: String!, location: CLLocation!) in
            print("Key '\(key)' entered the search area and is at location '\(location)'")
        )

        self.locationManager.stopUpdatingLocation()

    

【问题讨论】:

您正在监控重大的位置变化。这些只会在一段时间后发生。你知道吗?在模拟器中,最多可能需要 5 分钟才能看到任何更新。这些可能真的不准确,您不会立即看到更新。尝试在不显着位置更改的情况下进行。在停止之前,我还会先处理 didUpdateLocations 上的所有内容。 我不知道,但这些只是尝试任何事情的额外尝试。根据您的建议进行更改后,我仍然遇到同样的问题。 我已经更新了我的代码,但仍然遇到同样的问题 请发布代码,而不是截图。您是否检查过您的应用设置以确认您没有拒绝位置权限?地图可以在设备上找到您的位置吗?当您在设备上模拟位置时,有时位置服务会受到干扰,您需要重新启动设备才能使其再次工作。在模拟器上你总是需要模拟一个位置 对不起。我会更新帖子。如何进入应用设置以检查我的位置是否被拒绝? 【参考方案1】:

运行以下代码:

import UIKit
import CoreLocation
import MapKit

class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate 
    var locationManager = CLLocationManager()
    var mapView = MKMapView()
    var screenSize = UIScreen.mainScreen().bounds

    override func viewDidLoad() 
        super.viewDidLoad()

        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.distanceFilter = kCLDistanceFilterNone
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()

        mapView = MKMapView(frame: CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height))
        mapView.showsUserLocation = true
        mapView.delegate = self
        view.addSubview(mapView)

        // Do any additional setup after loading the view, typically from a nib.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) 
        print("In the location, seems we got some error \(error.description)")
    

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
        let locValue : CLLocationCoordinate2D = locationManager.location!.coordinate
        let center = CLLocation(latitude: locValue.latitude, longitude: locValue.longitude)
        let region = MKCoordinateRegionMakeWithDistance(locValue, 2000, 2000)
        mapView.setRegion(region, animated: true)
        mapView.centerCoordinate = locValue
        print(center)
    

当然是在Info.plist 中设置要求,并在调试菜单部分启用位置模拟器:

给我以下输出:

<+37.33756603,-122.04120235> +/- 0.00m (speed -1.00 mps / course -1.00) @ 8/7/16, 11:27:25 PM Central European Summer Time
<+37.33756603,-122.04120235> +/- 0.00m (speed -1.00 mps / course -1.00) @ 8/7/16, 11:27:26 PM Central European Summer Time

【讨论】:

所以每当模拟器打开时,位置集设置为无,我如何让它一直设置?但即便如此,我还是在网上查看了我的位置,坐标与 CLLocation 报告的不匹配。有什么想法吗? 因此,由于某种原因,当我运行项目并转到调试 --> 模拟位置时,“不模拟位置”被选中,但是当我在应用程序未运行时打开它时,一切都是灰色的并且“不要模拟位置”未选中。我怎么阻止这个!!!我觉得我们很亲密!!! 是的,模拟器没有模拟您当前的位置。它正在模拟 Apple Campus 周围的基本标准预定义路线。如果您想要自己的位置,则需要使用您的设备。而且您只能在应用程序内模拟位置。不是当您的应用程序在 xCode 中关闭时。希望这能给你一些答案。只要您在控制台中收到更新,就可以了。如果您想查看模拟器的效果,您应该在地图上绘制您的位置并进行模拟。 啊,好吧,我想这是有道理的。所以没有办法将模拟器的调试 -> 位置 -> 城市自行车骑行设置为永久,因为现在我必须在视图加载之前快点更改它以获得任何可行的结果 哦。每次我在模拟器上运行时,由于某种原因,调试下的位置值都会被设置回无。但除此之外,我似乎有足够的能力继续前进。谢谢@Wouter125

以上是关于CLLocation Manager 使用默认位置而不是使用实际位置进行更新的主要内容,如果未能解决你的问题,请参考以下文章

未调用 CLLocation Manager didStartMonitoringForRegion 委托方法

Swift 中的 CLLocation 管理器获取用户的位置

iOS - CLLocation Manager didUpdateLocations 在一个类中被调用,而不是在另一个类中?

[CLLocation] 和 CLLocation 的区别

iOS - CLLocation Manager didUpdateLocations 调用了太多时间

如何将位置:[CLLocation] 转换为 Coordinate2D?