iOS笔记 Core Location定位

主要问题

很多应用上需要获得当前用户所在的位置,有或者需要在地图上根据座标显示一些点一些信息。这次主要分享Core Location定位当前位置我遇到的问题。

第一个方案

根据我看的文档所示定位分为一下几个步骤:

  • 包含Core Location framework
  • 创建一个CLLocationManager的实例
  • 设置CLLocationManagerDelegate委托
  • 实现CLLocationManagerDelegate委托里面的- (void)locationManager:(CLLocationManager )manager didUpdateToLocation:(CLLocation )newLocation fromLocation:(CLLocation *)oldLocation方法

其中原理就不细说了。只说实现问题。在完成了- (void)locationManager:(CLLocationManager )manager didUpdateToLocation:(CLLocation )newLocation fromLocation:(CLLocation *)oldLocation以后。当我们想要定位的时候。需要启动startUpdatingLocation。因为启用定位是一个耗电的工程。如果时刻定位的话,程序会变成电池杀手。所以,各种大牛建议,定位只在需要的时候定位。完成以后我们应该用停止它stopUpdatingLocation。

调用你实例的CLLocationManager startUpdatingLocation以后,会轮询- (void)locationManager:(CLLocationManager )manager didUpdateToLocation:(CLLocation )newLocation fromLocation:(CLLocation *)oldLocation方法。直到stopUpdatingLocation为止。因此可以用一个数组存储一定的newLocation。然后取平均值。本来我以为这样可能会取值准确一些。但是我实际定位估计有2-3km的距离。起初我以为是用ip来定位可能误差较大没有在意(用的iPad wifi测试).后来用其他App看到定位很准确,没有这么大的误差,就觉得做错了。然后尝试第二种方案。

第二个方案

隐约记得有种叫火星座标的东西。在这里V2EX普及了一下知识以后,觉得难道是火星人搞鬼了。然后纠结于解决方法。最后忘记在哪里看到MKMapView里面有一个userLocation的属性。就应该是当前位置座标。干净尝试一下:

  • 包含MapKit framework
  • 创建MKMapView一个实例类
  • 设置MKMapViewDelegate委托
  • 实现MKMapViewDelegate委托中的- (void)mapView:(MKMapView )mapView didUpdateUserLocation:(MKUserLocation )userLocation
    方法
  • MKMapView实例调用setShowsUserLocation

这样在- (void)mapView:(MKMapView )mapView didUpdateUserLocation:(MKUserLocation )userLocation方法里面userLocation就可以取得当前用户的位置。而且很准确。

总结

我不知道第一个方案为什么不准确,而第二个比较准确。跟曹哥讨论以后,曹哥告诉我说有人为了获得位置可能会建立一个不显示的MKMapView而仅仅是为了获得坐标。特此记录。