AMapGeoFenceManager.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. //
  2. // AMapGeoFenceManager.h
  3. // AMapLocationKit
  4. //
  5. // Created by hanxiaoming on 16/12/5.
  6. // Copyright © 2016年 Amap. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "AMapGeoFenceRegionObj.h"
  10. // 以下类涉及的坐标需要使用高德坐标系坐标(GCJ02)
  11. @protocol AMapGeoFenceManagerDelegate;
  12. ///地理围栏监听状态类型
  13. typedef NS_OPTIONS(NSUInteger, AMapGeoFenceActiveAction)
  14. {
  15. AMapGeoFenceActiveActionNone = 0, ///< 不进行监听
  16. AMapGeoFenceActiveActionInside = 1 << 0, ///< 在范围内
  17. AMapGeoFenceActiveActionOutside = 1 << 1, ///< 在范围外
  18. AMapGeoFenceActiveActionStayed = 1 << 2, ///< 停留(在范围内超过10分钟)
  19. };
  20. ///地理围栏任务状态类型
  21. typedef NS_OPTIONS(NSUInteger, AMapGeoFenceRegionActiveStatus)
  22. {
  23. AMapGeoFenceRegionActiveUNMonitor = 0, ///< 未注册
  24. AMapGeoFenceRegionActiveMonitoring = 1 << 0, ///< 正在监控
  25. AMapGeoFenceRegionActivePaused = 1 << 1, ///< 暂停监控
  26. };
  27. ///地理围栏管理类(since 2.3.0)
  28. @interface AMapGeoFenceManager : NSObject
  29. ///实现了 AMapGeoFenceManagerDelegate 协议的类指针。
  30. @property (nonatomic, weak) id<AMapGeoFenceManagerDelegate> delegate;
  31. ///需要进行通知的行为,默认为AMapGeoFenceActiveActionInside。
  32. @property (nonatomic, assign) AMapGeoFenceActiveAction activeAction;
  33. ///指定定位是否会被系统自动暂停。默认为NO。
  34. @property (nonatomic, assign) BOOL pausesLocationUpdatesAutomatically;
  35. ///是否允许后台定位。默认为NO。只在iOS 9.0及之后起作用。设置为YES的时候必须保证 Background Modes 中的 Location updates 处于选中状态,否则会抛出异常。
  36. @property (nonatomic, assign) BOOL allowsBackgroundLocationUpdates;
  37. ///检测是否存在虚拟定位风险,默认为NO,即不检测。 \n如果设置为YES,检测到风险后,会通过amapGeoFenceManager:didGeoFencesStatusChangedForRegion:customID:error: 的error给出风险提示,error的格式为error.domain==AMapGeoFenceErrorDomain; error.code==AMapGeoFenceErroFailureLocating;
  38. @property (nonatomic, assign) BOOL detectRiskOfFakeLocation;
  39. /**
  40. * @brief 添加一个圆形围栏
  41. * @param center 围栏的中心点经纬度坐标
  42. * @param radius 围栏的半径,单位:米,要求大于0
  43. * @param customID 用户自定义ID,可选,SDK原值返回
  44. */
  45. - (void)addCircleRegionForMonitoringWithCenter:(CLLocationCoordinate2D)center radius:(CLLocationDistance)radius customID:(NSString *)customID;
  46. /**
  47. * @brief 根据经纬度坐标数据添加一个闭合的多边形围栏,点与点之间按顺序尾部相连, 第一个点与最后一个点相连
  48. * @param coordinates 经纬度坐标点数据,coordinates对应的内存会拷贝,调用者负责该内存的释放
  49. * @param count 经纬度坐标点的个数,不可小于3个
  50. * @param customID 用户自定义ID,可选,SDK原值返回
  51. */
  52. - (void)addPolygonRegionForMonitoringWithCoordinates:(CLLocationCoordinate2D *)coordinates count:(NSInteger)count customID:(NSString *)customID;
  53. /**
  54. * @brief 根据要查询的关键字,类型,城市等信息,添加一个或者多个POI地理围栏
  55. * @param keyword 要查询的关键字,多个关键字用“|”分割,必填,keyword和type两者至少必选其一
  56. * @param type 要查询的POI类型,多个类型用“|”分割,必填,keyword和type两者至少必选其一,具体分类编码和规则详见: http://lbs.amap.com/api/webservice/guide/api/search/#text
  57. * @param city 要查询的城市
  58. * @param size 要查询的数据的条数,(0,25],传入<=0的值为10,传入大于25的值为25,默认10
  59. * @param customID 用户自定义ID,可选,SDK原值返回
  60. */
  61. - (void)addKeywordPOIRegionForMonitoringWithKeyword:(NSString *)keyword POIType:(NSString *)type city:(NSString *)city size:(NSInteger)size customID:(NSString *)customID;
  62. /**
  63. * @brief 根据要查询的点的经纬度,搜索半径等信息,添加一个或者多个POI围栏
  64. * @param locationPoint 点的经纬度坐标,必填
  65. * @param aroundRadius 查询半径,单位:米,(0,50000],超出范围取3000,默认3000
  66. * @param keyword 要查询的关键字,多个关键字用“|”分割,可选
  67. * @param type 要查询的POI类型,多个类型用“|”分割,可选
  68. * @param size 要查询的数据的条数,(0,25],传入<=0的值为10,传入大于25的值为25,默认10
  69. * @param customID 用户自定义ID,可选,SDK原值返回
  70. */
  71. - (void)addAroundPOIRegionForMonitoringWithLocationPoint:(CLLocationCoordinate2D)locationPoint aroundRadius:(NSInteger)aroundRadius keyword:(NSString *)keyword POIType:(NSString *)type size:(NSInteger)size customID:(NSString *)customID;
  72. /**
  73. * @brief 根据要查询的行政区域关键字,添加一个或者多个行政区域围栏
  74. * @param districtName 行政区域关键字,必填,只支持单个关键词语:行政区名称、citycode、adcode,规则详见: http://lbs.amap.com/api/webservice/guide/api/district/#district
  75. * @param customID 用户自定义ID,可选,SDK原值返回
  76. */
  77. - (void)addDistrictRegionForMonitoringWithDistrictName:(NSString *)districtName customID:(NSString *)customID;
  78. /**
  79. * @brief 获取指定围栏的运行状态
  80. * @param region 要获取运行状态的围栏
  81. * @return 返回指定围栏的运行状态
  82. */
  83. - (AMapGeoFenceRegionActiveStatus)statusWithGeoFenceRegion:(AMapGeoFenceRegion *)region;
  84. /**
  85. * @brief 根据customID获得所有已经注册的围栏,如果customID传nil,则返回全部已注册围栏
  86. * @param customID 用户执行添加围栏函数时传入的customID
  87. * @return 获得的围栏构成的数组,如果没有结果,返回nil
  88. */
  89. - (NSArray *)geoFenceRegionsWithCustomID:(NSString *)customID;
  90. /**
  91. * @brief 根据customID获得所有正在监控的围栏,如果customID传nil,则返回全部正在监控的围栏
  92. * @param customID 用户执行添加围栏函数时传入的customID
  93. * @return 获得的围栏构成的数组,如果没有结果,返回nil
  94. */
  95. - (NSArray *)monitoringGeoFenceRegionsWithCustomID:(NSString *)customID;
  96. /**
  97. * @brief 根据customID获得所有已经暂停的围栏,如果customID传nil,则返回全部已经暂停的围栏
  98. * @param customID 用户执行添加围栏函数时传入的customID
  99. * @return 获得的围栏构成的数组,如果没有结果,返回nil
  100. */
  101. - (NSArray *)pausedGeoFenceRegionsWithCustomID:(NSString *)customID;
  102. /**
  103. * @brief 暂停指定customID的围栏
  104. * @param customID 用户执行添加围栏函数时传入的customID
  105. * @return 返回被暂停围栏的数组,如果没有围栏被暂停,返回nil
  106. */
  107. - (NSArray *)pauseGeoFenceRegionsWithCustomID:(NSString *)customID;
  108. /**
  109. * @brief 暂停指定围栏
  110. * @param region 要暂停监控的围栏
  111. * @return 返回指定围栏是否被暂停,如果指定围栏没有注册,则返回NO
  112. */
  113. - (BOOL)pauseTheGeoFenceRegion:(AMapGeoFenceRegion *)region;
  114. /**
  115. * @brief 根据customID开始监控已经暂停的围栏
  116. * @param customID 用户执行添加围栏函数时传入的customID
  117. * @return 返回开始监控的围栏构成的数组
  118. */
  119. - (NSArray *)startGeoFenceRegionsWithCustomID:(NSString *)customID;
  120. /**
  121. * @brief 开始监控指定围栏
  122. * @param region 要开始监控的围栏
  123. * @return 返回指定围栏是否开始监控,如果指定围栏没有注册,则返回NO
  124. */
  125. - (BOOL)startTheGeoFenceRegion:(AMapGeoFenceRegion *)region;
  126. /**
  127. * @brief 移除指定围栏
  128. * @param region 要停止监控的围栏
  129. */
  130. - (void)removeTheGeoFenceRegion:(AMapGeoFenceRegion *)region;
  131. /**
  132. * @brief 移除指定customID的围栏
  133. * @param customID 用户执行添加围栏函数时传入的customID
  134. */
  135. - (void)removeGeoFenceRegionsWithCustomID:(NSString *)customID;
  136. /**
  137. * @brief 移除所有围栏
  138. */
  139. - (void)removeAllGeoFenceRegions;
  140. @end
  141. ///地理围栏代理协议(since 2.3.0),该协议定义了获取地理围栏相关回调方法,包括添加、状态改变等。
  142. @protocol AMapGeoFenceManagerDelegate <NSObject>
  143. @required
  144. #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000
  145. /**
  146. * @brief iOS14及以上版本使用地理围栏功能,需要在plist中配置NSLocationTemporaryUsageDescriptionDictionary字典描述,且添加自定义Key描述地理围栏的使用场景,此描述会在申请临时精确定位权限的弹窗中展示。该回调触发条件:拥有定位权限,但是没有获得精确定位权限的情况下,会触发该回调。此方法实现调用申请临时精确定位权限API即可:
  147. * [locationManager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:@"PurposeKey" completion:^(NSError *error){
  148. * if(completion){
  149. * completion(error);
  150. * }
  151. * }]; (必须调用,不然无法正常获取临时精确定位权限)
  152. * @param manager 地理围栏管理类。
  153. * @param locationManager 需要申请临时精确定位权限的locationManager。
  154. * @param completion 临时精确定位权限API回调结果。直接返回系统error即可
  155. * @since 2.6.7
  156. */
  157. - (void)amapLocationManager:(AMapGeoFenceManager *)manager doRequireTemporaryFullAccuracyAuth:(CLLocationManager*)locationManager completion:(void(^)(NSError *error))completion;
  158. #endif
  159. @optional
  160. /**
  161. * @brief 当plist配置NSLocationAlwaysUsageDescription或者NSLocationAlwaysAndWhenInUseUsageDescription,并且[CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined,会调用代理的此方法。
  162. 此方法实现申请后台权限API即可:[locationManager requestAlwaysAuthorization](必须调用,不然无法正常获取定位权限)
  163. * @param manager 地理围栏管理类。
  164. * @param locationManager 需要申请后台定位权限的locationManager。
  165. * @since 2.6.2
  166. */
  167. - (void)amapGeoFenceManager:(AMapGeoFenceManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager;
  168. /**
  169. * @brief 添加地理围栏完成后的回调,成功与失败都会调用
  170. * @param manager 地理围栏管理类
  171. * @param regions 成功添加的一个或多个地理围栏构成的数组
  172. * @param customID 用户执行添加围栏函数时传入的customID
  173. * @param error 添加失败的错误信息
  174. */
  175. - (void)amapGeoFenceManager:(AMapGeoFenceManager *)manager didAddRegionForMonitoringFinished:(NSArray <AMapGeoFenceRegion *> *)regions customID:(NSString *)customID error:(NSError *)error;
  176. /**
  177. * @brief 地理围栏状态改变时回调,当围栏状态的值发生改变,定位失败都会调用
  178. * @param manager 地理围栏管理类
  179. * @param region 状态改变的地理围栏
  180. * @param customID 用户执行添加围栏函数时传入的customID
  181. * @param error 错误信息,如定位相关的错误
  182. */
  183. - (void)amapGeoFenceManager:(AMapGeoFenceManager *)manager didGeoFencesStatusChangedForRegion:(AMapGeoFenceRegion *)region customID:(NSString *)customID error:(NSError *)error;
  184. @end