单军华
2018-05-04 25f409185a53e5e7beb17518a684298d92d31b3f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
//
//  BMKLocationManager.h
//  BMKLocationKit
//
//  Created by baidu on 2017/3/2.
//  Copyright © 2017年 baidu. All rights reserved.
//
 
 
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import "BMKLocationReGeocode.h"
#import "BMKLocation.h"
 
/** BMKLocationCoordinateType 枚举坐标系类型
 *
 */
typedef NS_ENUM(NSUInteger, BMKLocationCoordinateType)
{
    BMKLocationCoordinateTypeBMK09LL = 0,        ///<BMK09LL
    BMKLocationCoordinateTypeBMK09MC,           ///<BMK09MC
    BMKLocationCoordinateTypeWGS84,        ///<WGS84
    BMKLocationCoordinateTypeGCJ02          ///<GCJ02
};
 
/** BMKLocationNetworkState 枚举识别网络状态类型
 *
 */
typedef NS_ENUM(int, BMKLocationNetworkState) {
    BMKLocationNetworkStateUnknown = 0,    ///<网络状态未知
    BMKLocationNetworkStateWifi,           ///<网络状态wifi
    BMKLocationNetworkStateWifiHotSpot,          ///<网络状态连接WIFI移动热点
    BMKLocationNetworkStateMobile2G,          ///<网络状态移动2G
    BMKLocationNetworkStateMobile3G,          ///<网络状态移动3G
    BMKLocationNetworkStateMobile4G        ///<网络状态移动4G
    
};
 
 
///BMKLocation errorDomain
 
FOUNDATION_EXPORT NSErrorDomain const BMKLocationErrorDomain;
 
///BMKLocation errorCode
typedef NS_ENUM(NSInteger, BMKLocationErrorCode)
{
    BMKLocationErrorUnknown = 1,               ///<未知错误
    BMKLocationErrorLocateFailed = 2,          ///<定位错误
    BMKLocationErrorReGeocodeFailed  = 3,      ///<逆地理错误
    BMKLocationErrorTimeOut = 4,               ///<超时
    BMKLocationErrorCanceled = 5,              ///<取消
    BMKLocationErrorCannotFindHost = 6,        ///<找不到主机
    BMKLocationErrorBadURL = 7,                ///<URL异常
    BMKLocationErrorNotConnectedToInternet = 8,///<连接异常
    BMKLocationErrorCannotConnectToHost = 9,   ///<服务器连接失败
    BMKLocationErrorHeadingFailed = 10,        ///<获取方向失败
    BMKLocationErrorFailureAuth  = 11,         ///<鉴权失败
};
 
 
/**
 *  @brief 单次定位返回Block
 *  @param location 定位信息,数据包括CLLocation 位置数据,BMKLocationReGeocode 地址信息,参考BMKLocation。
 *  @param state 移动热点状态
 *  @param error 错误信息,参考 BMKLocationErrorCode
 */
typedef void (^BMKLocatingCompletionBlock)(BMKLocation * _Nullable location, BMKLocationNetworkState state , NSError * _Nullable error);
 
 
 
@protocol BMKLocationManagerDelegate;
 
#pragma mark - BMKLocationManager
 
 
///BMKLocationManager类。初始化之前请设置 BMKLocationAuth 中的APIKey,否则将无法正常使用服务.
@interface BMKLocationManager : NSObject
 
///实现了 BMKLocationManagerDelegate 协议的类指针。
@property (nonatomic, weak, nullable) id<BMKLocationManagerDelegate> delegate;
 
///设定定位的最小更新距离。默认为 kCLDistanceFilterNone。
@property(nonatomic, assign) CLLocationDistance distanceFilter;
 
///设定定位精度。默认为 kCLLocationAccuracyBest。
@property(nonatomic, assign) CLLocationAccuracy desiredAccuracy;
 
///设定定位类型。默认为 CLActivityTypeAutomotiveNavigation。
@property(nonatomic, assign) CLActivityType activityType;
 
///设定定位坐标系类型。默认为 BMKLocationCoordinateTypeGCJ02。
@property(nonatomic, assign) BMKLocationCoordinateType coordinateType;
 
///指定定位是否会被系统自动暂停。默认为NO。
@property(nonatomic, assign) BOOL pausesLocationUpdatesAutomatically;
 
 
///是否允许后台定位。默认为NO。只在iOS 9.0及之后起作用。设置为YES的时候必须保证 Background Modes 中的 Location updates 处于选中状态,否则会抛出异常。由于iOS系统限制,需要在定位未开始之前或定位停止之后,修改该属性的值才会有效果。
@property(nonatomic, assign) BOOL allowsBackgroundLocationUpdates;
 
///指定单次定位超时时间,默认为10s。最小值是2s。注意单次定位请求前设置。注意: 单次定位超时时间从确定了定位权限(非kCLAuthorizationStatusNotDetermined状态)后开始计算。
@property(nonatomic, assign) NSInteger locationTimeout;
 
///指定单次定位逆地理超时时间,默认为10s。最小值是2s。注意单次定位请求前设置。
@property(nonatomic, assign) NSInteger reGeocodeTimeout;
 
///连续定位是否返回逆地理信息,默认YES。
@property (nonatomic, assign) BOOL locatingWithReGeocode;
 
 
 
