定位前的准备工作:
1.infor.plist中加入以下2个参数:
1.加入Bundle display name,其参数不能为空
2.自iOS8起,系统定位功能进行了升级,SDK为了实现最新的适配,自v2.5.0起也做了相应的修改,开发者在使用定位功能之前,需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述
2.重点在于BMKLocationService 的这个类进行定位,定位方面主要分以下3块:
1.关于定位方式的问题:
定位开启:[self.locService startUserLocationService];
定位关闭:[self.locService stopUserLocationService];
定位方式改变如下:
// 设置定位图层特点(每次修改图层属性,都要先关闭,再设置,最后再打开)
self.mapView.showsUserLocation =NO;
self.mapView.userTrackingMode =BMKUserTrackingModeFollow;//定位跟随模式
self.mapView.showsUserLocation =YES;
其中:userTrackingMode参数有以下4个取值:
typedef enum {
BMKUserTrackingModeNone = 0, /// 普通定位模式
BMKUserTrackingModeHeading, /// 定位方向模式
BMKUserTrackingModeFollow, /// 定位跟随模式
BMKUserTrackingModeFollowWithHeading, /// 定位罗盘模式
} BMKUserTrackingMode;
2.关于定位的代理方法总结
以下为BMKLocationServiceDelegate的方法,详细解释见前面的注释,具体使用见Demo
/**
*在地图View将要启动定位时,会调用此函数
*@param mapView 地图View
*/
- (void)willStartLocatingUser
{
NSLog(@"start locate");
}
/**
*用户方向更新后,会调用此函数
*@param userLocation 新的用户位置
*/
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{
[self.mapView updateLocationData:userLocation];
NSLog(@"heading is %@",userLocation.heading);
}
/**
*用户位置更新后,会调用此函数
*@param userLocation 新的用户位置
*/
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
// NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
[self.mapView updateLocationData:userLocation];
}
/**
*在地图View停止定位后,会调用此函数
*@param mapView 地图View
*/
- (void)didStopLocatingUser
{
NSLog(@"stop locate");
}
/**
*定位失败后,会调用此函数
*@param mapView 地图View
*@param error 错误号,参考CLError.h中定义的错误号
*/
- (void)didFailToLocateUserWithError:(NSError *)error
{
NSLog(@"location error");
}
需要注意的是:其中的didUpdateUserHeading 和didUpdateBMKUserLocation 调用频率比较高,不用定位功能时,要及时关闭,可以省电。
3.关于定位图层的属性更改
主要为下面这个类:BMKLocationViewDisplayParam
其中的属性为以下如:
self.locViewParam.accuracyCircleFillColor =[UIColor redColor]; /////精度圈 填充颜色
self.locViewParam.locationViewOffsetX =100;//具体定位位置处在屏幕的X值
self.locViewParam.locationViewOffsetY =200;///具体定位位置处在屏幕的Y值
参考Demo为:本人项目地址: