题外话:
-
在移动互联网时代,移动app能解决用户的很多生活琐事,比如
- 导航:去任意陌生的地方
- 周边:找餐馆,找酒店,找银行,找电影院
-
在上述应用中都用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发
- Map Kit :用于地图展示
- Core Location:用于地理定位
-
两个专业术语:
- LBS :Location Based Service (基于定位的服务)
- SoloMo : Social Local mobile (所罗门)
1.CoreLocation框架的使用
-
CoreLocation框架使用的前提
-
导入框架(需要注意的Xcode5以后不需要手动导入,以前需要手动导入)
-
导入头文件 #import <CoreLocation/CoreLocation.h>
-
1.CoreLocation框架使用须知
-
2.CoreLocation框架中所有的数据类型的前缀都是CL
-
3.CoreLocation 中使用CLLocationManger 对象来做用户定位
-
最主要的5步(不要怕,很简单,相信我,试着敲下来)
1.创建CoreLocation 管理者(最好采用懒加载,管理者对象永远不死)
-(CLLocationManager *)locationManger { if (!_locationManger) { //1.创建CoreLocation 管理者 _locationManger = [[CLLocationManager alloc]init]; } return _locationManger; }
2.成为CoreLocation 管理者的代理监听获取到的位置(遵守协议)
self.locationManger.delegate = self;
3.定位授权,还需要在在info.plist里面进行配置(仅仅在大于等于ios8里面才要求用户主动授权,这是出于对安全性的要求)
//授权(这是一个方法) if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { NSLog(@"是ios8"); //主动要求用户对我们的程序授权,授权状态改变就会通知代理 [self.locationManger requestAlwaysAuthorization];//请求前台和后台定位权限 //[self.locationManger requestWhenInUseAuthorization];//请求前台定位权限 } else { NSLog(@"不是iOS8"); }
** 配置的方法:点击 requestAlwaysAuthorization **
*配置的方法*4.开始监听(开始获取位置)
[self.locationManger startUpdatingLocation];
NSLog(@"开始定位");
5.实现代理方法
/*
* 获取到位置信息之后就会被调用
*
* @param manger 触发事件的对象
*
* @param locations 获取到的位置
*/
//这步操作是很耗电的(一定要设置定位暂停)
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
NSLog(@"%s",__func__);
[self.locationManger stopUpdatingLocation];
NSLog(@"定位结束");
}
对于上面其他的一些设置
1.设置获取位置的精确度
如:self.locationManger.distanceFilter = kCLLocationAccuracyNearestTenMeters;
kCLLocationAccuracyBestForNavigation
kCLLocationAccuracyBest;
kCLLocationAccuracyNearestTenMeters;
kCLLocationAccuracyHundredMeters;
kCLLocationAccuracyKilometer;
kCLLocationAccuracyThreeKilometers;
2.设置多久距离获取一次location
self.locationManger.distanceFilter = 500; //filter |ˈfɪltə(r) 过滤
3.何时开启定位?(获取权限之后)
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
/*
//1.用户从未选择过授权
kCLAuthorizationStatusNotDetermined = 0
//2.无法使用定位服务,该状态用户无法改变
kCLAuthorizationStatusRestricted
//3.用户拒绝该应用定服务,或是定位服务总开关出于关闭状态
kCLAuthorizationStatusDenied
//4.已经授权(废弃)
kCLAuthorizationStatusAuthorized
//5.用户允许该程序无论何时都可以使用地理信息
kCLAuthorizationStatusAuthorizedAlways
//6.用户同意程序在可见时使用地理位置
kCLAuthorizationStatusAuthorizedWhenInUse
****"最主要是后两个:定位成功"******
*/
if (status == kCLAuthorizationStatusNotDetermined) {
NSLog(@"等待用户授权");
}else if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse)
{
NSLog(@"授权成功");
//4.开始监听(开始获取位置)
[self.locationManger startUpdatingLocation];
NSLog(@"开始定位");
}else
{
NSLog(@"授权失败");
}
}
2.打印定位信息
latitude |ˈlætɪtjuːd, American -tuːd| 纬度
longitude |ˈlɒndʒɪtjuːd, American ˈlɔːndʒɪtuːd| 经度
degree |dɪˈgriː| 度
coordinate |kəʊˈɔːdɪnət |noun 坐标
//7.监听定位信息
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
CWLog(@"%s",__func__);
//8.获取CLLocation对象(获取用户最后一次的位置)
/*
location.coordinate; 坐标,包含经纬度
location.altitude;设置海拔高度,单位是米
location.course;设置前进方向 0表示北 90东 180南 270西
location.horizontalAccuracy; 水平精准度
location.verticalAccuracy; 垂直精准度
location.timeatamp;定位信息返回的时间
location.speed; 设备移动速度 单位是米/秒 ,适于行车速度而不太适于步行
*/
/*
可以设置模拟器的速度
bicycle ride 骑车速度
run 跑步
freeway drive 告诉公路驾车
*/
CLLocation *location = [locations lastObject];
NSLog(@"经度=%f 纬度=%f speed = %f",location.coordinate.latitude,location.coordinate.longitude,location.speed);
//如果只需要获取一次,可以获取到位置之后就停止
//[self.locationManager stopUpdatingLocation];
CWLog(@"关闭定位");
}
3.回顾一下CLLocationManger 的常用操作
-
1.开始用户定位
-(void)startUpdatingLocation; -
2.停止用户定位
-(void)stopUpdatingLocation; -
当用户调用了startUpdatingLocation的方法之后,就开始不断地定位用户的位置,中途会频繁的调用代理的下面方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
location 参数里面装着CLLocation的对象
CLLocation的一些属性4.有关-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations方法里面的一些操作(做一个类似导航的东西,界面自己布局)
声明
//上一次的位置
@property(nonatomic,strong)CLLocation *previousLocation;//previous |ˈpriːvɪəs| 先前的
//计算总的距离
@property(nonatomic,assign)CLLocationDistance sumDistance;
//记录总时间
@property(nonatomic,assign)NSTimeInterval sumTime;
方法的实现
//6.定位调用
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
CWLog(@"定位信息打印");
/* CLLocation 属性
timestap 获取到当前位置信息的时间
*/
/*
获取走了多远(用这一次的位置减去上一次的时间)
获取走这段路花了多长时间(这一次的时间减去上一次的时间)
获取速度(走了多远 / 花了多少时间)
获取总共走的路程 (把每次获取到走了多远累加起来)
获取平均速度 (总路程 / 总时间)
*/
CLLocation *newlocation = [locations lastObject];
if (self.previousLocation != nil) {
//计算两次的距离(单位是米)
CLLocationDistance distance = [newlocation distanceFromLocation:self.previousLocation];
//计算两次之间的时间(单位是秒)
NSTimeInterval dTime = [newlocation.timestamp timeIntervalSinceDate:self.previousLocation.timestamp];
//计算速度(米/秒)
CGFloat speed = distance/dTime;
CWLog(@"距离=%f 时间=%f 速度=%f ",distance,dTime,speed);
//累加时间
self.sumTime += dTime;
//累加距离
self.sumDistance += distance;
//计算平均速度
CGFloat averangeSpeed = self.sumDistance/self.sumTime;
CWLog(@"两次之间的距离=%f 时间=%f 当前速度=%f 全程时间= %f 全程距离= %f 全程的平均速度 = %f",distance,dTime,speed,self.sumTime,self.sumDistance,averangeSpeed);
}
//记录上一次的位置
self.previousLocation = newlocation;
}
提示:
CLLocationDistance distance = [newlocation distanceFromLocation:self.previousLocation];很重要获取两个位置之间的距离
网友评论