feat: 自定义插件的更新

This commit is contained in:
zoujing
2026-05-10 14:55:18 +08:00
parent 9d7058bbe4
commit 83608316f4
256 changed files with 11644 additions and 3451 deletions

View File

@@ -0,0 +1,141 @@
//
// BMKGeoFenceManager.h
// BMKLocationKit
//
// Created by baidu on 2017/3/2.
// Copyright © 2017年 baidu. All rights reserved.
//
#import "BMKGeoFenceRegion.h"
@protocol BMKGeoFenceManagerDelegate;
///地理围栏监听状态类型
typedef NS_OPTIONS(NSUInteger, BMKGeoFenceActiveAction)
{
BMKGeoFenceActiveActionNone = 0, ///< 不进行监听
BMKGeoFenceActiveActionInside = 1 << 0, ///< 在范围内
BMKGeoFenceActiveActionOutside = 1 << 1, ///< 在范围外
BMKGeoFenceActiveActionStayed = 1 << 2, ///< 停留(在范围内超过10分钟)
};
///BMKGeoFence errorDomain
FOUNDATION_EXPORT NSErrorDomain const _Nonnull BMKGeoFenceErrorDomain;
///地理围栏错误码
typedef NS_ENUM(NSInteger, BMKGeoFenceErrorCode) {
BMKGeoFenceErrorUnknown = 1, ///< 未知错误
BMKGeoFenceErrorInvalidParameter = 2, ///< 参数错误
BMKGeoFenceErrorFailureConnection = 3, ///< 网络连接异常
BMKGeoFenceErrorFailureAuth = 4, ///< 鉴权失败
BMKGeoFenceErrorNoValidFence = 5, ///< 无可用围栏
BMKGeoFenceErroFailureLocating = 6, ///< 定位错误
};
///地理围栏管理类
@interface BMKGeoFenceManager : NSObject
///实现了 BMKGeoFenceManagerDelegate 协议的类指针。
@property (nonatomic, weak, nullable) id<BMKGeoFenceManagerDelegate> delegate;
///需要进行通知的行为默认为BMKGeoFenceActiveActionInside。
@property (nonatomic, assign) BMKGeoFenceActiveAction activeAction;
///指定定位是否会被系统自动暂停。默认为NO。
@property (nonatomic, assign) BOOL pausesLocationUpdatesAutomatically;
///是否允许后台定位。默认为NO。只在iOS 9.0及之后起作用。设置为YES的时候必须保证 Background Modes 中的 Location updates 处于选中状态,否则会抛出异常。
@property (nonatomic, assign) BOOL allowsBackgroundLocationUpdates;
/**
* @brief 添加一个圆形围栏
* @param center 围栏的中心点经纬度坐标
* @param radius 围栏的半径单位要求大于0
* @param type 围栏的坐标系类型
* @param customID 用户自定义ID可选SDK原值返回
*/
- (void)addCircleRegionForMonitoringWithCenter:(CLLocationCoordinate2D)center radius:(CLLocationDistance)radius coorType:(BMKLocationCoordinateType)type customID:(NSString * _Nullable)customID;
/**
* @brief 根据经纬度坐标数据添加一个闭合的多边形围栏,点与点之间按顺序尾部相连, 第一个点与最后一个点相连
* @param coordinates 经纬度坐标点数据,coordinates对应的内存会拷贝,调用者负责该内存的释放
* @param count 经纬度坐标点的个数不可小于3个
* @param type 围栏的坐标系类型
* @param customID 用户自定义ID可选SDK原值返回
*/
- (void)addPolygonRegionForMonitoringWithCoordinates:(CLLocationCoordinate2D * _Nonnull)coordinates count:(NSInteger)count coorType:(BMKLocationCoordinateType)type customID:(NSString * _Nullable)customID;
/**
* @brief 根据customID获得指定的围栏如果customID传nil则返回全部围栏
* @param customID 用户执行添加围栏函数时传入的customID
* @return 获得的围栏构成的数组如果没有结果返回nil
*/
- (NSArray * _Nullable)geoFenceRegionsWithCustomID:(NSString * _Nullable)customID;
/**
* @brief 移除指定围栏
* @param region 要停止监控的围栏
*/
- (void)removeTheGeoFenceRegion:(BMKGeoFenceRegion * _Nonnull)region;
/**
* @brief 移除指定customID的围栏
* @param customID 用户执行添加围栏函数时传入的customID
*/
- (void)removeGeoFenceRegionsWithCustomID:(NSString * _Nullable)customID;
/**
* @brief 移除所有围栏
*/
- (void)removeAllGeoFenceRegions;
@end
///地理围栏代理协议,该协议定义了获取地理围栏相关回调方法,包括添加、状态改变等。
@protocol BMKGeoFenceManagerDelegate <NSObject>
@optional
/**
* @brief 为了适配app store关于新的后台定位的审核机制app store要求如果开发者只配置了使用期间定位则代码中不能出现申请后台定位的逻辑当开发者在plist配置NSLocationAlwaysUsageDescription或者NSLocationAlwaysAndWhenInUseUsageDescription时需要在该delegate中调用后台定位api[locationManager requestAlwaysAuthorization]。开发者如果只配置了NSLocationWhenInUseUsageDescription且只有使用期间的定位需求则无需在delegate中实现逻辑。
* @param manager 定位 BMKGeoFenceManager 类。
* @param locationManager 系统 CLLocationManager 类 。
* @since 1.7.0
*/
- (void)BMKGeoFenceManager:(BMKGeoFenceManager * _Nonnull)manager doRequestAlwaysAuthorization:(CLLocationManager * _Nonnull)locationManager;
/**
* @brief 添加地理围栏完成后的回调,成功与失败都会调用
* @param manager 地理围栏管理类
* @param regions 成功添加的一个或多个地理围栏构成的数组
* @param customID 用户执行添加围栏函数时传入的customID
* @param error 添加失败的错误信息
*/
- (void)BMKGeoFenceManager:(BMKGeoFenceManager * _Nonnull)manager didAddRegionForMonitoringFinished:(NSArray <BMKGeoFenceRegion *> * _Nullable)regions customID:(NSString * _Nullable)customID error:(NSError * _Nullable)error;
/**
* @brief 地理围栏状态改变时回调,当围栏状态的值发生改变,定位失败都会调用
* @param manager 地理围栏管理类
* @param region 状态改变的地理围栏
* @param customID 用户执行添加围栏函数时传入的customID
* @param error 错误信息,如定位相关的错误
*/
- (void)BMKGeoFenceManager:(BMKGeoFenceManager * _Nonnull)manager didGeoFencesStatusChangedForRegion:(BMKGeoFenceRegion * _Nullable)region customID:(NSString * _Nullable)customID error:(NSError * _Nullable)error;
@end

View File

