此处有BUG
适合新手,大牛路过请无视。
开始了
如果你是新手,对定位类不是很懂,或者公司要求接百度地图API。
哎呀!还是不做废话了。首先我们集成通过CocoaPods集成百度地图如果对CocoaPods还不了解推荐看一遍就会的CocoaPods的安装和使用教程或者你想直接看iOS百度地图配置
进行中
那么我开始简单的介绍一下吧
首先你要简单配置一下
如果要使用在前台定位 添加Privacy - Location When In Use Usage Description
如果要在后台使用 添加Privacy - Location Always Usage Description
建议两个都添加在plist文件里面
plist文件配置.png
#import <Foundation/Foundation.h>
@import CoreLocation;
@interface YZLocationManager : NSObject
//是否开启后台定位 默认为NO
@property (nonatomic, assign) BOOL isBackGroundLocation;
//isBackGroudLocation为YES时,设置LocationInterval默认为1分钟
@property (nonatomic, assign) NSTimeInterval locationInterval;
//后台定位开启时 返回定位经纬度
@property (nonatomic, copy) void (^YZBackGroundLocationHander) (CLLocationCoordinate2D coordinate);
//后台定位开启时 返回反编码地理位置
@property (nonatomic, copy) void (^YZBackGroundGeocderAddressHander) (NSString *address);
//获取经纬度
@property (nonatomic, copy) void (^YZLocationCoordinate) (CLLocationCoordinate2D coordinate, NSError *error);
//获取反编码地理位置
@property (nonatomic, copy) void (^YZLocationGeocderAddress) (NSString *address, NSUInteger error);
//最近一次定位的经纬度
@property (nonatomic, readonly) CLLocationCoordinate2D lastCoordinate;
//最近一次反编码地理位置
@property (nonatomic, copy, readonly) NSString *lastGeocoderAddress;
//通过单例创建
+ (YZLocationManager *)sharedLocationManager;
//获取经纬度和反编码地理位置
- (void)receiveCoorinate:(void (^)(CLLocationCoordinate2D coordinate, NSError *error))coordinateHander geocderAddress:(void (^)(NSString *address, NSUInteger error))addressHander;
//传入经纬度获取反编码地理位置
- (void)geoCodeSearchWithCoorinate:(CLLocationCoordinate2D)coordinate address:(void (^)(NSString *address, NSUInteger error))address;
//开始定位
- (void)startLocationService;
//停止定位
- (void)stopLocationService;
@end
这是.h文件 定义了几个block
如果你创建是一个单例类 那么要注意在多个页面使用到时这些属性已最后一次赋值为准,如果同一个页面多处要求同时定位,本类或许将不适用。
如果你要使用持续后台定位,我们还要进一步配置
在配置完之后使用的时候要注意,关于一些后台定位的配置都需要
isBackGroundLocation为YES的时候才能设置
iOS8进入后台的时候需要配置requestAlwaysAuthorization否则在顶部将会显示一个蓝条以上都配置好了就可以使用了 由于使用的百度地图,百度地图定位间隔的API没有公开经过测试大概是30秒,这30秒正常可以满足大多数需求 如果这里有想要
系统自带的持续定位的那么你可以看看这个
注意
如果你想审核的时候不被拒,在App介绍里面的加上一句话让用户看到(例句):
使用“打卡”应用点击上班签到后将开启轨迹定位功能,会持续使用GPS定位服务,切换到后台仍会保存GPS连接,相比其他操作会消耗更多的电量。
GPS在后台持续运行会影响电池续航时间。
简单的例子来一个,其它用法你们可以自己看下源码的注释
YZLocationManager *manager = [YZLocationManager sharedLocationManager];
manager.isBackGroundLocation = YES;
manager.locationInterval = 10;
// @weakify(manager)
[manager setYZBackGroundLocationHander:^(CLLocationCoordinate2D coordinate) {
_plc(coordinate);
YZLMLOG(@">>>>>>>>>>>>>%f,,%f",coordinate.latitude,coordinate.longitude);
// @strongify(manager) //注意别造成循环引用
// [manager geoCodeSearchWithCoorinate:coordinate address:^(NSString *address, NSUInteger error) {
// YZLMLOG(@">>>>>>>>>>address:%@",address);
// }];
NSDictionary *dic = @{
@"time":self.dateString,
@"coordinate":[NSString stringWithFormat:@"%f,%f",coordinate.latitude,coordinate.longitude]
};
[self.dataSouce addObject:dic];
[self.tableView reloadData];
}];
[manager setYZBackGroundGeocderAddressHander:^(NSString *address) {
YZLMLOG(@">>>>>>>>>>address:%@",address);
}];
[manager startLocationService];
结束了
多的不说了,例子什么的都在源码里面了,哪里写的有问题的地方可以提出来以便楼主进行修改。觉得楼主写的好的请给颗star。
源码地址:GitHub
网友评论
manager.isBackGroundLocation = NO;
manager.locationInterval = 10;
设置为不支持后台定位,就是进入后台不返回经纬度而已,为什么NSAssert会拦截到crash呢????
还有就是如果设置为NO或者默认的话,这里直接返回了 失去了持续定位的功能 谢谢楼主
(void)setYZBackGroundLocationHander:(void (^)(CLLocationCoordinate2D))YZBackGroundLocationHander{
if (!self.isBackGroundLocation) { //如果 isBackGroundLocation为NO 后台定位将无效
return;
}
_YZBackGroundLocationHander = [YZBackGroundLocationHander copy];
}
-(void)updateLocationData:(BMKUserLocation*)userLocation;