CLLocationManager
首先,来讲一下CLLocationManager,因为,有人明天要用到,临时写的。
那么怎么使用呢?
首先需要定义一个CLLocationManager的属性,因为定位是一个全局性的。
那么接下来的代码,是可以写到你需要使用到地图的那个模块所对应的工具类或者ViewController类。
第一步:创建一个CLLocationManager实例;
self.locationManager = [[CLLocationManager alloc]init];
第二步:在iOS 8.0之后需要进行某些操作,因为苹果对于安全性的强调实在是太高了,所以,你懂的;
if ([[UIDevice currentDevice].systemVersion floatValue] > 8.0) {
[self.locationManager requestWhenInUseAuthorization];
[CLLocationManager locationServicesEnabled];
}
上面的授权方式需要注意:
requestWhenInUseAuthorization----是设置当使用的时候才定位;
requestAlwaysAuthorization-----是设置一直都允许定位。
当然还不止,这里设置的授权方式,需要跟我们在info.plist中设置一致。
跟requestWhenInUseAuthorization配对使用
跟requestAlwaysAuthorization配对使用
第三步:在iOS 9.0 后又需要安全性检测,虽然这样看似很麻烦,但真的很麻烦。不过,对于用户角度来说,安全性真的是蛮靠谱的。
if ([[[UIDevice currentDevice] systemVersion] floatValue] > 9.0) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
第四步:设置代理即可;
self.locationManager.delegate = self;
第五步:对于定位功能,需要开启定位功能;
[self.locationManager startUpdatingLocation]
第六步:对于定位来说,是需要设置更新间距的,测试阶段可以把这个值调小一点,比如5米,但是,一旦产品上线,需要把该值设置到500-1000这么一个范围;
self.locationManager.distanceFilter = 500
第七步:还记得设置代理那一步,我们还没有遵循协议勒,遵循的协议名:CLLocationManagerDelegate
第八步:当然就是实现,协议内的方法咯;
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations;
上面的那个方法中,要注意到locations这个数组是一个CLLocation,这个CLLocation类,苹果在底层已经帮我们获取到了当前用户位置的所有信息,并已经存在在这个locations数组中。
于是我们可以拿出数组中的最后一个元素,得到我们想要的信息。
之后,我们就要涉及到一个地理反编码技术,也就是通过经纬度得到具体位置的实际信息。
//获取最新位置
CLLocation *currentLocation = [locations lastObject];
//根据最新位置,进行地理反编码
CLGeocoder *gecoder = [CLGeocoder new];
[gecoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
//获取用户当前位置信息
NSString *userLocationInfo = [[placemarks lastObject] name];
}
当然在这个CLPlaceMark类里,有很多我们需要的信息,比如,
街道号-----thoroughfare
位置-------name
国家-------country
等等之类的,你可以在敲一个demo的时候,自己点CLPlaceMark类进去看一看。
以上就是关于CLLocationManager类的简单使用。
当然,在我们U轨迹项目中,使用到的后台定位功能的具体实现细节还有很多,在下一篇,我将详细讲到如何实现真正的后台定位。
若有不到的地方,还请指正。