@@ -0,0 +1,114 @@
//
// BMKGeoFenceRegion.h
// BMKLocationKit
//
// Created by baidu on 2017/3/2.
// Copyright © 2017年 baidu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import "BMKLocationManager.h"
///BMKGeoFence Region State
typedef NS_ENUM(NSInteger, BMKGeoFenceRegionStatus)
{
BMKGeoFenceRegionStatusUnknown = 0, ///< 未知
BMKGeoFenceRegionStatusInside = 1, ///< 在范围内
BMKGeoFenceRegionStatusOutside = 1 << 1, ///< 在范围外
BMKGeoFenceRegionStatusStayed = 1 << 2, ///< 停留(在范围内超过10分钟)
};
#pragma mark - BMKGeoFenceRegion
///地理围栏基类,不可直接使用
@interface BMKGeoFenceRegion : NSObject<NSCopying>
///BMKGeoFenceRegion的唯一标识符
@property (nonatomic, copy, readonly) NSString *identifier;
///用户自定义ID可为nil。
@property (nonatomic, copy, readonly) NSString *customID;
///坐标点和围栏的关系,比如用户的位置和围栏的关系
@property (nonatomic, assign) BMKGeoFenceRegionStatus fenceStatus;
///设定围栏坐标系类型。默认为 BMKLocationCoordinateTypeGCJ02。
@property(nonatomic, readonly) BMKLocationCoordinateType coordinateType;
///上次发生状态变化的时间
@property(nonatomic, assign)NSTimeInterval lastEventTime;
/**
* @brief 判断位置与围栏状态
* @param CLLocationCoordinate2D 坐标值
* @return 返回BMKGeoFenceRegionStatus状态
*/
-(BMKGeoFenceRegionStatus)judgeStatusWithCoor:(CLLocationCoordinate2D)coor;
@end
#pragma mark - BMKLocationCircleRegion
///圆形地理围栏
@interface BMKGeoFenceCircleRegion : BMKGeoFenceRegion
///中心点的经纬度坐标
@property (nonatomic, readonly) CLLocationCoordinate2D center;
///半径,单位:米
@property (nonatomic, readonly) CLLocationDistance radius;
/**
* @brief 构造圆形围栏
* @param customid 用户自定义ID
* @param identityid 识别id
* @param center 中心坐标
* @param radius 围栏半径
* @param type 坐标系类型
* @return BMKGeoFenceCircleRegion id
*/
- (id)initWithCustomID:(NSString *)customid identityID:(NSString *)identityid center:(CLLocationCoordinate2D)center radius:(CLLocationDistance)radius coor:(BMKLocationCoordinateType)type;
@end
#pragma mark -BMKGeoFencePolygonRegion
///多边形地理围栏
@interface BMKGeoFencePolygonRegion : BMKGeoFenceRegion
///经纬度坐标点数据
@property (nonatomic, readonly) CLLocationCoordinate2D *coordinates;
///经纬度坐标点的个数
@property (nonatomic, readonly) NSInteger count;
/**
* @brief 构造多边形围栏
* @param customid 用户自定义ID
* @param identityid 识别id
* @param coor 多边形顶点
* @param count 顶点个数
* @param type 坐标系类型
* @return BMKGeoFencePolygonRegion id
*/
- (id)initWithCustomID:(NSString *)customid identityID:(NSString *)identityid coor:(CLLocationCoordinate2D *)coor count:(NSInteger)count coor:(BMKLocationCoordinateType)type;
@end

View File

@@ -0,0 +1,97 @@
//
// BMKLocation.h
// LocationComponent
//
// Created by baidu on 2017/8/16.
// Copyright © 2017年 baidu. All rights reserved.
//
#ifndef BMKLocation_h
#define BMKLocation_h
#import <CoreLocation/CoreLocation.h>
#import "BMKLocationReGeocode.h"
/**
* BMKLocationProvider 位置数据来源分iOS系统定位和其他定位服务结果两种目前仅支持iOS系统定位服务
*
*/
typedef NS_ENUM(int, BMKLocationProvider) {
BMKLocationProviderIOS = 0, //!<位置来源于iOS本身定位
BMKLocationProviderOther //!<位置来源于其他定位服务
};
///描述百度iOS 定位数据
@interface BMKLocation : NSObject
///BMKLocation 位置数据
@property(nonatomic, copy, readonly) CLLocation * _Nullable location;
///BMKLocation 地址数据
@property(nonatomic, copy) BMKLocationReGeocode * _Nullable rgcData;
///BMKLocation 位置来源
@property(nonatomic, assign) BMKLocationProvider provider;
///BMKLocation 位置ID
@property(nonatomic, retain) NSString * _Nullable locationID;
/*
* floorString
*
* Discussion:
* 室内定位成功时返回的楼层信息ex:f1
*/
@property(readonly, nonatomic, copy, nullable) NSString *floorString;
/*
* buildingID
*
* Discussion:
* 室内定位成功时返回的百度建筑物ID
*/
@property(readonly, nonatomic, copy, nullable) NSString *buildingID;
/*
* buildingName
*
* Discussion:
* 室内定位成功时返回的百度建筑物名称
*/
@property(readonly, nonatomic, copy, nullable) NSString *buildingName;
/*
* extraInfo
*
* Discussion:
* 定位附加信息如停车位code识别结果、停车位code示例、vdr推算结果置信度等
*/
@property(readonly, nonatomic, copy, nullable) NSDictionary * extraInfo;
/**
* @brief 初始化BMKLocation实例
* @param loc CLLocation对象
* @param rgc BMKLocationReGeocode对象
* @return BMKLocation id
*/
- (id _Nonnull)initWithLocation:(CLLocation * _Nullable)loc withRgcData:(BMKLocationReGeocode * _Nullable)rgc;
/**
* @brief 构造BMKLocation
* @param location CLLocation
* @param floorString 楼层字符串
* @param buildingID 建筑物ID
* @param buildingName 建筑物名称
* @param info 位置附加信息
* @return BMKLocation id
*/
-(id _Nonnull)initWithLocation:(CLLocation * _Nullable)location floorString:(NSString * _Nullable)floorString buildingID:(NSString * _Nullable)buildingID
buildingName:(NSString * _Nullable)buildingName extraInfo:(NSDictionary * _Nullable)info withRgcData:(BMKLocationReGeocode * _Nullable)rgc;
@end
#endif /* BMKLocation_h */

View File

