FQLockSDK: iOS手势密码解锁,面容ID解锁,指纹解锁

FQLockSDK

iOS手势密码解锁,面容ID解锁,指纹解锁

Github地址

项目演示

更新记录

版本更新内容日期
1.0.3- 增加外心圆背景色br>- helper类放在工具类2023-08-07
1.0.2- 优化面容识别超过次数的code2023-01-29
1.0.1- 手势密码连接线优化
- 增加锁外心圆背景颜色
2022-10-18
1.0- 初始版本
- 支持手势密码解锁,面容ID解锁,指纹解锁
2022-10-06

功能介绍

  • 支持手势密码解锁
  • 支持面容ID解锁
  • 支持指纹解锁
  • SDK支持bitcode

集成方式

手动集成

  1. 把项目cloneDownload ZIP到本地
  2. 把项目内的FQLockSDK.framework拖到你的项目里
    image
  3. 如果项目报错 Library not loaded: @rpath/FQLockSDK.framework/FQLockSDK, 设置 Embed&Sign
    image
  4. 如果项目报错Building for iOS Simulator, but the linked and embedded framework 'FQLockSDK.framework' was built for iOS + iOS Simulator.
    解决方法是: Buil Settings --> Build Options --> Validate Workspace 改为Yes
    image

cocoaPods自动集成

这里默认大家对cocoaPods都是信手拈来的

  1. 在Podfile引入
pod 'FQLockSDK'

或者

pod 'FQLockSDK', '~> 1.0.3'
  1. 在终端 cd 到你的项目根路径
  • 下载
pod install

或者

pod install --no-repo-update
  • 更新
pod update

或者

pod update FQLockSDK --no-repo-update

使用案列

  1. 先配置 Info.plist 权限
    Privacy - Face ID Usage Description - 若要使用人脸解锁,需要您同意App访问您的面容ID
    image

  2. 在用到密码解锁的地方引用头文件

    #import <FQLockSDK/FQLockSDK.h>
    
  3. 初始化 FQLockGestureView

    self.lockConfig = [[FQLockConfig alloc] init];
    self.lockConfig.lockType = self.lockType;
    //你的APP业务逻辑和用户无关,就可以全程不用userID
    self.lockConfig.passwordKey = [NSString stringWithFormat:@"%@_%@", kPassword, self.userID];
    self.lockConfig.lockViewCenterY = self.view.frame.size.height * 0.5;
    self.lockView = [[FQLockGestureView alloc] initWithConfig:self.lockConfig];
    self.lockView.delegate = self;
    [self.view addSubview:self.lockView];
    
  4. 遵循代理FQGestureLockViewDelegate

    @interface ViewController ()<FQGestureLockViewDelegate>
    
    @end
    
  5. 实现代理方法

#pragma mark - <FQGestureLockViewDelegate>

/// 连线个数少于最少连接数,通知代理
/// @param view LockView
/// @param type <#type description#>
/// @param gesture 手势密码
- (void)fq_gestureLockView:(FQLockGestureView *)view type:(FQGestureLockType)type connectNumberLessThanNeedWithGesture:(NSString *)gesture {

}

/// 第一次设置手势密码
/// @param view LockView
/// @param type <#type description#>
/// @param gesture 第一次手势密码
- (void)fq_gestureLockView:(FQLockGestureView *)view type:(FQGestureLockType)type didCompleteSetFirstGesture:(NSString *)gesture {

}

/// 第二次设置手势密码
/// @param view LockView
/// @param type <#type description#>
/// @param gesture 第二次手势密码
/// @param equal 第二次和第一次的手势密码匹配结果
- (void)fq_gestureLockView:(FQLockGestureView *)view type:(FQGestureLockType)type didCompleteSetSecondGesture:(NSString *)gesture result:(BOOL)equal {
    if (equal) {        
    } else {
    }
}

/// 验证手势密码
/// - Parameters:
///   - view: LockView
///   - type: <#type description#>
///   - gesture: 验证的手势密码
///   - equal: 验证是否通过
- (void)fq_gestureLockView:(FQLockGestureView *)view type:(FQGestureLockType)type didCompleteVerifyGesture:(NSString *)gesture result:(BOOL)equal {
    if (equal) {
    } else {
    }
}

关注我~ 分享更多开发经验,一起成长~
Github地址
Github地址
Github地址

