当前位置: 代码迷 >> 综合 >> iOS中 CoreLocation 和 MapKit 的使用
  详细解决方案

iOS中 CoreLocation 和 MapKit 的使用

热度:69   发布时间:2023-12-12 04:21:45.0

好多app都用到了定位和地图功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发
CoreLocation:用于地理定位,地理编码,区域监听等(着重功能实现)
MapKit:用于地图展示,例如大头针,路线,遮盖层展示等(着重界面展示)

2个热门专业术语
LBS:Location Based Service
SoLoMo:Social Local Mobile(索罗门)

用户隐私的保护

从iOS6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权
要想获得用户的位置
想访问用户的通讯录,日历,相机,相册等等

当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权

(一)CoreLocation框架的使用

一 iOS8.0之前的定位
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米
精确度越高 越耗电 定位时间越长 

3.开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)
该字段只在iOS8.0- 有效

3> 注意点
1.开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)
该字段只在iOS8.0- 有效
2.targets-Capabilities-Background Modes-Location updates 可以开启后台定位

二 iOS8.0之后的定位
从iOS8.0开始,苹果进一步加强了对用户隐私的保护。
当APP想访问用户的隐私信息时,系统不再自动弹出一个对话框让用户授权

1) 解决方案
调用iOS8.0的API,主动请求用户授权
- (void)requestAlwaysAuthorization;请求允许在前后台都能获取用户位置的授权(必须在Info.plist文件中添加NSLocationAlwaysUsageDescription字段设置显示的授权提示描述 否则无法定位)
- (void)requestWhenInUseAuthorization;请求允许在前台获取用户位置的授权(必须在Info.plist文件中添加NSLocationWhenInUseUsageDescription字段设置显示的授权提示描述 否则无法定位)

2)获取授权状态的代理方法
kCLAuthorizationStatusNotDetermined 用户还未决定
kCLAuthorizationStatusRestricted 访问受限制
kCLAuthorizationStatusDenied 访问被拒绝
kCLAuthorizationStatusAuthorizedAlways 前后台授权
kCLAuthorizationStatusAuthorizedWhenInUse 前台授权

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status

3)通过类方法[CLLocationManager locationServicesEnabled]可以判断定位是否可用(是否支持定位或者定位是否开启)

三 CLLocation对象
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框架的使用

一 MapKit的基本使用
1> 地图的类型
可以通过设置MKMapView的mapType设置地图类型
MKMapTypeStandard:普通地图
MKMapTypeSatellite:卫星云图
MKMapTypeHybrid:混合模式(普通地图覆盖于卫星云图之上)
MKMapTypeSatelliteFlyover:3D立体卫星(iOS9.0)
MKMapTypeHybridFlyover:3D立体混合(iOS9.0)

2> 属性说明
1)简单属性
*mapType:设置地图显示类型
*zoomEnabled:是否可以缩放
*scrollEnabled:是否可以滚动
*rotateEnabled:是否可以旋转
*showsCompass:是否展示指南针
*showsScale:是否显示比例尺
2)重要属性
*showsUserLocation:是否显示用户位置
8.0后要显示用户的位置 必须先请求授权
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [self.locationManager requestAlwaysAuthorization];
}
*userTrackingMode:用户追踪模式 可以自动最终用户的位置 
MKUserTrackingModeNone 不追踪
MKUserTrackingModeFollow 追踪
MKUserTrackingModeFollowWithHeading 追踪并且显示朝向

二 MapKit的中级使用
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实现导航(百度)