@@ -0,0 +1,56 @@
//
// BMKLocationAuth.h
// LocationComponent
//
// Created by baidu on 2017/4/10.
// Copyright © 2017年 baidu. All rights reserved.
//
#ifndef BMKLocationAuth_h
#define BMKLocationAuth_h
///定位鉴权错误码
typedef NS_ENUM(NSInteger, BMKLocationAuthErrorCode) {
BMKLocationAuthErrorUnknown = -1, ///< 未知错误
BMKLocationAuthErrorSuccess = 0, ///< 鉴权成功
BMKLocationAuthErrorNetworkFailed = 1, ///< 因网络鉴权失败
BMKLocationAuthErrorFailed = 2, ///< KEY非法鉴权失败
};
///通知Delegate
@protocol BMKLocationAuthDelegate <NSObject>
@optional
/**
*@brief 返回授权验证错误
*@param iError 错误号 : 为0时验证通过具体参加BMKLocationAuthErrorCode
*/
- (void)onCheckPermissionState:(BMKLocationAuthErrorCode)iError;
@end
///BMKLocationAuth类。用于鉴权
@interface BMKLocationAuth : NSObject
///鉴权状态0成功 1网络错误 2授权失败
@property(nonatomic, readonly, assign) BMKLocationAuthErrorCode permisionState;
/**
* @brief 得到BMKLocationAuth的单例
*/
+ (BMKLocationAuth*)sharedInstance;
/**
*@brief 启动引擎
*@param key 申请的有效key
*@param delegate 回调是否鉴权成功
*/
-(void)checkPermisionWithKey:(NSString*)key authDelegate:(id<BMKLocationAuthDelegate>)delegate;
@end
#endif /* BMKLocationAuth_h */

View File

@@ -0,0 +1,16 @@
//
// BMKLocationComponent.h
// LocationComponent
//
// Created by Baidu on 3/31/14.
// Copyright (c) 2014 baidu. All rights reserved.
//
#import "BMKLocationManager.h"
#import "BMKLocationKitVersion.h"
#import "BMKLocationPoi.h"
#import "BMKLocation.h"
#import "BMKGeoFenceRegion.h"
#import "BMKGeoFenceManager.h"
#import "BMKLocationReGeocode.h"
#import "BMKLocationAuth.h"

View File

@@ -0,0 +1,30 @@
//
// BMKLocationKitVersion.h
// BMKLocationKit
//
// Created by baidu on 17/9/9.
// Copyright © 2017年 baidu. All rights reserved.
//
#ifndef BMKLocationKitVersion_h
#define BMKLocationKitVersion_h
#import <UIKit/UIKit.h>
/**
*获取当前定位sdk 的版本号
*当前定位sdk版本 : 2.0.0
*@return 返回当前定位sdk 的版本号
*/
UIKIT_EXTERN NSString* BMKLocationKitVersion();
/**
*获取当前定位sdk 的float版本号
*当前定位sdk版本 : 2.0
*@return 返回当前定位sdk 的float版本号
*/
UIKIT_EXTERN float BMKLocationKitFloatVersion();
#endif /* BMKLocationKitVersion_h */

View File

@@ -0,0 +1,296 @@
//
// BMKLocationManager.h
// BMKLocationKit
//
// Created by baidu on 2017/3/2.
// Copyright © 2017年 baidu. All rights reserved.
//
#import <Availability.h>
#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 _Nonnull BMKLocationErrorDomain;
///BMKLocation errorCode
typedef NS_ENUM(NSInteger, BMKLocationErrorCode)
{
BMKLocationErrorUnKnown = 0, ///<未知异常
BMKLocationErrorLocFailed = 1, ///<位置未知,持续定位中
BMKLocationErrorDenied = 2, ///<手机不允许定位,请确认用户授予定位权限或者手机是否打开定位开关
BMKLocationErrorNetWork = 3, ///<因为网络原因导致系统定位失败
BMKLocationErrorHeadingFailed = 4, ///<获取手机方向信息失败
BMKLocationErrorGetExtraNetworkFailed = 5, ///<网络原因导致获取额外信息(地址、网络状态等信息)失败
BMKLocationErrorGetExtraParseFailed = 6, ///<网络返回数据解析失败导致获取额外信息(地址、网络状态等信息)失败
BMKLocationErrorFailureAuth = 7, ///<鉴权失败导致无法返回定位、地址等信息
};
/** BMKLAccuracyAuthorization 枚举返回定位精度等级
*
*/
typedef NS_ENUM(NSInteger, BMKLAccuracyAuthorization) {
BMKLAccuracyAuthorizationFullAccuracy, ///<全量定位精度等级,该等级下定位返回结果会尽可能精准
BMKLAccuracyAuthorizationReducedAccuracy, ///<降级定位精度等级该等级下定位会返回大概5km精度范围的点定位频率、实时性上也会变慢比如可能是20分钟之前的点适用于那些只要求城市级别精度的app使用ios14之后该等级受用户控制需要高等级权限的app需要对应做好适配工作
};
/**
* @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;
///定位sdk-v1.3之后开发者可以选择是否需要最新版本rgc数据1.9之后默认是需要YESYES的情况下定位sdk会实时返回最新的rgc数据如城市变更等数据都会实时更新
@property (nonatomic, assign) BOOL isNeedNewVersionReGeocode;
///开发者可以指定该用户的id用于后续统一识别用户便于查找问题
@property(nonatomic, copy, nullable) NSString * userID;
///返回定位精度等级IOS14之后用户可以直接控制返回定位的精度等级开发者可以通过这个值适配不同定位等级下的产品逻辑
@property (nonatomic, readonly) BMKLAccuracyAuthorization accuracyAuthorization;
/**
* @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 该方法为BMKLocationManager尝试使用高精度室内定位。在特定的室内场景下会有更高精度的定位回调只在室内定位版本生效。
*/
- (void)tryIndoorLocation;
/**
* @brief 该方法为BMKLocationManager会关闭高精度室内定位只在室内定位版本生效。
*/
- (void)stopIndoorLocation;
/**
* @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;
/**
* @brief 返回当前定位权限
* @return CLAuthorizationStatus 定位权限枚举类型
*/
- (CLAuthorizationStatus)authorizationStatus;
/**
* @brief 如果你没有全量定位等级精度权限利用该接口可以临时请求一次全量定位精度等级系统会抛出弹框让用户确认是否授权app授予相应权限
* @param purposeKey info.plist中NSLocationTemporaryUsageDescriptionDictionary定义的key对应相应的value可以详细描述申请全量定位精度等级的原因
* @param completion 回调是否
* @return
*/
- (void)requestTemporaryFullAccuracyAuthorizationWithPurposeKey:(NSString * _Nonnull)purposeKey completion:(void(^ _Nullable)(NSError * _Nullable))completion API_AVAILABLE(ios(14.0));
/**
* @brief 请求一次全量定位精度等级
* @param purposeKey info.plist中NSLocationTemporaryUsageDescriptionDictionary定义的key
* @return
*/
- (void)requestTemporaryFullAccuracyAuthorizationWithPurposeKey:(NSString * _Nonnull)purposeKey API_AVAILABLE(ios(14.0));
@end
#pragma mark - BMKLocationManagerDelegate
///BMKLocationManagerDelegate 协议定义了发生错误时的错误回调方法,连续定位的回调方法等。
@protocol BMKLocationManagerDelegate <NSObject>
@optional
/**
* @brief 为了适配app store关于新的后台定位的审核机制app store要求如果开发者只配置了使用期间定位则代码中不能出现申请后台定位的逻辑当开发者在plist配置NSLocationAlwaysUsageDescription或者NSLocationAlwaysAndWhenInUseUsageDescription时需要在该delegate中调用后台定位api[locationManager requestAlwaysAuthorization]。开发者如果只配置了NSLocationWhenInUseUsageDescription且只有使用期间的定位需求则无需在delegate中实现逻辑。
* @param manager 定位 BMKLocationManager 类。
* @param locationManager 系统 CLLocationManager 类 。
* @since 1.6.0
*/
- (void)BMKLocationManager:(BMKLocationManager * _Nonnull)manager doRequestAlwaysAuthorization:(CLLocationManager * _Nonnull)locationManager;
/**
* @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 API_DEPRECATED_WITH_REPLACEMENT("-BMKLocationManagerDidChangeAuthorization", ios(4.2, 14.0));
/**
* @brief authorizationStatus或者accuracyAuthorization有变化时回调函数
* @param manager 定位 BMKLocationManager 类。
*/
- (void)BMKLocationManagerDidChangeAuthorization:(BMKLocationManager * _Nonnull)manager;
/**
* @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

View File

@@ -0,0 +1,42 @@
//
// BMKLocationPoi.h
// BMKLocationKit
//
// Created by baidu on 2017/3/2.
// Copyright © 2017年 baidu. All rights reserved.
//
///描述Poi各属性
@interface BMKLocationPoi : NSObject
///BMKLocationPoi的id属性
@property(nonatomic, copy, readonly) NSString *uid;
///BMKLocationPoi的名字属性
@property(nonatomic, copy, readonly) NSString *name;
///BMKLocationPoi的标签属性
@property(nonatomic, copy, readonly) NSString *tags;
///BMKLocationPoi的地址属性
@property(nonatomic, copy, readonly) NSString *addr;
///BMKLocationPoi的可信度
@property(nonatomic, assign, readonly) float relaiability;
/**
* @brief 通过NSDictionary初始化方法一
*/
- (id)initWithDictionary:(NSDictionary *)dictionary;
/**
* @brief 通过NSDictionary初始化方法二
*/
- (id)initWithTwoDictionary:(NSDictionary *)dictionary;
@end

