AMapLocationManager.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. //
  2. // AMapLocationManager.h
  3. // AMapLocationKit
  4. //
  5. // Created by AutoNavi on 15/10/22.
  6. // Copyright © 2015年 Amap. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import "AMapLocationCommonObj.h"
  10. #import "AMapLocationRegionObj.h"
  11. /**
  12. * @brief AMapLocatingCompletionBlock 单次定位返回Block
  13. * @param location 定位信息
  14. * @param regeocode 逆地理信息
  15. * @param error 错误信息,参考 AMapLocationErrorCode
  16. */
  17. typedef void (^AMapLocatingCompletionBlock)(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error);
  18. @protocol AMapLocationManagerDelegate;
  19. #pragma mark - AMapLocationManager
  20. ///AMapLocationManager类。初始化之前请设置 AMapServices 中的apikey(例如:[AMapServices sharedServices].apiKey = @"您的key"),否则将无法正常使用服务.
  21. @interface AMapLocationManager : NSObject
  22. ///实现了 AMapLocationManagerDelegate 协议的类指针。
  23. @property (nonatomic, weak) id<AMapLocationManagerDelegate> delegate;
  24. ///设定定位的最小更新距离。单位米,默认为 kCLDistanceFilterNone,表示只要检测到设备位置发生变化就会更新位置信息。
  25. @property(nonatomic, assign) CLLocationDistance distanceFilter;
  26. ///设定期望的定位精度。单位米,默认为 kCLLocationAccuracyBest。定位服务会尽可能去获取满足desiredAccuracy的定位结果,但不保证一定会得到满足期望的结果。
  27. ///注意:设置为kCLLocationAccuracyBest或kCLLocationAccuracyBestForNavigation时,单次定位会在达到locationTimeout设定的时间后,将时间内获取到的最高精度的定位结果返回。
  28. ///⚠️ 当iOS14及以上时,模糊定位权限下可能拿不到设置精度的经纬度
  29. @property(nonatomic, assign) CLLocationAccuracy desiredAccuracy;
  30. ///指定定位是否会被系统自动暂停。默认为NO。
  31. @property(nonatomic, assign) BOOL pausesLocationUpdatesAutomatically;
  32. ///是否允许后台定位。默认为NO。只在iOS 9.0及之后起作用。设置为YES的时候必须保证 Background Modes 中的 Location updates 处于选中状态,否则会抛出异常。由于iOS系统限制,需要在定位未开始之前或定位停止之后,修改该属性的值才会有效果。
  33. @property(nonatomic, assign) BOOL allowsBackgroundLocationUpdates;
  34. ///指定单次定位超时时间,默认为10s。最小值是2s。注意单次定位请求前设置。注意: 单次定位超时时间从确定了定位权限(非kCLAuthorizationStatusNotDetermined状态)后开始计算。
  35. @property(nonatomic, assign) NSInteger locationTimeout;
  36. ///指定单次定位逆地理超时时间,默认为5s。最小值是2s。注意单次定位请求前设置。
  37. @property(nonatomic, assign) NSInteger reGeocodeTimeout;
  38. ///连续定位是否返回逆地理信息,默认NO。
  39. @property (nonatomic, assign) BOOL locatingWithReGeocode;
  40. ///逆地址语言类型,默认是AMapLocationRegionLanguageDefault
  41. @property (nonatomic, assign) AMapLocationReGeocodeLanguage reGeocodeLanguage;
  42. ///获取被监控的region集合。
  43. @property (nonatomic, readonly, copy) NSSet *monitoredRegions;
  44. ///检测是否存在虚拟定位风险,默认为NO,不检测。 \n注意:设置为YES时,单次定位通过 AMapLocatingCompletionBlock 的error给出虚拟定位风险提示;连续定位通过 amapLocationManager:didFailWithError: 方法的error给出虚拟定位风险提示。error格式为 error.domain==AMapLocationErrorDomain; error.code==AMapLocationErrorRiskOfFakeLocation; \n附带的error的详细信息参考 error.localizedDescription 中的描述以及 error.userInfo 中的信息(error.userInfo.AMapLocationRiskyLocateResult 表示有虚拟风险的定位结果; error.userInfo.AMapLocationAccessoryInfo 表示外接辅助设备信息)。
  45. @property (nonatomic, assign) BOOL detectRiskOfFakeLocation;
  46. #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000
  47. /**
  48. * @brief 设置预期定位精度权限模式,默认为CLAccuracyAuthorizationFullAccuracy精确模式。
  49. 注意:如果定位时未获得定位权限,则首先会调用申请定位权限API,实际定位精度权限取决于用户的权限设置,当前定位精度权限可通过currentAuthorization获取;如果定位时已获得定位模糊权限,该属性设置CLAccuracyAuthorizationFullAccuracy,则会触发回调amapLocationManager:doRequireTemporaryFullAccuracyAuth:completion:,需在该回调中实现调用申请临时精确定位权限API,如果用户选择拒绝,则可以在completion回调中设置ignoreAuthMatch控制是否要继续开启模糊定位;如果定位时已获得精确定位权限,则可通过desiredAccuracy参数设定期望的定位精度;
  50. * @since 2.6.7
  51. */
  52. //@property (nonatomic, assign) CLAccuracyAuthorization desiredAccuracyMode API_AVAILABLE(ios(14.0));
  53. /**
  54. * @brief 设置定位数据回调精度模式,默认为AMapLocationAccuracyFullAndReduce。
  55. 注意:如果定位时未获得定位权限,则首先会调用申请定位权限API,实际定位精度权限取决于用户的权限设置。
  56. * ————————————————————————————————————————————————————————————————
  57. * | 设置选项 | doRequireTemporaryFullAccuracyAuth | 异常/定位数据回调 |
  58. * | AMapLocationFullAndReduceAccuracy | 会触发申请临时精确定位回调 | 如果未获得精确定位权限,则依然开启定位,回调模糊定位 |
  59. * | AMapLocationFullAccuracy | 会触发申请临时精确定位回调 | 如果未获得精确定位权限,则不开启定位,回调error |
  60. * | AMapLocationReduceAccuracy | 不会触发申请临时精确定位回调 | 根据当前定位精度权限,回调定位数据 |
  61. * ————————————————————————————————————————————————————————————————
  62. * 当设置AMapLocationFullAndReduceAccuracy时,定位数据回调可通过currentAuthorization判断当前是否是精确定位
  63. * @since 2.6.7
  64. */
  65. @property (nonatomic, assign) AMapLocationAccuracyMode locationAccuracyMode API_AVAILABLE(ios(14.0));
  66. /**
  67. * @brief 获取当前定位精度权限。注意:可能与setAccuracyAuthorizationMode设置不一致
  68. * @since 2.6.7
  69. */
  70. @property (nonatomic, readonly) CLAccuracyAuthorization currentAuthorization API_AVAILABLE(ios(14.0));
  71. #endif
  72. /**
  73. * @brief 设备是否支持方向识别
  74. * @return YES:设备支持方向识别 ; NO:设备不支持支持方向识别
  75. */
  76. + (BOOL)headingAvailable;
  77. /**
  78. * @brief 开始获取设备朝向,如果设备支持方向识别,则会通过代理回调方法
  79. */
  80. - (void)startUpdatingHeading;
  81. /**
  82. * @brief 停止获取设备朝向
  83. */
  84. - (void)stopUpdatingHeading;
  85. /**
  86. * @brief 停止设备朝向校准显示
  87. */
  88. - (void)dismissHeadingCalibrationDisplay;
  89. /**
  90. * @brief 单次定位。如果当前正在连续定位,调用此方法将会失败,返回NO。\n该方法将会根据设定的 desiredAccuracy 去获取定位信息。如果获取的定位信息精确度低于 desiredAccuracy ,将会持续的等待定位信息,直到超时后通过completionBlock返回精度最高的定位信息。\n可以通过 stopUpdatingLocation 方法去取消正在进行的单次定位请求。
  91. * @param withReGeocode 是否带有逆地理信息(获取逆地理信息需要联网)
  92. * @param completionBlock 单次定位完成后的Block
  93. * @return 是否成功添加单次定位Request
  94. */
  95. - (BOOL)requestLocationWithReGeocode:(BOOL)withReGeocode completionBlock:(AMapLocatingCompletionBlock)completionBlock;
  96. /**
  97. * @brief 开始连续定位。调用此方法会cancel掉所有的单次定位请求。
  98. */
  99. - (void)startUpdatingLocation;
  100. /**
  101. * @brief 停止连续定位。调用此方法会cancel掉所有的单次定位请求,可以用来取消单次定位。
  102. */
  103. - (void)stopUpdatingLocation;
  104. /**
  105. * @brief 开始监控指定的region。如果已经存在相同identifier的region,则之前的region将会被移除。对 AMapLocationCircleRegion 类实例,将会优先监控radius小的region。
  106. * @param region 要被监控的范围
  107. */
  108. - (void)startMonitoringForRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
  109. /**
  110. * @brief 停止监控指定的region
  111. * @param region 要停止监控的范围
  112. */
  113. - (void)stopMonitoringForRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
  114. /**
  115. * @brief 查询一个region的当前状态。查询结果通过amapLocationManager:didDetermineState:forRegion:回调返回
  116. * @param region 要查询的region
  117. */
  118. - (void)requestStateForRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
  119. @end
  120. #pragma mark - AMapLocationManagerDelegate
  121. ///AMapLocationManagerDelegate 协议定义了发生错误时的错误回调方法,连续定位的回调方法等。
  122. @protocol AMapLocationManagerDelegate <NSObject>
  123. @optional
  124. #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000
  125. /**
  126. * @brief 当plist配置NSLocationTemporaryUsageDescriptionDictionary且desiredAccuracyMode设置CLAccuracyAuthorizationFullAccuracy精确定位模式时,如果用户只授权模糊定位,会调用代理的此方法。此方法实现调用申请临时精确定位权限API即可:
  127. * [manager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:@"PurposeKey" completion:^(NSError *error){
  128. * if(completion){
  129. * completion(error);
  130. * }
  131. * }]; (必须调用,不然无法正常获取临时精确定位权限)
  132. * @param manager 定位 AMapLocationManager 类。
  133. * @param locationManager 需要申请临时精确定位权限的locationManager。
  134. * @param completion 临时精确定位权限API回调结果,error: 直接返回系统error即可。
  135. * @since 2.6.7
  136. */
  137. - (void)amapLocationManager:(AMapLocationManager *)manager doRequireTemporaryFullAccuracyAuth:(CLLocationManager*)locationManager completion:(void(^)(NSError *error))completion;
  138. #endif
  139. /**
  140. * @brief 当plist配置NSLocationAlwaysUsageDescription或者NSLocationAlwaysAndWhenInUseUsageDescription,并且[CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined,会调用代理的此方法。
  141. 此方法实现调用申请后台权限API即可:[locationManager requestAlwaysAuthorization] (必须调用,不然无法正常获取定位权限)
  142. * @param manager 定位 AMapLocationManager 类。
  143. * @param locationManager 需要申请后台定位权限的locationManager。
  144. * @since 2.6.2
  145. */
  146. - (void)amapLocationManager:(AMapLocationManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager;
  147. /**
  148. * @brief 当定位发生错误时,会调用代理的此方法。
  149. * @param manager 定位 AMapLocationManager 类。
  150. * @param error 返回的错误,参考 CLError 。
  151. */
  152. - (void)amapLocationManager:(AMapLocationManager *)manager didFailWithError:(NSError *)error;
  153. /**
  154. * @brief 连续定位回调函数.注意:本方法已被废弃,如果实现了amapLocationManager:didUpdateLocation:reGeocode:方法,则本方法将不会回调。
  155. * @param manager 定位 AMapLocationManager 类。
  156. * @param location 定位结果。
  157. */
  158. - (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location;
  159. /**
  160. * @brief 连续定位回调函数.注意:如果实现了本方法,则定位信息不会通过amapLocationManager:didUpdateLocation:方法回调。
  161. * @param manager 定位 AMapLocationManager 类。
  162. * @param location 定位结果。
  163. * @param reGeocode 逆地理信息。
  164. */
  165. - (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode;
  166. /**
  167. * @brief 定位权限状态改变时回调函数。注意:iOS13及之前版本回调
  168. * @param manager 定位 AMapLocationManager 类。
  169. * @param status 定位权限状态。
  170. */
  171. - (void)amapLocationManager:(AMapLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;
  172. /**
  173. * @brief 定位权限状态改变时回调函数。注意:iOS14及之后版本回调
  174. * @param manager 定位 AMapLocationManager 类。
  175. * @param locationManager 定位CLLocationManager类,可通过locationManager.authorizationStatus获取定位权限,通过locationManager.accuracyAuthorization获取定位精度权限
  176. */
  177. - (void)amapLocationManager:(AMapLocationManager *)manager locationManagerDidChangeAuthorization:(CLLocationManager*)locationManager;
  178. /**
  179. * @brief 是否显示设备朝向校准
  180. * @param manager 定位 AMapLocationManager 类。
  181. * @return 是否显示设备朝向校准
  182. */
  183. - (BOOL)amapLocationManagerShouldDisplayHeadingCalibration:(AMapLocationManager *)manager;
  184. /**
  185. * @brief 设备方向改变时回调函数
  186. * @param manager 定位 AMapLocationManager 类。
  187. * @param newHeading 设备朝向。
  188. */
  189. - (void)amapLocationManager:(AMapLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading;
  190. /**
  191. * @brief 开始监控region回调函数
  192. * @param manager 定位 AMapLocationManager 类。
  193. * @param region 开始监控的region。
  194. */
  195. - (void)amapLocationManager:(AMapLocationManager *)manager didStartMonitoringForRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
  196. /**
  197. * @brief 进入region回调函数
  198. * @param manager 定位 AMapLocationManager 类。
  199. * @param region 进入的region。
  200. */
  201. - (void)amapLocationManager:(AMapLocationManager *)manager didEnterRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
  202. /**
  203. * @brief 离开region回调函数
  204. * @param manager 定位 AMapLocationManager 类。
  205. * @param region 离开的region。
  206. */
  207. - (void)amapLocationManager:(AMapLocationManager *)manager didExitRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
  208. /**
  209. * @brief 查询region状态回调函数
  210. * @param manager 定位 AMapLocationManager 类。
  211. * @param state 查询的region的状态。
  212. * @param region 查询的region。
  213. */
  214. - (void)amapLocationManager:(AMapLocationManager *)manager didDetermineState:(AMapLocationRegionState)state forRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
  215. /**
  216. * @brief 监控region失败回调函数
  217. * @param manager 定位 AMapLocationManager 类。
  218. * @param region 失败的region。
  219. * @param error 错误信息,参考 AMapLocationErrorCode 。
  220. */
  221. - (void)amapLocationManager:(AMapLocationManager *)manager monitoringDidFailForRegion:(AMapLocationRegion *)region withError:(NSError *)error __attribute__((deprecated("请使用AMapGeoFenceManager")));
  222. @end