/**
 *  @brief 单次定位。如果当前正在连续定位,调用此方法将会失败,返回NO。\n该方法将会根据设定的 desiredAccuracy 去获取定位信息。如果获取的定位信息精确度低于 desiredAccuracy ,将会持续的等待定位信息,直到超时后通过completionBlock返回精度最高的定位信息。\n可以通过 stopUpdatingLocation 方法去取消正在进行的单次定位请求。
 *  @param withReGeocode 是否带有逆地理信息(获取逆地理信息需要联网)
 *  @param withNetWorkState 是否带有移动热点识别状态(需要联网)
 *  @param completionBlock 单次定位完成后的Block
 *  @return 是否成功添加单次定位Request
 */
- (BOOL)requestLocationWithReGeocode:(BOOL)withReGeocode withNetworkState:(BOOL)withNetWorkState completionBlock:(BMKLocatingCompletionBlock _Nonnull)completionBlock;
 
/**
 *  @brief 开始连续定位。调用此方法会cancel掉所有的单次定位请求。
 */
- (void)startUpdatingLocation;
 
/**
 *  @brief 停止连续定位。调用此方法会cancel掉所有的单次定位请求,可以用来取消单次定位。
 */
- (void)stopUpdatingLocation;
 
/**
 * @brief 请求网络状态结果回调。
 */
- (void)requestNetworkState;
 
 
/**
 * @brief 该方法返回设备是否支持设备朝向事件回调。
 * @return 是否支持设备朝向事件回调
 */
+ (BOOL)headingAvailable;
 
/**
 * @brief 该方法为BMKLocationManager开始设备朝向事件回调。
 */
- (void)startUpdatingHeading;
 
/**
 * @brief 该方法为BMKLocationManager停止设备朝向事件回调。
 */
- (void)stopUpdatingHeading;
 
 
/**
 *  @brief 转换为百度经纬度的坐标
 *  @param coordinate 待转换的经纬度
 *  @param srctype    待转换坐标系类型
 *  @param destype    目标百度坐标系类型(bd09ll,bd09mc)
 *  @return 目标百度坐标系经纬度
 */
+ (CLLocationCoordinate2D) BMKLocationCoordinateConvert:(CLLocationCoordinate2D) coordinate SrcType:(BMKLocationCoordinateType)srctype DesType:(BMKLocationCoordinateType)destype;
 
/**
 *  @brief 判断目标经纬度是否在大陆以及港、澳地区。
 *  @param coordinate 待判断的目标经纬度
 *  @param coortype 待判断经纬度的坐标系类型
 *  @return 是否在大陆以及港、澳地区
 */
+ (BOOL) BMKLocationDataAvailableForCoordinate:(CLLocationCoordinate2D)coordinate withCoorType:(BMKLocationCoordinateType)coortype;
 
 
@end
 
#pragma mark - BMKLocationManagerDelegate
 
 
///BMKLocationManagerDelegate 协议定义了发生错误时的错误回调方法,连续定位的回调方法等。
@protocol BMKLocationManagerDelegate <NSObject>
 
@optional
 
/**
 *  @brief 当定位发生错误时,会调用代理的此方法。
 *  @param manager 定位 BMKLocationManager 类。
 *  @param error 返回的错误,参考 CLError 。
 */
- (void)BMKLocationManager:(BMKLocationManager * _Nonnull)manager didFailWithError:(NSError * _Nullable)error;
 
 
/**
 *  @brief 连续定位回调函数。
 *  @param manager 定位 BMKLocationManager 类。
 *  @param location 定位结果,参考BMKLocation。
 *  @param error 错误信息。
 */
- (void)BMKLocationManager:(BMKLocationManager * _Nonnull)manager didUpdateLocation:(BMKLocation * _Nullable)location orError:(NSError * _Nullable)error;
 
/**
 *  @brief 定位权限状态改变时回调函数
 *  @param manager 定位 BMKLocationManager 类。
 *  @param status 定位权限状态。
 */
- (void)BMKLocationManager:(BMKLocationManager * _Nonnull)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;
 
 
/**
 * @brief 该方法为BMKLocationManager提示需要设备校正回调方法。
 * @param manager 提供该定位结果的BMKLocationManager类的实例。
 */
- (BOOL)BMKLocationManagerShouldDisplayHeadingCalibration:(BMKLocationManager * _Nonnull)manager;
 
/**
 * @brief 该方法为BMKLocationManager提供设备朝向的回调方法。
 * @param manager 提供该定位结果的BMKLocationManager类的实例
 * @param heading 设备的朝向结果
 */
- (void)BMKLocationManager:(BMKLocationManager * _Nonnull)manager
          didUpdateHeading:(CLHeading * _Nullable)heading;
 
/**
 * @brief 该方法为BMKLocationManager所在App系统网络状态改变的回调事件。
 * @param manager 提供该定位结果的BMKLocationManager类的实例
 * @param state 当前网络状态
 * @param error 错误信息
 */
- (void)BMKLocationManager:(BMKLocationManager * _Nonnull)manager
     didUpdateNetworkState:(BMKLocationNetworkState)state orError:(NSError * _Nullable)error;
 
 
@end