View File

@@ -0,0 +1,35 @@
//
// BMKLocationPoiRegion.h
// LocationComponent
//
// Created by Jiang,Fangsheng on 2019/9/4.
// Copyright © 2019 baidu. All rights reserved.
//
#ifndef BMKLocationPoiRegion_h
#define BMKLocationPoiRegion_h
///描述PoiRegion各属性
@interface BMKLocationPoiRegion : NSObject
///BMKLocationPoiRegion的方向属性如『内』、『外』
@property(nonatomic, copy, readonly) NSString *directionDesc;
///BMKLocationPoiRegion的名字属性
@property(nonatomic, copy, readonly) NSString *name;
///BMKLocationPoiRegion的标签属性
@property(nonatomic, copy, readonly) NSString *tags;
/**
* @brief 通过NSDictionary初始化方法一
*/
- (id)initWithDictionary:(NSDictionary *)dictionary;
@end
#endif /* BMKLocationPoiRegion_h */

View File

@@ -0,0 +1,67 @@
//
// BMKLocationReGeocode.h
// BMKLocationKit
//
// Created by baidu on 2017/3/2.
// Copyright © 2017年 baidu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "BMKLocationPoi.h"
#import "BMKLocationPoiRegion.h"
///BMKLocationReGeocode类。描述跟地址有关的信息.
@interface BMKLocationReGeocode : NSObject
///国家名字属性
@property(nonatomic, copy, readonly) NSString *country;
///国家编码属性
@property(nonatomic, copy, readonly) NSString *countryCode;
///省份名字属性
@property(nonatomic, copy, readonly) NSString *province;
///城市名字属性
@property(nonatomic, copy, readonly) NSString *city;
///区名字属性
@property(nonatomic, copy, readonly) NSString *district;
///乡镇名字属性
@property(nonatomic, copy, readonly) NSString *town;
///街道名字属性
@property(nonatomic, copy, readonly) NSString *street;
///街道号码属性
@property(nonatomic, copy, readonly) NSString *streetNumber;
///城市编码属性
@property(nonatomic, copy, readonly) NSString *cityCode;
///行政区划编码属性
@property(nonatomic, copy, readonly) NSString *adCode;
///位置语义化结果的定位点在什么地方周围的描述信息
@property(nonatomic, copy, readonly) NSString *locationDescribe;
///位置语义化结果的属性该定位点周围的poi列表信息
@property(nonatomic, retain, readonly) NSArray<BMKLocationPoi *> *poiList;
///位置语义化结果的定位点在什么地方周围的描述信息
@property(nonatomic, strong, readonly) BMKLocationPoiRegion *poiRegion;
/**
* @brief 通过NSData初始化方法
*/
- (id)initWithReGeocodeString:(NSData *)reGeocodeString;
/**
* @brief 通过JSON初始化方法
*/
- (id)initWithJsonString:(NSData *)jsonString withHighAccuracy:(BOOL)highAcc;
@end

View File

@@ -0,0 +1,11 @@
1、版本
百度地图iOS定位SDK v2.0.0
2、是否带IDFA
3、是否为Bitcode
4、集成方法
http://lbsyun.baidu.com/index.php?title=ios-locsdk

View File

@@ -0,0 +1,15 @@
//
// QualityUtil.h
// IDLFaceSDK
//
// Created by Tong,Shasha on 2017/5/24.
// Copyright © 2017年 Baidu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
@interface BDFaceQualityUtil : NSObject
+ (CGRect)getFaceRect:(NSArray *) trackingPoints withCount:(NSUInteger) count;
@end

View File

@@ -0,0 +1,22 @@
//
// Util.h
// IDLFaceSDK
//
// Created by Tong,Shasha on 2017/5/24.
// Copyright © 2017年 Baidu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <UIKit/UIKit.h>
#define FACESDK_BUNDLE_Name @"com.baidu.idl.face.faceSDK.bundle"
#define FACESDK_BUNDLE [[NSBundle alloc] initWithPath:[[NSBundle mainBundle] pathForResource:FACESDK_BUNDLE_Name ofType:nil]]
@interface BDFaceUtil : NSObject
+ (CGRect)convertRectFrom:(CGRect)imageRect image:(UIImage *)image previewRect:(CGRect)previewRect;
+ (NSString *)iphoneType;
@end

View File

