Add ScenicPermission module and AMap CocoaPods with simulator support.

Integrate scenic selection and permission flows into home routing, add AMap SDK for device builds while keeping arm64 simulators compilable via Podfile post_install hooks.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-23 10:15:26 +08:00
parent e8bc9b7f44
commit c5374666de
416 changed files with 18641 additions and 38 deletions

Binary file not shown.

View File

@ -0,0 +1,27 @@
//
// AMapGeoFenceError.h
// AMapLocationKit
//
// Created by eidan on 16/12/15.
// Copyright © 2016年 Amap. All rights reserved.
//
#ifndef AMapGeoFenceError_h
#define AMapGeoFenceError_h
///AMapGeoFence errorDomain
extern NSString * const AMapGeoFenceErrorDomain;
///地理围栏错误码
typedef NS_ENUM(NSInteger, AMapGeoFenceErrorCode) {
AMapGeoFenceErrorUnknown = 1, ///< 未知错误
AMapGeoFenceErrorInvalidParameter = 2, ///< 参数错误
AMapGeoFenceErrorFailureConnection = 3, ///< 网络连接异常
AMapGeoFenceErrorFailureAuth = 4, ///< 鉴权失败
AMapGeoFenceErrorNoValidFence = 5, ///< 无可用围栏
AMapGeoFenceErroFailureLocating = 6, ///< 定位错误
AMapGeoFenceErroFailureFullAccuracyLocating = 7, ///< 精确定位错误
};
#endif /* AMapGeoFenceError_h */

View File

