BMKLocationManager.h 9.8 KB

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