@@ -0,0 +1,441 @@
//
// FaceSDKManager.h
// IDLFaceSDK
//
// Created by Tong,Shasha on 2017/5/15.
// Copyright © 2017年 Baidu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger, FaceLivenessActionType) {
FaceLivenessActionTypeLiveEye = 0,
FaceLivenessActionTypeLiveMouth = 1,
FaceLivenessActionTypeLiveYawRight = 2,
FaceLivenessActionTypeLiveYawLeft = 3,
FaceLivenessActionTypeLivePitchUp = 4,
FaceLivenessActionTypeLivePitchDown = 5,
FaceLivenessActionTypeLiveYaw = 6,
FaceLivenessActionTypeNoAction = 7,
};
typedef NS_ENUM(NSUInteger, ResultCode) {
ResultCodeOK,
ResultCodePitchOutofDownRange, //头部偏低
ResultCodePitchOutofUpRange, //头部偏高
ResultCodeYawOutofLeftRange, //头部偏左
ResultCodeYawOutofRightRange, //头部偏右
ResultCodeTooBrightIllumination, // 光线过亮
ResultCodePoorIllumination, //光照不足
ResultCodeNoFaceDetected, //没有检测到人脸
ResultCodeDataNotReady,
ResultCodeDataHitOne, //采集到一张照片
ResultCodeDataHitLast, //采集到最后一张照片
ResultCodeImageBlured, //图像模糊
ResultCodeOcclusionLeftEye, //左眼有遮挡
ResultCodeOcclusionRightEye, //右眼有遮挡
ResultCodeOcclusionNose, //鼻子有遮挡
ResultCodeOcclusionMouth, //嘴巴有遮挡
ResultCodeOcclusionLeftContour, //左脸颊有遮挡
ResultCodeOcclusionRightContour, //右脸颊有遮挡
ResultCodeOcclusionChinCoutour, //下颚有遮挡
ResultCodeVerifyInitError, //鉴权失败
ResultCodeVerifyDecryptError,
ResultCodeVerifyInfoFormatError,
ResultCodeVerifyExpired,
ResultCodeVerifyMissRequiredInfo,
ResultCodeVerifyInfoCheckError,
ResultCodeVerifyLocalFileError,
ResultCodeVerifyRemoteDataError,
ResultCodeLeftEyeClosed,
ResultCodeRightEyeClosed,
ResultCodeUnknowType //未知类型
};
typedef NS_ENUM(NSUInteger, TrackResultCode) {
TrackResultCodeOK,
TrackResultCodeImageBlured, // 图像模糊
TrackResultCodePoorIllumination, // 光照不行
TrackResultCodeNoFaceDetected, //没有检测到人脸
TrackResultCodeOcclusionLeftEye, //左眼有遮挡
TrackResultCodeOcclusionRightEye, //右眼有遮挡
TrackResultCodeOcclusionNose, //鼻子有遮挡
TrackResultCodeOcclusionMouth, //嘴巴有遮挡
TrackResultCodeOcclusionLeftContour, //左脸颊有遮挡
TrackResultCodeOcclusionRightContour, //右脸颊有遮挡
TrackResultCodeOcclusionChinCoutour, //下颚有遮挡
TrackResultCodeVerifyInitError, //鉴权失败
TrackResultCodeVerifyDecryptError,
TrackResultCodeVerifyInfoFormatError,
TrackResultCodeVerifyExpired,
TrackResultCodeVerifyMissRequiredInfo,
TrackResultCodeVerifyInfoCheckError,
TrackResultCodeVerifyLocalFileError,
TrackResultCodeVerifyRemoteDataError,
TrackResultCodeUnknowType //未知类型
};
@class FaceInfo;
@class FaceLivenessState;
@class FaceCropImageInfo;
@interface FaceSDKManager : NSObject
/* 超时时间 */
@property (nonatomic, assign) CGFloat conditionTimeout;
/* 语音超时*/
@property (nonatomic, assign) CGFloat intervalOfVoiceRemind;
/* 输出图像个数 */
@property (nonatomic, assign) int imageNum;
/* 图像加密类型默认0 */
@property (nonatomic, assign) int imageEncrypteType;
/* 图像加密类型默认0 */
@property (nonatomic, assign) float minRectScale;
/* 图片计数器,用来计当前图片的数量*/
@property (nonatomic, assign) int currentNum;
+ (instancetype)sharedInstance;
/**
* 获取版本号
*/
- (NSString *)getVersion;
/**
* 重置计数器
*/
- (void)reset;
/**
* 获取设备zid 公安验证上传
*/
- (NSString *)getZtoken;
/**
* SDK鉴权方法-文件授权
* SDK鉴权方法 必须在使用其他方法之前设置否则会导致SDK不可用
*
* @param licenseID 授权ID
* @param licensePath 本地鉴权文件路径
* @param remoteAuthorize 是否远程更新过期鉴权文件
*/
- (void)setLicenseID:(NSString *)licenseID andLocalLicenceFile:(NSString *)licensePath andRemoteAuthorize:(BOOL)remoteAuthorize;
/**
* 初始化采集功能
*/
- (int) initCollect;
/**
* 卸载采集功能
*/
- (int)uninitCollect;
/**
* 判断授权是否通过true 表示通过false 表示不通过
*/
- (BOOL)canWork;
/**
* 设置预测库耗能模式
* 默认 LITE_POWER_NO_BIND
*/
- (void)setLitePower:(int)litePower;
/**
* 需要检测的最大人脸数目
* 默认1
*/
- (void)setMaxDetectNum:(int)detectNum ;
/**
* 需要检测的最小人脸大小
* 默认40
*/
- (void)setMinFaceSize:(int)width;
/**
* 人脸置信度阈值(检测分值大于该阈值认为是人脸
* RGB
* 默认 0.5f
*/
- (void)setNotFaceThreshold:(CGFloat)thr ;
/**
* 质量检测遮挡阈值
* 默认0.5
*/
- (void)setOccluThreshold:(CGFloat)thr ;
/**
* 质量检测遮挡阈值-左眼遮挡置信度
* 默认0.31
*/
-(void)setOccluLeftEyeThreshold:(CGFloat)thr ;
/**
* 质量检测遮挡阈值- 右眼遮挡置信度
* 默认0.31
*/
-(void)setOccluRightEyeThreshold:(CGFloat)thr ;
/**
* 质量检测遮挡阈值-鼻子遮挡置信度
* 默认0.27
*/
-(void)setOccluNoseThreshold:(CGFloat)thr ;
/**
* 质量检测遮挡阈值-嘴巴遮挡置信度
* 默认0.2
*/
-(void)setOccluMouthThreshold:(CGFloat)thr ;
/**
* 质量检测遮挡阈值-左脸遮挡置信度
* 默认0.48
*/
-(void)setOccluLeftCheekThreshold:(CGFloat)thr ;
/**
* 质量检测遮挡阈值-右脸遮挡置信度
* 默认0.48
*/
-(void)setOccluRightCheekThreshold:(CGFloat)thr ;
/**
* 质量检测遮挡阈值-下巴遮挡置信度
* 默认0.4
*/
-(void)setOccluChinThreshold:(CGFloat)thr ;
/**
* 最大光照阈值
*/
- (void)setMaxIllumThreshold:(CGFloat)thr;
/**
* 最小光照阈值
*/
- (void)setMinIllumThreshold:(CGFloat)thr ;
/**
* 质量检测模糊阈值
* 默认0.5
*/
- (void)setBlurThreshold:(CGFloat)thr ;
/**
* 姿态检测阈值
* 默认pitch=12yaw=12row=10
*/
- (void)setEulurAngleThrPitch:(float)pitch yaw:(float)yaw roll:(float)roll ;
/**
* 输出图像个数
* 默认3
*/
- (void)setMaxCropImageNum:(int)imageNum ;
/**
* 输出图像宽,设置为有效值(大于0)则对图像进行缩放,否则输出原图抠图结果
* 默认 480
*/
- (void)setCropFaceSizeWidth:(CGFloat)width ;
/**
* 输出图像高,设置为有效值(大于0)则对图像进行缩放,否则输出原图抠图结果
* 默认 680
*/
- (void)setCropFaceSizeHeight:(CGFloat)height ;
/**
* 输出图像下巴扩展大于等于00不进行扩展
* 默认0.1
*/
- (void)setCropChinExtend:(CGFloat)chinExtend ;
/**
* 输出图像额头扩展大于等于00不进行扩展
* 默认0.2
*/
- (void)setCropForeheadExtend:(CGFloat)foreheadExtend ;
/**
* 输出图像人脸框与背景比例大于等于11不进行扩展
* 默认1.5f
*/
- (void)setCropEnlargeRatio:(float)cropEnlargeRatio;
/**
* 动作超时配置
*/
- (void)setConditionTimeout:(CGFloat)timeout ;
/**
* 语音间隔提醒配置
*/
- (void)setIntervalOfVoiceRemind:(CGFloat)timeout;
/**
* 是否开启静默活体默认false
*/
// - (void)setIsCheckSilentLive:(BOOL)isCheck;
/**
* 静默活体阈值配置默认0.8。
* 大于阈值返回图片,低于阈值返回未检测到人脸
*/
// - (void)setSilentLiveThreshold:(CGFloat)thr ;
/**
* 设置原始图片缩放比例默认1不缩放scale 阈值0~1
*/
- (void)setImageWithScale:(CGFloat)scale;
/**
* 设置图片加密类型type=0 基于base64 加密type=1 基于百度安全算法加密
*/
- (void)setImageEncrypteWithType:(int) type;
/**
* 人脸过远框比例 默认0.4
*/
- (void)setMinRect:(float) minRectScale;
/**
* 采集动作验证
* @param image 检测的图片
* @param isOriginal 是否返回原始图片
* @param completion 判断采集是否完成,人脸信息状态是否正常
*/
- (void)detectWithImage:(UIImage *)image isRreturnOriginalValue:(BOOL) isOriginal completion:(void (^)(FaceInfo *faceinfo, ResultCode resultCode))completion;
/**
* 动作活体动作验证
* @param image 检测的图片
* @param actionLiveType 当前要求做的动作
* @param completion 判断当前动作是否完成,人脸信息状态是否正常
*/
- (void)livenessWithImage:(UIImage *)image withAction:(FaceLivenessActionType)actionLiveType completion:(void (^)(FaceInfo *faceinfo, FaceLivenessState *state, ResultCode resultCode))completion;
@end
@interface FaceLivenessState : NSObject
/**
* 动作活体-眨眨眼
*/
@property(nonatomic, assign) BOOL isLiveEye;
/**
* 动作活体-张张嘴
*/
@property(nonatomic, assign) BOOL isLiveMouth;
/**
* 动作活体-向左转头
*/
@property(nonatomic, assign) BOOL isLiveYawLeft;
/**
* 动作活体-向右转头
*/
@property(nonatomic, assign) BOOL isLiveYawRight;
/**
* 动作活体-抬头
*/
@property(nonatomic, assign) BOOL isLivePitchUp;
/**
* 动作活体-低头
*/
@property(nonatomic, assign) BOOL isLivePitchDown;
@end
@interface FaceCropImageInfo : NSObject
/**
* 基于质量检测,姿态角度,对图片得分
*/
@property (nonatomic, assign) float qualityScore;
/**
* 离线RGB 静默活体得分
*/
@property (nonatomic,assign) float silentliveScore;
/**
* 采集到的矫正,调整宽高图片,会有宽高
*/
@property (nonatomic ,strong) UIImage *cropImageWithBlack;
/**
* 加密采集到的矫正,调整宽高图片,会有宽高
*/
@property (nonatomic ,strong) NSString *cropImageWithBlackEncryptStr;
/**
* 原始图片
*/
@property (nonatomic ,strong) UIImage *originalImage;
/**
* 加密原始图片
*/
@property (nonatomic ,strong) NSString *originalImageEncryptStr;
/**
* 排序规则
*/
- (NSComparisonResult)compareWithImageInfo:(FaceCropImageInfo *)info;
@end
@interface FaceInfo : NSObject
/**
* 人脸在图片中的位置
*/
@property (nonatomic, assign) CGRect faceRect;
/**
* 人脸track 中的faceid
*/
@property (nonatomic, assign) NSInteger faceId;
/**
* 人脸72关键点
*/
@property (nonatomic, strong) NSArray * landMarks;
/**
* 人脸角度
*/
@property (nonatomic, assign) float angle;
/**
* 人脸质量-光照置信度通过quality 方法调用获取
*/
@property (nonatomic,assign) float illum;
/**
* 人脸质量-模糊置信度通过quality 方法调用获取
*/
@property (nonatomic,assign) float blur;
/**
* 人脸上下偏转角通过headpose 方法调用获取
*/
@property (nonatomic, assign) float pitch;
/**
* 人脸左右偏转角通过headpose 方法调用获取
*/
@property (nonatomic, assign) float yaw;
/**
* 人脸平行平面内的头部旋转角通过headpose 方法调用获取
*/
@property (nonatomic, assign) float roll;
/**
* 离线RGB 静默活体得分
*/
@property (nonatomic,assign) float silentliveScore;
/**
* 人脸检测得分
*/
@property (nonatomic, assign) CGFloat score;
/**
* 输出图片结构体,包含图片质量分数,裁剪没有黑边的图片,裁剪有黑边的图片,未裁剪图片,原始图
*/
@property (nonatomic, strong) FaceCropImageInfo * cropImageInfo;
@end