@ -0,0 +1,234 @@
//
// AMapGeoFenceManager.h
// AMapLocationKit
//
// Created by hanxiaoming on 16/12/5.
// Copyright © 2016年 Amap. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "AMapGeoFenceRegionObj.h"
// 以下类涉及的坐标需要使用高德坐标系坐标(GCJ02)
@protocol AMapGeoFenceManagerDelegate;
///地理围栏监听状态类型
typedef NS_OPTIONS(NSUInteger, AMapGeoFenceActiveAction)
{
AMapGeoFenceActiveActionNone = 0, ///< 不进行监听
AMapGeoFenceActiveActionInside = 1 << 0, ///< 在范围内
AMapGeoFenceActiveActionOutside = 1 << 1, ///< 在范围外
AMapGeoFenceActiveActionStayed = 1 << 2, ///< 停留(在范围内超过10分钟)
};
///地理围栏任务状态类型
typedef NS_OPTIONS(NSUInteger, AMapGeoFenceRegionActiveStatus)
{
AMapGeoFenceRegionActiveUNMonitor = 0, ///< 未注册
AMapGeoFenceRegionActiveMonitoring = 1 << 0, ///< 正在监控
AMapGeoFenceRegionActivePaused = 1 << 1, ///< 暂停监控
};
///地理围栏管理类since 2.3.0
@interface AMapGeoFenceManager : NSObject
///实现了 AMapGeoFenceManagerDelegate 协议的类指针。
@property (nonatomic, weak) id<AMapGeoFenceManagerDelegate> delegate;
///需要进行通知的行为默认为AMapGeoFenceActiveActionInside。
@property (nonatomic, assign) AMapGeoFenceActiveAction activeAction;
///指定定位是否会被系统自动暂停。默认为NO。
@property (nonatomic, assign) BOOL pausesLocationUpdatesAutomatically;
///是否允许后台定位。默认为NO。只在iOS 9.0及之后起作用。设置为YES的时候必须保证 Background Modes 中的 Location updates 处于选中状态,否则会抛出异常。
@property (nonatomic, assign) BOOL allowsBackgroundLocationUpdates;
///检测是否存在虚拟定位风险默认为NO即不检测。 \n如果设置为YES检测到风险后会通过amapGeoFenceManager:didGeoFencesStatusChangedForRegion:customID:error: 的error给出风险提示error的格式为error.domain==AMapGeoFenceErrorDomain; error.code==AMapGeoFenceErroFailureLocating;
@property (nonatomic, assign) BOOL detectRiskOfFakeLocation;
/**
* @brief 添加一个圆形围栏
* @param center 围栏的中心点经纬度坐标
* @param radius 围栏的半径单位要求大于0
* @param customID 用户自定义ID可选SDK原值返回
*/
- (void)addCircleRegionForMonitoringWithCenter:(CLLocationCoordinate2D)center radius:(CLLocationDistance)radius customID:(NSString *)customID;
/**
* @brief 根据经纬度坐标数据添加一个闭合的多边形围栏,点与点之间按顺序尾部相连, 第一个点与最后一个点相连
* @param coordinates 经纬度坐标点数据,coordinates对应的内存会拷贝,调用者负责该内存的释放
* @param count 经纬度坐标点的个数不可小于3个
* @param customID 用户自定义ID可选SDK原值返回
*/
- (void)addPolygonRegionForMonitoringWithCoordinates:(CLLocationCoordinate2D *)coordinates count:(NSInteger)count customID:(NSString *)customID;
/**
* @brief 根据要查询的关键字类型城市等信息添加一个或者多个POI地理围栏
* @param keyword 要查询的关键字,多个关键字用“|”分割必填keyword和type两者至少必选其一
* @param type 要查询的POI类型多个类型用“|”分割必填keyword和type两者至少必选其一具体分类编码和规则详见 http://lbs.amap.com/api/webservice/guide/api/search/#text
* @param city 要查询的城市
* @param size 要查询的数据的条数,(0,25],传入<=0的值为10传入大于25的值为25默认10
* @param customID 用户自定义ID可选SDK原值返回
*/
- (void)addKeywordPOIRegionForMonitoringWithKeyword:(NSString *)keyword POIType:(NSString *)type city:(NSString *)city size:(NSInteger)size customID:(NSString *)customID;
/**
* @brief 根据要查询的点的经纬度搜索半径等信息添加一个或者多个POI围栏
* @param locationPoint 点的经纬度坐标,必填
* @param aroundRadius 查询半径,单位:米,(0,50000]超出范围取3000默认3000
* @param keyword 要查询的关键字,多个关键字用“|”分割,可选
* @param type 要查询的POI类型多个类型用“|”分割,可选
* @param size 要查询的数据的条数,(0,25],传入<=0的值为10传入大于25的值为25默认10
* @param customID 用户自定义ID可选SDK原值返回
*/
- (void)addAroundPOIRegionForMonitoringWithLocationPoint:(CLLocationCoordinate2D)locationPoint aroundRadius:(NSInteger)aroundRadius keyword:(NSString *)keyword POIType:(NSString *)type size:(NSInteger)size customID:(NSString *)customID;
/**
* @brief 根据要查询的行政区域关键字,添加一个或者多个行政区域围栏
* @param districtName 行政区域关键字必填只支持单个关键词语行政区名称、citycode、adcode规则详见 http://lbs.amap.com/api/webservice/guide/api/district/#district
* @param customID 用户自定义ID可选SDK原值返回
*/
- (void)addDistrictRegionForMonitoringWithDistrictName:(NSString *)districtName customID:(NSString *)customID;
/**
* @brief 获取指定围栏的运行状态
* @param region 要获取运行状态的围栏
* @return 返回指定围栏的运行状态
*/
- (AMapGeoFenceRegionActiveStatus)statusWithGeoFenceRegion:(AMapGeoFenceRegion *)region;
/**
* @brief 根据customID获得所有已经注册的围栏如果customID传nil则返回全部已注册围栏
* @param customID 用户执行添加围栏函数时传入的customID
* @return 获得的围栏构成的数组如果没有结果返回nil
*/
- (NSArray *)geoFenceRegionsWithCustomID:(NSString *)customID;
/**
* @brief 根据customID获得所有正在监控的围栏如果customID传nil则返回全部正在监控的围栏
* @param customID 用户执行添加围栏函数时传入的customID
* @return 获得的围栏构成的数组如果没有结果返回nil
*/
- (NSArray *)monitoringGeoFenceRegionsWithCustomID:(NSString *)customID;
/**
* @brief 根据customID获得所有已经暂停的围栏如果customID传nil则返回全部已经暂停的围栏
* @param customID 用户执行添加围栏函数时传入的customID
* @return 获得的围栏构成的数组如果没有结果返回nil
*/
- (NSArray *)pausedGeoFenceRegionsWithCustomID:(NSString *)customID;
/**
* @brief 暂停指定customID的围栏
* @param customID 用户执行添加围栏函数时传入的customID
* @return 返回被暂停围栏的数组如果没有围栏被暂停返回nil
*/
- (NSArray *)pauseGeoFenceRegionsWithCustomID:(NSString *)customID;
/**
* @brief 暂停指定围栏
* @param region 要暂停监控的围栏
* @return 返回指定围栏是否被暂停如果指定围栏没有注册则返回NO
*/
- (BOOL)pauseTheGeoFenceRegion:(AMapGeoFenceRegion *)region;
/**
* @brief 根据customID开始监控已经暂停的围栏
* @param customID 用户执行添加围栏函数时传入的customID
* @return 返回开始监控的围栏构成的数组
*/
- (NSArray *)startGeoFenceRegionsWithCustomID:(NSString *)customID;
/**
* @brief 开始监控指定围栏
* @param region 要开始监控的围栏
* @return 返回指定围栏是否开始监控如果指定围栏没有注册则返回NO
*/
- (BOOL)startTheGeoFenceRegion:(AMapGeoFenceRegion *)region;
/**
* @brief 移除指定围栏
* @param region 要停止监控的围栏
*/
- (void)removeTheGeoFenceRegion:(AMapGeoFenceRegion *)region;
/**
* @brief 移除指定customID的围栏
* @param customID 用户执行添加围栏函数时传入的customID
*/
- (void)removeGeoFenceRegionsWithCustomID:(NSString *)customID;
/**
* @brief 移除所有围栏
*/
- (void)removeAllGeoFenceRegions;
@end
///地理围栏代理协议since 2.3.0,该协议定义了获取地理围栏相关回调方法,包括添加、状态改变等。
@protocol AMapGeoFenceManagerDelegate <NSObject>
@required
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000
/**
* @brief iOS14及以上版本使用地理围栏功能需要在plist中配置NSLocationTemporaryUsageDescriptionDictionary字典描述且添加自定义Key描述地理围栏的使用场景此描述会在申请临时精确定位权限的弹窗中展示。该回调触发条件拥有定位权限但是没有获得精确定位权限的情况下会触发该回调。此方法实现调用申请临时精确定位权限API即可
* [locationManager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:@"PurposeKey" completion:^(NSError *error){
* if(completion){
* completion(error);
* }
* }]; (必须调用,不然无法正常获取临时精确定位权限)
* @param manager 地理围栏管理类。
* @param locationManager 需要申请临时精确定位权限的locationManager。
* @param completion 临时精确定位权限API回调结果。直接返回系统error即可
* @since 2.6.7
*/
- (void)amapLocationManager:(AMapGeoFenceManager *)manager doRequireTemporaryFullAccuracyAuth:(CLLocationManager*)locationManager completion:(void(^)(NSError *error))completion;
#endif
@optional
/**
* @brief 当plist配置NSLocationAlwaysUsageDescription或者NSLocationAlwaysAndWhenInUseUsageDescription并且[CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined会调用代理的此方法。
此方法实现申请后台权限API即可[locationManager requestAlwaysAuthorization](必须调用,不然无法正常获取定位权限)
* @param manager 地理围栏管理类。
* @param locationManager 需要申请后台定位权限的locationManager。
* @since 2.6.2
*/
- (void)amapGeoFenceManager:(AMapGeoFenceManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager;
/**
* @brief 添加地理围栏完成后的回调,成功与失败都会调用
* @param manager 地理围栏管理类
* @param regions 成功添加的一个或多个地理围栏构成的数组
* @param customID 用户执行添加围栏函数时传入的customID
* @param error 添加失败的错误信息
*/
- (void)amapGeoFenceManager:(AMapGeoFenceManager *)manager didAddRegionForMonitoringFinished:(NSArray <AMapGeoFenceRegion *> *)regions customID:(NSString *)customID error:(NSError *)error;
/**
* @brief 地理围栏状态改变时回调,当围栏状态的值发生改变,定位失败都会调用
* @param manager 地理围栏管理类
* @param region 状态改变的地理围栏
* @param customID 用户执行添加围栏函数时传入的customID
* @param error 错误信息,如定位相关的错误
*/
- (void)amapGeoFenceManager:(AMapGeoFenceManager *)manager didGeoFencesStatusChangedForRegion:(AMapGeoFenceRegion *)region customID:(NSString *)customID error:(NSError *)error;
@end

View File

@ -0,0 +1,120 @@
//
// AMapGeoFenceRegionObj.h
// AMapLocationKit
//
// Created by hanxiaoming on 16/12/5.
// Copyright © 2016年 Amap. All rights reserved.
//
#import "AMapLocationCommonObj.h"
///AMapGeoFence Region State
typedef NS_ENUM(NSInteger, AMapGeoFenceRegionStatus)
{
AMapGeoFenceRegionStatusUnknown = 0, ///< 未知
AMapGeoFenceRegionStatusInside = 1, ///< 在范围内
AMapGeoFenceRegionStatusOutside = 2, ///< 在范围外
AMapGeoFenceRegionStatusStayed = 3, ///< 停留(在范围内超过10分钟)
};
typedef NS_ENUM(NSInteger, AMapGeoFenceRegionType)
{
AMapGeoFenceRegionTypeCircle = 0, /// 圆形地理围栏
AMapGeoFenceRegionTypePolygon = 1, /// 多边形地理围栏
AMapGeoFenceRegionTypePOI = 2, /// 兴趣点POI地理围栏
AMapGeoFenceRegionTypeDistrict = 3, /// 行政区划地理围栏
};
#pragma mark - AMapGeoFenceRegion
///地理围栏基类不可直接使用。since 2.3.0
@interface AMapGeoFenceRegion : NSObject<NSCopying>
///AMapGeoFenceRegion的唯一标识符
@property (nonatomic, copy, readonly) NSString *identifier;
///用户自定义ID可为nil。
@property (nonatomic, copy, readonly) NSString *customID;
///坐标点和围栏的关系,比如用户的位置和围栏的关系
@property (nonatomic, assign) AMapGeoFenceRegionStatus fenceStatus;
///用户自定义ID可为nil。
@property (nonatomic, assign) AMapGeoFenceRegionType regionType;
///缓存最近获取的定位信息可能会存在延时可为nil会在获取定位时更新
@property (nonatomic, copy) CLLocation *currentLocation;
@end
#pragma mark - AMapLocationCircleRegion
///圆形地理围栏since 2.3.0
@interface AMapGeoFenceCircleRegion : AMapGeoFenceRegion
///中心点的经纬度坐标
@property (nonatomic, readonly) CLLocationCoordinate2D center;
///半径,单位:米
@property (nonatomic, readonly) CLLocationDistance radius;
@end
#pragma mark -AMapGeoFencePolygonRegion
///多边形地理围栏since 2.3.0
@interface AMapGeoFencePolygonRegion : AMapGeoFenceRegion
///经纬度坐标点数据
@property (nonatomic, readonly) CLLocationCoordinate2D *coordinates;
///经纬度坐标点的个数
@property (nonatomic, readonly) NSInteger count;
@end
#pragma mark -AMapGeoFencePOIRegion
///兴趣点POI地理围栏since 2.3.0
@interface AMapGeoFencePOIRegion : AMapGeoFenceCircleRegion
///POI信息
@property (nonatomic, strong, readonly) AMapLocationPOIItem *POIItem;
@end
#pragma mark -AMapGeoFenceDistrictRegion
///行政区划地理围栏since 2.3.0
@interface AMapGeoFenceDistrictRegion : AMapGeoFenceRegion
///行政区域信息
@property (nonatomic, strong, readonly) AMapLocationDistrictItem *districtItem;
///行政区域轮廓坐标点,每个行政区可能有多个模块,每个模块的坐标点数组由AMapLocationPoint构成
@property (nonatomic, copy, readonly) NSArray <NSArray<AMapLocationPoint *> *> *polylinePoints;
@end

View File

@ -0,0 +1,195 @@
//
// AMapLocationCommonObj.h
// AMapLocationKit
//
// Created by AutoNavi on 15/10/22.
// Copyright © 2015年 Amap. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import <UIKit/UIKit.h>
///AMapLocation errorDomain
extern NSString * const AMapLocationErrorDomain;
///AMapLocation errorCode
typedef NS_ENUM(NSInteger, AMapLocationErrorCode)
{
AMapLocationErrorUnknown = 1, ///<未知错误
AMapLocationErrorLocateFailed = 2, ///<定位错误
AMapLocationErrorReGeocodeFailed = 3, ///<逆地理错误
AMapLocationErrorTimeOut = 4, ///<超时
AMapLocationErrorCanceled = 5, ///<取消
AMapLocationErrorCannotFindHost = 6, ///<找不到主机
AMapLocationErrorBadURL = 7, ///<URL异常
AMapLocationErrorNotConnectedToInternet = 8,///<连接异常
AMapLocationErrorCannotConnectToHost = 9, ///<服务器连接失败
AMapLocationErrorRegionMonitoringFailure=10,///<地理围栏错误
AMapLocationErrorRiskOfFakeLocation = 11, ///<存在虚拟定位风险
AMapLocationErrorNoFullAccuracyAuth = 12, ///<精确定位权限异常
};
///AMapLocation Region State
typedef NS_ENUM(NSInteger, AMapLocationRegionState)
{
AMapLocationRegionStateUnknow = 0, ///<未知
AMapLocationRegionStateInside = 1, ///<在范围内
AMapLocationRegionStateOutside = 2, ///<在范围外
};
///AMapLocation Accuracy Mode
typedef NS_ENUM(NSInteger, AMapLocationAccuracyMode) {
AMapLocationFullAndReduceAccuracy = 0, ///<默认模式,该模式下会申请临时精确定位权限,如果用户拒绝,则依然开启定位,回调模糊定位数据;
AMapLocationFullAccuracy, ///<高精度模式该模式下会申请临时精确定位权限如果用户拒绝则回调error
AMapLocationReduceAccuracy ///<低精度模式,该模式下不会申请临时精确定位权限,根据当前定位权限回调定位数据;
};
///逆地理信息
@interface AMapLocationReGeocode : NSObject<NSCopying,NSCoding>
///格式化地址
@property (nonatomic, copy) NSString *formattedAddress;
///国家
@property (nonatomic, copy) NSString *country;
///省/直辖市
@property (nonatomic, copy) NSString *province;
///市
@property (nonatomic, copy) NSString *city;
///区
@property (nonatomic, copy) NSString *district;
///乡镇
@property (nonatomic, copy) NSString *township __attribute__((deprecated("该字段从v2.2.0版本起不再返回数据,建议您使用AMapSearchKit的逆地理功能获取.")));
///社区
@property (nonatomic, copy) NSString *neighborhood __attribute__((deprecated("该字段从v2.2.0版本起不再返回数据,建议您使用AMapSearchKit的逆地理功能获取.")));
///建筑
@property (nonatomic, copy) NSString *building __attribute__((deprecated("该字段从v2.2.0版本起不再返回数据,建议您使用AMapSearchKit的逆地理功能获取.")));
///城市编码
@property (nonatomic, copy) NSString *citycode;
///区域编码
@property (nonatomic, copy) NSString *adcode;
///街道名称
@property (nonatomic, copy) NSString *street;
///门牌号
@property (nonatomic, copy) NSString *number;
///兴趣点名称
@property (nonatomic, copy) NSString *POIName;
///所属兴趣点名称
@property (nonatomic, copy) NSString *AOIName;
@end
#pragma mark - AMapLocationPoint
///经纬度坐标点对象
@interface AMapLocationPoint : NSObject<NSCopying,NSCoding>
///纬度
@property (nonatomic, assign) CGFloat latitude;
///经度
@property (nonatomic, assign) CGFloat longitude;
/**
* @brief AMapNaviPoint类对象的初始化函数
* @param lat 纬度
* @param lon 经度
* @return AMapNaviPoint类对象id
*/
+ (AMapLocationPoint *)locationWithLatitude:(CGFloat)lat longitude:(CGFloat)lon;
@end
///POI信息
@interface AMapLocationPOIItem : NSObject <NSCopying, NSCoding>
///id
@property (nonatomic, copy) NSString *pId;
///名称
@property (nonatomic, copy) NSString *name;
///类型
@property (nonatomic, copy) NSString *type;
///类型编码
@property (nonatomic, copy) NSString *typeCode;
///地址信息
@property (nonatomic, copy) NSString *address;
///经纬度
@property (nonatomic, strong) AMapLocationPoint *location;
///电话号码
@property (nonatomic, copy) NSString *tel;
///省份
@property (nonatomic, copy) NSString *province;
///城市
@property (nonatomic, copy) NSString *city;
///区
@property (nonatomic, copy) NSString *district;
@end
///行政区域信息
@interface AMapLocationDistrictItem : NSObject <NSCopying, NSCoding>
///城市编码
@property (nonatomic, copy) NSString *cityCode;
///区域编码
@property (nonatomic, copy) NSString *districtCode;
///区名
@property (nonatomic, copy) NSString *district;
///行政区域轮廓坐标点,每个行政区可能有多个模块,每个模块的坐标点数组由AMapLocationPoint构成
@property (nonatomic, copy) NSArray <NSArray<AMapLocationPoint *> *> *polylinePoints;
@end
///AMapLocation CoordinateType
typedef NS_ENUM(NSUInteger, AMapLocationCoordinateType)
{
AMapLocationCoordinateTypeBaidu = 0, ///<Baidu
AMapLocationCoordinateTypeMapBar, ///<MapBar
AMapLocationCoordinateTypeMapABC, ///<MapABC
AMapLocationCoordinateTypeSoSoMap, ///<SoSoMap
AMapLocationCoordinateTypeAliYun, ///<AliYun
AMapLocationCoordinateTypeGoogle, ///<Google
AMapLocationCoordinateTypeGPS, ///<GPS
};
/**
* @brief 转换目标经纬度为高德坐标系
* @param coordinate 待转换的经纬度
* @param type 坐标系类型
* @return 高德坐标系经纬度
*/
FOUNDATION_EXTERN CLLocationCoordinate2D AMapLocationCoordinateConvert(CLLocationCoordinate2D coordinate, AMapLocationCoordinateType type);
/**
* @brief 判断目标经纬度是否在大陆以及港、澳地区。输入参数为高德坐标系。
* @param coordinate 待判断的目标经纬度
* @return 是否在大陆以及港、澳地区
*/
FOUNDATION_EXTERN BOOL AMapLocationDataAvailableForCoordinate(CLLocationCoordinate2D coordinate);

View File

@ -0,0 +1,17 @@
//
// AMapLocationKit.h
// AMapLocationKit
//
// Created by AutoNavi on 15/10/22.
// Copyright © 2015年 Amap. All rights reserved.
//
#import <AMapLocationKit/AMapLocationVersion.h>
#import <AMapLocationKit/AMapLocationManager.h>
#import <AMapLocationKit/AMapLocationCommonObj.h>
#import <AMapLocationKit/AMapLocationRegionObj.h>
#import <AMapLocationKit/AMapGeoFenceRegionObj.h>
#import <AMapLocationKit/AMapGeoFenceManager.h>
#import <AMapLocationKit/AMapGeoFenceError.h>

View File

@ -0,0 +1,283 @@
//
// AMapLocationManager.h
// AMapLocationKit
//
// Created by AutoNavi on 15/10/22.
// Copyright © 2015年 Amap. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <AMapFoundationKit/AMapServices.h>
#import "AMapLocationCommonObj.h"
#import "AMapLocationRegionObj.h"
#import <AMapFoundationKit/AMapServices.h>
/**
* @brief AMapLocatingCompletionBlock 单次定位返回Block
* @param location 定位信息
* @param regeocode 逆地理信息
* @param error 错误信息,参考 AMapLocationErrorCode
*/
typedef void (^AMapLocatingCompletionBlock)(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error);
@protocol AMapLocationManagerDelegate;
#pragma mark - AMapLocationManager
///AMapLocationManager类。初始化之前请设置 AMapServices 中的apikey(例如:[AMapServices sharedServices].apiKey = @"您的key"),否则将无法正常使用服务.
@interface AMapLocationManager : NSObject
///实现了 AMapLocationManagerDelegate 协议的类指针。
@property (nonatomic, weak) id<AMapLocationManagerDelegate> delegate;
///设定定位的最小更新距离。单位米,默认为 kCLDistanceFilterNone表示只要检测到设备位置发生变化就会更新位置信息。
@property(nonatomic, assign) CLLocationDistance distanceFilter;
///设定期望的定位精度。单位米,默认为 kCLLocationAccuracyBest。定位服务会尽可能去获取满足desiredAccuracy的定位结果但不保证一定会得到满足期望的结果。
///注意设置为kCLLocationAccuracyBest或kCLLocationAccuracyBestForNavigation时单次定位会在达到locationTimeout设定的时间后将时间内获取到的最高精度的定位结果返回。
///⚠️ 当iOS14及以上版本模糊定位权限下可能拿不到设置精度的经纬度
@property(nonatomic, assign) CLLocationAccuracy desiredAccuracy;
///指定定位是否会被系统自动暂停。默认为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;
///指定单次定位逆地理超时时间,默认为5s。最小值是2s。注意单次定位请求前设置。
@property(nonatomic, assign) NSInteger reGeocodeTimeout;
///连续定位是否返回逆地理信息默认NO。
@property (nonatomic, assign) BOOL locatingWithReGeocode;
///逆地址语言类型默认是AMapRegionLanguageTypeZhHans
@property (nonatomic, assign) AMapRegionLanguageType reGeocodeLanguage;
///获取被监控的region集合。
@property (nonatomic, readonly, copy) NSSet *monitoredRegions;
///检测是否存在虚拟定位风险默认为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 表示外接辅助设备信息)。
@property (nonatomic, assign) BOOL detectRiskOfFakeLocation;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000
/**
* @brief 设置定位数据回调精度模式默认为AMapLocationAccuracyFullAndReduce。\n
注意如果定位时未获得定位权限则首先会调用申请定位权限API实际定位精度权限取决于用户的权限设置。\n
* ————————————————————————————————————————————————————————————————\n
* | 设置选项 | doRequireTemporaryFullAccuracyAuth | 异常/定位数据回调 |\n
* | AMapLocationFullAndReduceAccuracy | 会触发申请临时精确定位回调 | 如果未获得精确定位权限,则依然开启定位,回调模糊定位 |\n
* | AMapLocationFullAccuracy | 会触发申请临时精确定位回调 | 如果未获得精确定位权限则不开启定位回调error |\n
* | AMapLocationReduceAccuracy | 不会触发申请临时精确定位回调 | 根据当前定位精度权限,回调定位数据 |\n
* ————————————————————————————————————————————————————————————————\n
* 当设置AMapLocationFullAndReduceAccuracy时定位数据回调可通过currentAuthorization判断当前是否是精确定位
* @since 2.6.7
*/
@property (nonatomic, assign) AMapLocationAccuracyMode locationAccuracyMode API_AVAILABLE(ios(14.0));
/**
* @brief 获取当前定位精度权限。
* @since 2.6.7
*/
@property (nonatomic, readonly) CLAccuracyAuthorization currentAuthorization API_AVAILABLE(ios(14.0));
#endif
/**
* @brief 设备是否支持方向识别
* @return YES:设备支持方向识别 ; NO:设备不支持支持方向识别
*/
+ (BOOL)headingAvailable;
/**
* @brief 开始获取设备朝向,如果设备支持方向识别,则会通过代理回调方法
*/
- (void)startUpdatingHeading;
/**
* @brief 停止获取设备朝向
*/
- (void)stopUpdatingHeading;
/**
* @brief 停止设备朝向校准显示
*/
- (void)dismissHeadingCalibrationDisplay;
/**
* @brief 单次定位。如果当前正在连续定位调用此方法将会失败返回NO。\n该方法将会根据设定的 desiredAccuracy 去获取定位信息。如果获取的定位信息精确度低于 desiredAccuracy 将会持续的等待定位信息直到超时后通过completionBlock返回精度最高的定位信息。\n可以通过 stopUpdatingLocation 方法去取消正在进行的单次定位请求。
* @param withReGeocode 是否带有逆地理信息(获取逆地理信息需要联网)
* @param completionBlock 单次定位完成后的Block
* @return 是否成功添加单次定位Request
*/
- (BOOL)requestLocationWithReGeocode:(BOOL)withReGeocode completionBlock:(AMapLocatingCompletionBlock)completionBlock;
/**
* @brief 开始连续定位。调用此方法会cancel掉所有的单次定位请求。
*/
- (void)startUpdatingLocation;
/**
* @brief 停止连续定位。调用此方法会cancel掉所有的单次定位请求可以用来取消单次定位。
*/
- (void)stopUpdatingLocation;
/**
* @brief 开始监控指定的region。如果已经存在相同identifier的region则之前的region将会被移除。对 AMapLocationCircleRegion 类实例将会优先监控radius小的region。
* @param region 要被监控的范围
*/
- (void)startMonitoringForRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
/**
* @brief 停止监控指定的region
* @param region 要停止监控的范围
*/
- (void)stopMonitoringForRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
/**
* @brief 查询一个region的当前状态。查询结果通过amapLocationManager:didDetermineState:forRegion:回调返回
* @param region 要查询的region
*/
- (void)requestStateForRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
#pragma mark - Privacy 隐私合规
/**
* @brief 更新App是否显示隐私弹窗的状态隐私弹窗是否包含高德SDK隐私协议内容的状态注意必须在AMapLocationManager实例化之前调用. since 2.8.0
* @param showStatus 隐私弹窗状态
* @param containStatus 包含高德SDK隐私协议状态
*/
+ (void)updatePrivacyShow:(AMapPrivacyShowStatus)showStatus privacyInfo:(AMapPrivacyInfoStatus)containStatus;
/**
* @brief 更新用户授权高德SDK隐私协议状态注意必须在AMapLocationManager实例化之前调用. since 2.8.0
* @param agreeStatus 用户授权高德SDK隐私协议状态
*/
+ (void)updatePrivacyAgree:(AMapPrivacyAgreeStatus)agreeStatus;
@end
#pragma mark - AMapLocationManagerDelegate
///AMapLocationManagerDelegate 协议定义了发生错误时的错误回调方法,连续定位的回调方法等。
@protocol AMapLocationManagerDelegate <NSObject>
@optional
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000
/**
* @brief 触发前提条件1、plist配置NSLocationTemporaryUsageDescriptionDictionary。2、locationAccuracyMode设置为AMapLocationFullAndReduceAccuracy/AMapLocationFullAccuracy。3、当前用户已授权过定位权限且为模糊定位权限。触发时机满足前提条件时再次发起定位请求会调用代理的此方法。此方法实现调用申请临时精确定位权限API即可
* [manager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:@"PurposeKey" completion:^(NSError *error){
* if(completion){
* completion(error);
* }
* }]; (必须调用,不然无法正常获取临时精确定位权限)
* @param manager 定位 AMapLocationManager 类。
* @param locationManager 需要申请临时精确定位权限的locationManager。
* @param completion 临时精确定位权限API回调结果error: 直接返回系统error即可。
* @since 2.6.7
*/
- (void)amapLocationManager:(AMapLocationManager *)manager doRequireTemporaryFullAccuracyAuth:(CLLocationManager*)locationManager completion:(void(^)(NSError *error))completion;
#endif
/**
* @brief 当plist配置NSLocationAlwaysUsageDescription或者NSLocationAlwaysAndWhenInUseUsageDescription并且[CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined会调用代理的此方法。
此方法实现调用申请后台权限API即可[locationManager requestAlwaysAuthorization] (必须调用,不然无法正常获取定位权限)
* @param manager 定位 AMapLocationManager 类。
* @param locationManager 需要申请后台定位权限的locationManager。
* @since 2.6.2
*/
- (void)amapLocationManager:(AMapLocationManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager;
/**
* @brief 当定位发生错误时,会调用代理的此方法。
* @param manager 定位 AMapLocationManager 类。
* @param error 返回的错误,参考 CLError 。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didFailWithError:(NSError *)error;
/**
* @brief 连续定位回调函数.注意本方法已被废弃如果实现了amapLocationManager:didUpdateLocation:reGeocode:方法,则本方法将不会回调。
* @param manager 定位 AMapLocationManager 类。
* @param location 定位结果。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location;
/**
* @brief 连续定位回调函数.注意如果实现了本方法则定位信息不会通过amapLocationManager:didUpdateLocation:方法回调。
* @param manager 定位 AMapLocationManager 类。
* @param location 定位结果。
* @param reGeocode 逆地理信息。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode;
/**
* @brief 定位权限状态改变时回调函数。注意iOS13及之前版本回调
* @param manager 定位 AMapLocationManager 类。
* @param status 定位权限状态。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;
/**
* @brief 定位权限状态改变时回调函数。注意iOS14及之后版本回调
* @param manager 定位 AMapLocationManager 类。
* @param locationManager 定位CLLocationManager类可通过locationManager.authorizationStatus获取定位权限通过locationManager.accuracyAuthorization获取定位精度权限
*/
- (void)amapLocationManager:(AMapLocationManager *)manager locationManagerDidChangeAuthorization:(CLLocationManager*)locationManager;
/**
* @brief 是否显示设备朝向校准
* @param manager 定位 AMapLocationManager 类。
* @return 是否显示设备朝向校准
*/
- (BOOL)amapLocationManagerShouldDisplayHeadingCalibration:(AMapLocationManager *)manager;
/**
* @brief 设备方向改变时回调函数
* @param manager 定位 AMapLocationManager 类。
* @param newHeading 设备朝向。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading;
/**
* @brief 开始监控region回调函数
* @param manager 定位 AMapLocationManager 类。
* @param region 开始监控的region。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didStartMonitoringForRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
/**
* @brief 进入region回调函数
* @param manager 定位 AMapLocationManager 类。
* @param region 进入的region。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didEnterRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
/**
* @brief 离开region回调函数
* @param manager 定位 AMapLocationManager 类。
* @param region 离开的region。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didExitRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
/**
* @brief 查询region状态回调函数
* @param manager 定位 AMapLocationManager 类。
* @param state 查询的region的状态。
* @param region 查询的region。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didDetermineState:(AMapLocationRegionState)state forRegion:(AMapLocationRegion *)region __attribute__((deprecated("请使用AMapGeoFenceManager")));
/**
* @brief 监控region失败回调函数
* @param manager 定位 AMapLocationManager 类。
* @param region 失败的region。
* @param error 错误信息,参考 AMapLocationErrorCode 。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager monitoringDidFailForRegion:(AMapLocationRegion *)region withError:(NSError *)error __attribute__((deprecated("请使用AMapGeoFenceManager")));
@end

View File

@ -0,0 +1,90 @@
//
// AMapLocationRegionObj.h
// AMapLocationKit
//
// Created by AutoNavi on 15/11/27.
// Copyright © 2015年 Amap. All rights reserved.
//
#import "AMapLocationCommonObj.h"
// 以下类涉及的坐标需要使用高德坐标系坐标(GCJ02)
#pragma mark - AMapLocationRegion
///AMapLocationRegion类该类提供范围类的基本信息并无具体实现不要直接使用。
@interface AMapLocationRegion : NSObject<NSCopying>
///AMapLocationRegion的identifier
@property (nonatomic, copy, readonly) NSString *identifier;
///当进入region范围时是否通知默认YES
@property (nonatomic, assign) BOOL notifyOnEntry;
///当离开region范围时是否通知默认YES
@property (nonatomic, assign) BOOL notifyOnExit;
/**
* @brief 初始化方法
* @param identifier 唯一标识符必填不可为nil
*/
- (instancetype)initWithIdentifier:(NSString *)identifier;
/**
* @brief 坐标点是否在范围内
* @param coordinate 要判断的坐标点
* @return 是否在范围内
*/
- (BOOL)containsCoordinate:(CLLocationCoordinate2D)coordinate;
@end
#pragma mark - AMapLocationCircleRegion
///AMapLocationCircleRegion类定义一个圆形范围。
@interface AMapLocationCircleRegion : AMapLocationRegion
///中心点的经纬度坐标
@property (nonatomic, readonly) CLLocationCoordinate2D center;
///半径,单位:米
@property (nonatomic, readonly) CLLocationDistance radius;
/**
* @brief 根据中心点和半径生成圆形范围
* @param center 中心点的经纬度坐标
* @param radius 半径,单位:米
* @param identifier 唯一标识符必填不可为nil
* @return AMapLocationCircleRegion类实例
*/
- (instancetype)initWithCenter:(CLLocationCoordinate2D)center radius:(CLLocationDistance)radius identifier:(NSString *)identifier;
@end
#pragma mark - AMapLocationPolygonRegion
///AMapLocationCircleRegion类定义一个闭合多边形范围点与点之间按顺序尾部相连, 第一个点与最后一个点相连。
@interface AMapLocationPolygonRegion : AMapLocationRegion
///经纬度坐标点数据
@property (nonatomic, readonly) CLLocationCoordinate2D *coordinates;
///经纬度坐标点的个数
@property (nonatomic, readonly) NSInteger count;
/**
* @brief 根据经纬度坐标数据生成闭合多边形范围
* @param coordinates 经纬度坐标点数据,coordinates对应的内存会拷贝,调用者负责该内存的释放
* @param count 经纬度坐标点的个数不可小于3个
* @param identifier 唯一标识符必填不可为nil
* @return AMapLocationCircleRegion类实例
*/
- (instancetype)initWithCoordinates:(CLLocationCoordinate2D *)coordinates count:(NSInteger)count identifier:(NSString *)identifier;
@end

View File

@ -0,0 +1,26 @@
//
// AMapLoctionVersion.h
// AMapLocationKit
//
// Created by AutoNavi on 16/1/22.
// Copyright © 2016年 Amap. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <AMapFoundationKit/AMapFoundationVersion.h>
#ifndef AMapLoctionVersion_h
#define AMapLoctionVersion_h
#define AMapLocationVersionNumber 201101
#define AMapLocationFoundationVersionMinRequired 10806
// 依赖库版本检测
#if AMapFoundationVersionNumber < AMapLocationFoundationVersionMinRequired
#error "The AMapFoundationKit version is less than minimum required, please update! Any questions please to visit http://lbs.amap.com"
#endif
FOUNDATION_EXTERN NSString * const AMapLocationVersion;
FOUNDATION_EXTERN NSString * const AMapLocationName;
#endif /* AMapLoctionVersion_h */

Binary file not shown.

View File

@ -0,0 +1,6 @@
framework module AMapLocationKit {
umbrella header "AMapLocationKit.h"
export *
module * { export * }
}

View File

@ -0,0 +1 @@
2.11.1+loc.5da92c7