好多app都用到了定位和地图功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发
CoreLocation:用于地理定位,地理编码,区域监听等(着重功能实现)
MapKit:用于地图展示,例如大头针,路线,遮盖层展示等(着重界面展示)
LBS:Location Based Service
SoLoMo:Social Local Mobile(索罗门)
要想获得用户的位置
想访问用户的通讯录,日历,相机,相册等等
1> 定位流程
1.引入CL框架
#import <CoreLocation/CoreLocation.h>
2.创建定位管理者CLLocationManager对象
3.调用调用startUpdatingLocation开始定位(调用stopUpdatingLocation可以结束定位)
4.设置CLLocationManager的代理 在
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations 方法中监听定位
2> 设置属性
1.distanceFilter距离过滤器设置更新定位的距离
2.desiredAccuracy定位精确度
kCLLocationAccuracyBestForNavigation//最适合导航
kCLLocationAccuracyBest//最好的
kCLLocationAccuracyNearestTenMeters//附近10米
kCLLocationAccuracyHundredMeters//100米
kCLLocationAccuracyKilometer;//1000米
kCLLocationAccuracyThreeKilometers;//3000米
精确度越高 越耗电 定位时间越长
该字段只在iOS8.0- 有效
1.开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)
该字段只在iOS8.0- 有效
2.targets-Capabilities-Background Modes-Location updates 可以开启后台定位
从iOS8.0开始,苹果进一步加强了对用户隐私的保护。
当APP想访问用户的隐私信息时,系统不再自动弹出一个对话框让用户授权
调用iOS8.0的API,主动请求用户授权
- (void)requestAlwaysAuthorization;请求允许在前后台都能获取用户位置的授权(必须在Info.plist文件中添加NSLocationAlwaysUsageDescription字段设置显示的授权提示描述 否则无法定位)
- (void)requestWhenInUseAuthorization;请求允许在前台获取用户位置的授权(必须在Info.plist文件中添加NSLocationWhenInUseUsageDescription字段设置显示的授权提示描述 否则无法定位)
kCLAuthorizationStatusNotDetermined 用户还未决定
kCLAuthorizationStatusRestricted 访问受限制
kCLAuthorizationStatusDenied 访问被拒绝
kCLAuthorizationStatusAuthorizedAlways 前后台授权
kCLAuthorizationStatusAuthorizedWhenInUse 前台授权
1> 下面的代理方法可以时刻获取用户所在位置
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations;
2> CLLocation的属性
CLLocation详解
coordinate:经纬度
altitude:海拔
course:航向
speed:速度
1)开始监听设备朝向
[self.locationManager startUpdatingHeading];
2)在locationManager初始化时 设置朝向过滤器 每隔多少度调用一次
_locationManager.headingFilter = 2.0f;
3)实现代理方法获取朝向
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading;
4)CLHeading对象的属性
magneticHeading:磁北角度
trueHeading:真北角度
首先创建一个CLLocationManager属性,用懒加载进行初始化。用 CLLocationCoordinate2D 创建一个center,然后设置监听的范围 CLCircularRegion;
首先创建 一个CLGeocoder的属性并初始化,然后调用 geocodeAddressString 方法进行编码,编码出来的信息存放在placemarks 中,遍历出自己想要的信息进行显示。用 reverseGeocodeLocation反编码。
首先创建 MKMapView和CLGeocoder的属性,遵守MKMapVIewDelegate协议,获取当前的触摸点,将其转化为经纬度,再添加大头针,在添加大头针时要先创建一个类遵守MKAnnotation协议,将转化的经纬度进行反编码,得到 的信息给annotation的对应的属性赋值,做成大头针的气泡效果, - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(MSAnnotation*)annotation
用这个代理方法进行处定义大头针,设置leftCalloutAccessoryView和rightCalloutAccessoryView和image属性自定义大头针。
(二)MapKit框架的使用
1> 地图的类型
可以通过设置MKMapView的mapType设置地图类型
MKMapTypeStandard:普通地图
MKMapTypeSatellite:卫星云图
MKMapTypeHybrid:混合模式(普通地图覆盖于卫星云图之上)
MKMapTypeSatelliteFlyover:3D立体卫星(iOS9.0)
MKMapTypeHybridFlyover:3D立体混合(iOS9.0)
1)简单属性
*mapType:设置地图显示类型
*zoomEnabled:是否可以缩放
*scrollEnabled:是否可以滚动
*rotateEnabled:是否可以旋转
*showsCompass:是否展示指南针
*showsScale:是否显示比例尺
2)重要属性
*showsUserLocation:是否显示用户位置
8.0后要显示用户的位置 必须先请求授权
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.locationManager requestAlwaysAuthorization];
}
*userTrackingMode:用户追踪模式 可以自动最终用户的位置
MKUserTrackingModeNone 不追踪
MKUserTrackingModeFollow 追踪
MKUserTrackingModeFollowWithHeading 追踪并且显示朝向
1> 方法
设置地图显示的中心位置
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
设置地图显示区域
- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
2> 代理方法
用户位置更新的回调代理方法
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation;
地图显示区域变化的回调代理方法
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;
3> MKUserLocation大头针模型的属性说明
location:位置对象
heading:朝向
title:标题
subtitle:子标题
1.可以将需要导航的位置丢给系统的地图APP进行导航
2.发送网络请求到公司服务器获取导航数据,然后自己手动绘制导航。
3.利用第三方SDK实现导航(百度)