View File

@@ -0,0 +1,93 @@
//
// IDLFaceDetectionManager.h
// IDLFaceSDK
//
// Created by Tong,Shasha on 2017/5/18.
// Copyright © 2017年 Baidu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreGraphics/CoreGraphics.h>
@class FaceInfo;
#define TIME_THRESHOLD_FOR_ANOTHER_SESSION 2.0
typedef NS_ENUM(NSUInteger, DetectRemindCode) {
DetectRemindCodeOK = 0, //成功
DetectRemindCodeBeyondPreviewFrame, //出框
DetectRemindCodeNoFaceDetected, //没有检测到人脸
DetectRemindCodeMuchIllumination,
DetectRemindCodePoorIllumination, //光照不足
DetectRemindCodeImageBlured, //图像模糊
DetectRemindCodeTooFar, //太远
DetectRemindCodeTooClose, //太近
DetectRemindCodePitchOutofDownRange, //头部偏低
DetectRemindCodePitchOutofUpRange, //头部偏高
DetectRemindCodeYawOutofLeftRange, //头部偏左
DetectRemindCodeYawOutofRightRange, //头部偏右
DetectRemindCodeOcclusionLeftEye, //左眼有遮挡
DetectRemindCodeOcclusionRightEye, //右眼有遮挡
DetectRemindCodeOcclusionNose, //鼻子有遮挡
DetectRemindCodeOcclusionMouth, //嘴巴有遮挡
DetectRemindCodeOcclusionLeftContour, //左脸颊有遮挡
DetectRemindCodeOcclusionRightContour, //右脸颊有遮挡
DetectRemindCodeOcclusionChinCoutour, //下颚有遮挡
DetectRemindCodeTimeout, //超时
DetectRemindCodeVerifyInitError, //鉴权失败
// DetectRemindCodeVerifyDecryptError,
// DetectRemindCodeVerifyInfoFormatError,
// DetectRemindCodeVerifyExpired,
// DetectRemindCodeVerifyMissRequiredInfo,
// DetectRemindCodeVerifyInfoCheckError,
// DetectRemindCodeVerifyLocalFileError,
// DetectRemindCodeVerifyRemoteDataError,
// DetectRemindCodeDataHitLast
DetectRemindCodeConditionMeet,
DetectRemindCodeDataHitOne
};
typedef NS_ENUM(NSUInteger, TrackDetectRemindCode) {
TrackDetectRemindCodeOK = 0, //成功
TrackDetectRemindCodeImageBlured, //图像模糊
TrackDetectRemindCodePoorIllumination, // 光照不足
TrackDetectRemindCodeNoFaceDetected, //没有检测到人脸
TrackDetectRemindCodeOcclusionLeftEye, //左眼有遮挡
TrackDetectRemindCodeOcclusionRightEye, //右眼有遮挡
TrackDetectRemindCodeOcclusionNose, //鼻子有遮挡
TrackDetectRemindCodeOcclusionMouth, //嘴巴有遮挡
TrackDetectRemindCodeOcclusionLeftContour, //左脸颊有遮挡
TrackDetectRemindCodeOcclusionRightContour, //右脸颊有遮挡
TrackDetectRemindCodeOcclusionChinCoutour, //下颚有遮挡
TrackDetectRemindCodeTooClose, //太近
TrackDetectRemindCodeTooFar, //太远
TrackDetectRemindCodeBeyondPreviewFrame //出框
};
typedef void (^DetectStrategyCompletion) (FaceInfo * faceinfo,NSDictionary * images, DetectRemindCode remindCode);
//typedef void (^TrackDetectStrategyCompletion) (NSArray * faceArray, TrackDetectRemindCode remindCode);
@interface IDLFaceDetectionManager : NSObject
@property (nonatomic, assign) BOOL enableSound;
+ (instancetype)sharedInstance;
/**
* 人脸采集,成功之后返回扣图图片,原始图片
* @param image 镜头拿到的图片
* @param detectRect 预览的Rect
* @param previewRect 检测的Rect
* return completion 回调信息
*/
- (void)detectStratrgyWithNormalImage:(UIImage *)image previewRect:(CGRect)previewRect detectRect:(CGRect)detectRect completionHandler:(DetectStrategyCompletion)completion;
- (void)reset;
-(void)startInitial;
@end

