部分LBS应用,在打开app时获取当前的准确位置就能满足要求,一直开着定位,不仅会浪费流量也费电,所以这里给大家推荐一个一次定位的解决方法。
步骤如下:
1.开启定位,请求获取位置信息。(注意:iOS定位需要去请求定位权限,在info.plist中添加NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription字段)
2.在定位回调中对返回的位置信息做一些处理,保证位置信息的准确性。
a)位置信息可能有缓存,所以要判断一下时间。
b)iOS的定位是越定越准的(即:进回调的次数越多,定位的精确度越高),所以要判断位置的水平精度是否有效。
c)不同的业务场景,对定位的精准度要求不一样,比如:在室外叫出租车,希望司机能准备的看到我的位置,这时候需要与当前位置偏差越小越好;在办公室内买东西,只要标识出用户在某个楼里面就可以了。所以,不同的业务场景,我们需要进行不同的设置。
3.通过上面的三重判断,终于获取了我所需要的位置信息,这时停止定位,悬崖勒马,再也不用担心用户说“你的app怎么这么费电了”。
代码奉上(这段代码也适用于定位按钮的功能,点击一次定位按钮进行一次定位)
#import <ViewController.h>
#import <MAMapKit/MAMapKit.h>
@interface ViewController ()<MAMapViewDelegate>
{
MAMapView *_mapView;
}
@end
- (void)viewDidLoad
{
[super viewDidLoad];
//配置用户Key
[MAMapServices sharedServices].apiKey = @"用户Key";
_mapView = [[MAMapView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds))];
_mapView.delegate = self;
//开启定位
_mapView.showsUserLocation = YES; //开启定位
}
-(void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation
updatingLocation:(BOOL)updatingLocation
{
if(updatingLocation)
{
//取出当前位置的坐标
CLLocation *newLocation = userLocation.location;
//判断时间
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
if (locationAge > 5.0) {
return;
}
//判断水平精度是否有效
if (newLocation.horizontalAccuracy < 0) {
return;
}
//根据业务需求,进行水平精度判断,获取所需位置信息(100可改为业务所需值)
if(newLocation.horizontalAccuracy < 100){
//获取定位位置的经纬度
CLLocationCoordinate2D myCoordinate = [newLocation coordinate];
// 纬度
CGFloat latitude = myCoordinate.latitude;
// 经度
CGFloat longitude = myCoordinate.longitude;
// 做所需的功能
……
//停止定位
_mapView.showsUserLocation = NO;
}
}
}
注意:_mapView.showsUserLocation = NO停止定位后,定位小蓝点也同时从mapview上消失,如果想看到你的定位点,用获取的坐标加个annotation即可,加annotation的方法请看这里:http://lbs.amap.com/api/ios-sdk/guide/overlay/#annotation。