地图定位应用场景:周边 导航
oc基于两个框架开发: CoreLocation框架 和 MapKit框架
CoreLocation框架分为三部分:(开发)
1.地理定位
2.地理编码
地理编码: 地址转换成经纬度
反地理编码:经纬度转换成经纬度
3.区域监听
MapKit框架分为两部分:(展示)
1.地图展示
2.路线规划
note: LBS:基于位置的服务
SoLoMo(索罗门):社交化、本地化、移动化(分移动网和移动APP)
第一大部分:
使用CoreLocation框架进行定位(步骤):1.导入框架(Xcode5后可以省略) 2.导入头文件 3.使用CLLocationManager对象来做很多相关的位置服务
小经验:如果以后使用位置管理者这个对象,实现某个服务,那么可以以startXX 开始某个服务 以stopXX停止某个服务
//开始更新位置信息 ing,意味着,一旦调用了这个方法,就会不断的刷新用户位置,然后告诉外界
//从ios6以后,只要我们在app内部,使用了用户隐私(照片 通讯录等),系统就会要求用户授权
如果想后台运行,勾选后台模式如下:
ios8.0以后的定位:
//如果是ios8.0以后,在想请求用户位置信息,需要主动的请求授权,系统不会再自动弹出一个窗口
1.用户授权前台定位步骤:
2.用户后台定位步骤:
//默认情况,只能在前台获取用户位置信息 如果想要在后台也获取用户位置 那么必须勾选后台模式location updates
3.用户前台后台定位授权操作步骤:(多用)
.判断用户是否开启定位
.获取用户当前所在的城市,切换到对应的城市
如果想要定位一次,那么可以在定位到之后,停止定位
但是导航的话要求每隔一段时间/每隔一段距离定位一次(建议每隔一段距离定位一次)
设置过滤距离
每隔100米定位一次
locationM.distanceFilter =100
//定位本身就非常耗电,定位的精准度越高,越耗电,定位时间越长
//为了省电,尽量在满足需求的情况下低准确度
定位分为:
1.标准定位服务:
定位实现的方案:基于gprs(蓝牙/基站/wifi定位,具体使用哪种,苹果有自己规则
优点:定位精确度高
缺点:程序关闭,就没法获取位置,而且耗电
2.显著位置变化定位
定位实现方案:(基于基站 定位,必须要求设备有电话模块)
优点:当App被完全关闭时,也可以接收到位置通知,并让app进入到后台处理
缺点:定位精度低
所以:如果要求定位及时,精度较高,并且进行时间较短,可使用标准定位;如果长时间监控用户位置,用户移动速度比较快(例如:打车软件),可使用后者
3.自动获取定位
第二大部分:
CLLocation对象
CLLocation演练场景:
note: 1.千万不要忘记版本适配
2.前后台定位模式(更好),但必须保证xcode7.0版本,9.0之后的版本
3.使用场景:采集用户信息,统计APP使用发布;查找周边好友,周边商家;导航;电商APP,获取用户所在城市
4.不需要使用用户位置时,一定要关闭定位服务;如果可以尽可能使用低精度的desiredAccuracy;如果是数据采集(一般是周期性的轮询用户位置),在轮询期间一定要关闭定位
第三大部分:
1.指南针效果的实现
思路:获取手机旋转的方向,然后再反转图片就可以了
1)创建位置管理者
2)使用位置管理者,获取当前设备朝向
//"磁力计"传感器(trueHeading真北方向,magneticHeading磁北方向,一般用磁北方向)
2.区域监听-监听进入、离开区域动作
//如果想要进行区域监听,在iOS8.0之后,必须要请求用户的位置授权
1)创建区域
2)监听区域
3)进入区域时调用
4)离开区域时调用
3.地理编码 反地理编码
地理编码:把地址文字转化成经纬度 gecode
反地理编码:把经纬度转化成文字地址 reverseGecode
需要联网!!
CLPlacemark:地标对象
//location:地标对象对应的位置对象
//name:地址详情
//。。。。。
4.获取当前城市的名称(定位+反地理编码)
5.使用第三方框架进行定位
原因:因为使用CoreLocation框架获取用户位置信息,是通过代理进行回调;而第三方框架将“代理模式”转换成“block模式”,而且额外增加了超时时间等功能
框架名称:LocationManager(可以在gitHub上搜索到)
6.定位工具类的封装(代理模式到bolck模式的转换)
第四大部分:
1.MapKit框架(用于地图展示,例如大头针、路线、覆盖层展示等等)
1)MapKit框架的基本用法
使用步骤:1.导入主头文件 #import<Mapkit/Mapkit.h>
2.Mapkit有一个比较重要的UI控件:MKMapView,专门用于地图展示
注意:有的状态只有在特定模式下可以用,或者在iOS几以上才能用
2.模拟器追踪显示用户位置-查看当前用户位置(MKUserLocation)
3.模拟追踪显示用户位置-调整地图显示区域
地图有个宽和高,经度跨度越大显示内容越小,跨度越小显示内容越大(span),span分为经度跨度(longitudeDelta)和纬度跨度(latitudeDelta);
常见问题总结:1.地图上的蓝点为啥不显示?
第一:确定代码是否有误(例如:是否显示了用户位置)
第二:确定模拟器是否设置位置
第三:看看位置在哪,是不是不在当前地图显示区域
2.地图跨度设置之后始终显示地图跨度和位置数值不一致?
当前看到的地图是一个矩形,实际上地图是个椭圆形,所以移动时跨度一直在变。
测试环境:1.加载地图数据需要联网 2.苹果自带的是高德地图
4.大头针的基本使用
//在地图上操作大头针,实际上操作的是大头针“数据模型”
//删除、添加大头针:移除/添加一个大头针数据模型
//协议里不能创建对象
上面“2”的操作是让点击屏幕时,在当前地图展示的中心位置添加一个大头针,移动地图时移除所有大头针。
上面“3”的操作是点击屏幕时在鼠标点击的位置插入一个标签,标签的标题和副标题显示大头针所对应的地理位置
5.自定义大头针
1)模拟系统实现方案
如果当我们添加一个大头针数据模型到地图上,那么地图上就会自动调用一个代理方法,来查找对应的大头针“视图!!”
-parameter mapView : 地图
-parameter annotation: 大头针“数据模型”
-returns:大头针“视图”
//注意事项:如果这个方法没有实现,或者返回nil,那么就会使用系统默认的大头针视图来显示
2)自定义大头针和弹框
可以设置大头针的图片,弹框的位置,弹框左侧的view、右侧的view和下部弹框,设置大头针可以拖动(移动时会自动更新位置数据)
3)代理方法补充(MKMapViewDelegate)
下面“1”图展示了MKMapViewDelegate中的两个代理方法:
4)切换追踪模式的按钮
6 地图使用总结