View File

@@ -0,0 +1,114 @@
//
// IDLFaceLivenessManager.h
// IDLFaceSDK
//
// Created by Tong,Shasha on 2017/5/18.
// Copyright © 2017年 Baidu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreGraphics/CoreGraphics.h>
@class FaceInfo;
@class FaceLivenessState;
#define TIME_THRESHOLD_FOR_ANOTHER_SESSION 2.0
typedef NS_ENUM(NSInteger, LivenessActionType) {
LivenessActionTypeLiveEye = 0,
LivenessActionTypeLiveMouth = 1,
LivenessActionTypeLiveYawRight = 2,
LivenessActionTypeLiveYawLeft = 3,
LivenessActionTypeLivePitchUp = 4,
LivenessActionTypeLivePitchDown = 5,
LivenessActionTypeLiveYaw = 6,
LivenessActionTypeNoAction = 7,
};
typedef NS_ENUM(NSUInteger, LivenessRemindCode) {
LivenessRemindCodeOK = 0, //成功
LivenessRemindCodeBeyondPreviewFrame, //出框
LivenessRemindCodeNoFaceDetected, //没有检测到人脸
LivenessRemindCodeMuchIllumination,
LivenessRemindCodePoorIllumination, //光照不足
LivenessRemindCodeImageBlured, //图像模糊
LivenessRemindCodeTooFar, //太远
LivenessRemindCodeTooClose, //太近
LivenessRemindCodePitchOutofDownRange, //头部偏低
LivenessRemindCodePitchOutofUpRange, //头部偏高
LivenessRemindCodeYawOutofLeftRange, //头部偏左
LivenessRemindCodeYawOutofRightRange, //头部偏右
LivenessRemindCodeOcclusionLeftEye, //左眼有遮挡
LivenessRemindCodeOcclusionRightEye, //右眼有遮挡
LivenessRemindCodeOcclusionNose, //鼻子有遮挡
LivenessRemindCodeOcclusionMouth, //嘴巴有遮挡
LivenessRemindCodeOcclusionLeftContour, //左脸颊有遮挡
LivenessRemindCodeOcclusionRightContour, //右脸颊有遮挡
LivenessRemindCodeOcclusionChinCoutour, //下颚有遮挡
LivenessRemindCodeTimeout, //超时
LivenessRemindCodeLiveEye, //眨眨眼
LivenessRemindCodeLiveMouth, //张大嘴
LivenessRemindCodeLiveYawLeft, //向右摇头
LivenessRemindCodeLiveYawRight, //向左摇头
LivenessRemindCodeLivePitchUp, //向上抬头
LivenessRemindCodeLivePitchDown, //向下低头
LivenessRemindCodeLiveYaw, //摇摇头
LivenessRemindCodeSingleLivenessFinished, //完成一个活体动作
LivenessRemindActionCodeTimeout, // 当前活体动作超时
LivenessRemindCodeLeftEyeClosed,
LivenessRemindCodeRightEyeClosed,
LivenessRemindCodeVerifyInitError, //鉴权失败
// LivenessRemindCodeVerifyDecryptError,
// LivenessRemindCodeVerifyInfoFormatError,
// LivenessRemindCodeVerifyExpired,
// LivenessRemindCodeVerifyMissRequiredInfo,
// LivenessRemindCodeVerifyInfoCheckError,
// LivenessRemindCodeVerifyLocalFileError,
// LivenessRemindCodeVerifyRemoteDataError,
LivenessRemindCodeConditionMeet,
LivenessRemindCodeFaceIdChanged, // faceid 发生变化
LivenessRemindCodeDataHitOne
// LivenessRemindCodeDataHitLast,
};
typedef void (^LivenessStrategyCompletion) (NSDictionary * images, FaceInfo *faceInfo, LivenessRemindCode remindCode);
typedef void (^LivenessNormalCompletion) (NSDictionary * images, FaceInfo *faceInfo, LivenessRemindCode remindCode);
/**
* 活体检测过程中,返回活体总数,当前成功个数,当前活体类型
*/
typedef void (^LivenessProcess) (float numberOfLiveness, float numberOfSuccess, LivenessActionType currenActionType);
@interface IDLFaceLivenessManager : NSObject
@property (nonatomic, assign) BOOL enableSound;
+ (instancetype)sharedInstance;
/**
* 人脸活体验证,成功之后返回扣图图片,原始图片
* @param image 镜头拿到的图片
* @param detectRect 预览的Rect
* @param previewRect 检测的Rect
* return completion 回调信息
*/
-(void) livenessNormalWithImage:(UIImage *)image previewRect:(CGRect)previewRect detectRect:(CGRect)detectRect completionHandler:(LivenessNormalCompletion)completion;
/**
* 活体检测过程中,返回活体总数,当前成功个数,当前活体类型
*/
-(void) livenessProcessHandler:(LivenessProcess) process;
- (void)reset;
-(void)startInitial;
/**
* 返回无黑边的方法
* @param array 活体动作数组
* @param order 是否顺序执行
* @param numberOfLiveness 活体动作个数
*/
- (void)livenesswithList:(NSArray *)array order:(BOOL)order numberOfLiveness:(NSInteger)numberOfLiveness;
@end