接口函数说明 /*============================================================================= 函数名: TP_Configuration ; 功 能:动态库初始化配置, 完成门锁类型选择/发卡器连接等 输 入:lock_type -- 门锁类型(也就是使用的卡片类型): 4-RF57门锁; 5-RF50门锁 输 出: 无 返回值:错误类型 =============================================================================*/ int __stdcall TP_Configuration(int lock_type); /*============================================================================= 函数名: TP_MakeGuestCardEx ; 功 能:制作宾客卡 输 入:room_no -- 门锁号: 字符串, 例如 "1.2.8102"等 checkin_time -- 入住时间: 预留. 制卡时入住时间被强制为当前时间!!! checkout_time -- 预离时间: 年月日时分秒, 字符串格式 "YYYY-MM-DD hh:mm:ss" iflags -- 宾客卡选项, 一般置0. iflags的各种赋值解释如下: 1: 表示允许开反锁 8: 表示复制卡, 不顶替前卡(可以跟之前发的卡片一起用, 允许一个房间发多张卡片) 32: 表示一次性开门, 开门后失效 128: 表示检测卡片的入住时间(如果卡片入住时间 > 门锁当前时间, 则不能开门, 不建议用这个选项) 上述各属性值可以相加进行组合. 如果iflags ==0, 表示会顶替前卡,刷卡后之前的卡片失效; 不是一次性开门卡; 不检测卡片的入住时间 输 出: card_snr -- 卡号: 字符串, 至少预分配20字节 例 子1: room_no="1.2.8102", SDateTime="", EDateTime="2008-06-07 12:00:00" iFlags=8 !!!!!!!!(复制卡) 返回值:错误类型 说明: Room要输入 门锁号!! 其格式视门锁管理软件而定, 请查看门锁管理软件的"客房设置"界面. 如果门锁管理软件中没有门锁号, 则请输入房号. =============================================================================*/ int __stdcall TP_MakeGuestCardEx(char *card_snr, char *room_no, char *checkin_time,char *checkout_time, int iflags); /*============================================================================= 函数名: TP_ReadGuestCardEx ; 功 能:读宾客卡信息 输 入:无。 输 出: card_snr -- 卡号: 字符串, 至少预分配20字节 room_no -- 房号: 字符串, 至少预分配20字节 checkin_time -- 入住时间: 年月日时分秒, 字符串格式 "YYYY-MM-DD hh:mm:ss", 至少预分配30字节 checkout_time -- 预离时间: 年月日时分秒, 字符串格式 "YYYY-MM-DD hh:mm:ss", 至少预分配30字节 iFlags -- 卡片标志字节 返回值:错误类型 =============================================================================*/ int __stdcall TP_ReadGuestCardEx(char *card_snr,char *room_no, char *checkin_time, char *checkout_time, int *iFlags); /*============================================================================= 函数名: TP_CancelCard ; 功 能:注销卡片/卡片回收 输 入: 无 输 出: 输 出: card_snr -- 卡号: 字符串, 至少预分配20字节 返回值:错误类型 =============================================================================*/ int __stdcall TP_CancelCard(char *card_snr); /*============================================================================= 函数名: TP_GetCardSnr ; 功 能:读取卡号(卡片的唯一的序列号) 输 入: 无 输 出: card_snr -- 卡号: 字符串, 至少预分配20字节 返回值:错误类型 =============================================================================*/ int __stdcall TP_GetCardSnr(char *card_snr); ////////////////////// 以下函数供酒管软件进行会员卡管理 /////////////////////// /*============================================================================= 函数名: TP_M1Active 功 能:卡片激活(读取卡号) 参 数:无 输 出: card_snr -- 卡号, 4字节(字符串表示为8个字符) 返回值:错误类型 描 述:卡片激活 =============================================================================*/ int __stdcall TP_M1Active(char *card_snr); /*============================================================================= 函数名: TP_M1AuthKey 功 能:验证卡片密钥 参 数:keyA: 密钥, 六字节, 卡片的默认密钥是 "ffffffffffff" sector_no: 扇区号, 1~40 返回值:错误类型 描 述:验证卡片的相应扇区的密钥, 验证过后才可以读写 例 子:keyA = "ffffffffffff", sector_no = 3 =============================================================================*/ int __stdcall TP_M1AuthKey(char *keyA, UINT sector_no); /*============================================================================= 函数名: TP_M1SetKeyA 功 能:修改密钥A 参 数:NewKeyA: 新密钥A, 六字节, 用字符串表示(12个字符) sector_no: 扇区号 返回值:错误类型 描 述:修改卡片密钥A, 注意要先用AuthKey验证原密钥. 注意函数调用顺序: TP_M1Active → TP_M1AuthKey → TP_M1SetKeyA 例 子:newKeyA = "ffffffffffff", sector_no = 3 =============================================================================*/ int __stdcall TP_M1SetKeyA(char *newKeyA, UINT sector_no); /*============================================================================= 函数名: TP_M1WriteBlock 功 能:写数据 参 数:block_no: 块号(一般是扇区号*4 + 扇区内块号) data: 要写入的16字节数据, 用字符串表示(32个字符,只能是0~9和A~F, a~f ) 返回值:错误类型 描 述:写一块数据. 必须先用TP_M1AuthKey验证密钥 ; 例如, 扇区9可以读写的块号包括: 9x4 9x4+1 9x4+2, 即: 36 37 38块. 注意函数调用顺序: TP_M1Active → TP_M1AuthKey → TP_M1WriteBlock 例 子:block_no = 3x4 = 12, data = "112233445566778899AABBCCDDEEFF" =============================================================================*/ int __stdcall TP_M1WriteBlock(UINT block_no, char *data); /*============================================================================= 函数名: TP_M1ReadBlock 功 能:读数据 参 数:block_no: 块号(一般是扇区号*4 + 扇区内块号) 输 出: data: 16字节数据, 用字符串表示(32个字符) 返回值:错误类型 描 述:读取一块. 必须先用TP_M1AuthKey验证密钥. 注意函数调用顺序: TP_M1Active → TP_M1AuthKey → TP_M1ReadBlock =============================================================================*/ int __stdcall TP_M1ReadBlock(UINT block_no, char *data); 关于M1卡的简单说明: 1. 卡片有16个扇区,编号从0~15;每个扇区可以设置独立的密码; 2. 每个扇区里面有4个块,编号从0~3, 只可以读写0~2块。 3. 读卡和写卡时要用 "扇区号x4 + 扇区内块号", 扇区9可以读写的块号包括: 9x4 9x4+1 9x4+2, 即: 36 37 38块. 4. 要避开门锁使用的扇区,门锁一般使用扇区1、扇区11、扇区15等, 具体可咨询门锁厂家;
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuwuFQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值