View File

@@ -0,0 +1,24 @@
//
// IDLFaceSDK.h
// IDLFaceSDK
//
// Created by Tong,Shasha on 2017/5/15.
// Copyright © 2017年 Baidu. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for IDLFaceSDK.
FOUNDATION_EXPORT double IDLFaceSDKVersionNumber;
//! Project version string for IDLFaceSDK.
FOUNDATION_EXPORT const unsigned char IDLFaceSDKVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <IDLFaceSDK/PublicHeader.h>
#import "FaceSDKManager.h"
#import "IDLFaceLivenessManager.h"
#import "IDLFaceDetectionManager.h"
#import "BDFaceUtil.h"
#import "BDFaceQualityUtil.h"

Binary file not shown.

Binary file not shown.

View File

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

View File

@@ -0,0 +1,207 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Headers/BDFaceQualityUtil.h</key>
<data>
fcj/C6f2qlP6eZ5+RCJmWMtAPQ0=
</data>
<key>Headers/BDFaceUtil.h</key>
<data>
VECTCE+71SOsF5RLPGnwLx2SOQg=
</data>
<key>Headers/FaceSDKManager.h</key>
<data>
HtK3UhOfFgE7zgaseOG5WK5QEg4=
</data>
<key>Headers/IDLFaceDetectionManager.h</key>
<data>
3FgLOS0NvbMFpGRtqvEJlav7MuI=
</data>
<key>Headers/IDLFaceLivenessManager.h</key>
<data>
VbXN+PK0Q7IfahU2MI0U5SaPHIQ=
</data>
<key>Headers/IDLFaceSDK.h</key>
<data>
4jVunSoXEW6EIui6HmQGQ/B7GgU=
</data>
<key>Info.plist</key>
<data>
gB1gmw3UfXQHkHkeV5Y7sb7bpDA=
</data>
<key>Modules/module.modulemap</key>
<data>
uTVmiSBEgQ4Qw0TMMpcn7pr7ssU=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/BDFaceQualityUtil.h</key>
<dict>
<key>hash</key>
<data>
fcj/C6f2qlP6eZ5+RCJmWMtAPQ0=
</data>
<key>hash2</key>
<data>
4FebuT7rY9k2JVw4SLUakj7+ixAkjWnoHD+MaQDJSYo=
</data>
</dict>
<key>Headers/BDFaceUtil.h</key>
<dict>
<key>hash</key>
<data>
VECTCE+71SOsF5RLPGnwLx2SOQg=
</data>
<key>hash2</key>
<data>
Hxb8esap8atN28mAw/uztk+/wyRFRJl5Kv7KIYs0naM=
</data>
</dict>
<key>Headers/FaceSDKManager.h</key>
<dict>
<key>hash</key>
<data>
HtK3UhOfFgE7zgaseOG5WK5QEg4=
</data>
<key>hash2</key>
<data>
9xcXJTgHFJL+bQRkxB+pP+i/R4m53mKGg3BtzOl0bvw=
</data>
</dict>
<key>Headers/IDLFaceDetectionManager.h</key>
<dict>
<key>hash</key>
<data>
3FgLOS0NvbMFpGRtqvEJlav7MuI=
</data>
<key>hash2</key>
<data>
5kMvOke/ASfe/WAEL97lR3CVaA99NKplFzR7rU4+nvA=
</data>
</dict>
<key>Headers/IDLFaceLivenessManager.h</key>
<dict>
<key>hash</key>
<data>
VbXN+PK0Q7IfahU2MI0U5SaPHIQ=
</data>
<key>hash2</key>
<data>
/Hk63uC19rBPuUOElYDIMMETOhhWGNf16+qpnjOWbBc=
</data>
</dict>
<key>Headers/IDLFaceSDK.h</key>
<dict>
<key>hash</key>
<data>
4jVunSoXEW6EIui6HmQGQ/B7GgU=
</data>
<key>hash2</key>
<data>
lgQ9lUWcrFfTCL6Di9EwgliVBVZwbncZINzCfW4idDE=
</data>
</dict>
<key>Modules/module.modulemap</key>
<dict>
<key>hash</key>
<data>
uTVmiSBEgQ4Qw0TMMpcn7pr7ssU=
</data>
<key>hash2</key>
<data>
2UWkZrJMmZYFFeU4C525GWZ73nY7N7bcJ+9yd1WwEos=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>