iOS实名认证模块的具体实现过程(swift)
实名认证是当前APP的一个基础功能了,今天我集成了实名认证模块在iOS应用中的具体实现步骤,结合技术细节与最佳实践:
一、手机号验证
1. 发送短信验证码
- 技术实现:
// 使用Alamofire调用第三方短信API AF.request("https://sms-api.com/send", method: .post,parameters: ["phone": phoneNumber, "templateId": "123"]).validate().responseJSON { response in// 处理发送结果}
- 自动填充优化:
import AuthenticationServices class SMSAutoFillViewController: UIViewController, ASAuthorizationControllerDelegate {func setupSMSAutoFill() {let provider = ASAuthorizationAppleIDProvider()let request = provider.createRequest()request.requestedScopes = [.fullName, .email]let controller = ASAuthorizationController(authorizationRequests: [request])controller.delegate = selfcontroller.performRequests()} }
2. 验证码校验
- 本地缓存验证:
// 使用Keychain存储验证码(加密) let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword,kSecAttrAccount as String: "sms_code",kSecValueData as String: code.data(using: .utf8)! ] SecItemAdd(query as CFDictionary, nil)
二、身份证验证
1. 证件拍摄与OCR识别
-
调用摄像头拍摄:
let captureSession = AVCaptureSession() let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) // 添加视频输入输出流 let videoInput = try AVCaptureDeviceInput(device: videoDevice!) captureSession.addInput(videoInput)let output = AVCapturePhotoOutput() captureSession.addOutput(output)
-
OCR集成示例(阿里云API):
func recognizeIDCard(image: UIImage) {let ocrRequest = AliyunOCRRequest(image: image)ocrRequest.detectType = "IDCard"AliyunOCRClient.shared.recognize(ocrRequest) { result inswitch result {case .success(let data):parseOCRData(data)case .failure(let error):showError("识别失败: \(error.localizedDescription)")}} }
2. 身份证真实性校验
- 算法校验(18位身份证校验码验证):
func validateIDNumber(_ id: String) -> Bool {guard id.count == 18 else { return false }let factors = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]let checksumMap = ["1","0","X","9","8","7","6","5","4","3","2"]let sum = id.enumerated().prefix(17).map { index, char inInt(String(char))! * factors[index]}.reduce(0, +)return String(id.last!) == checksumMap[sum % 11] }
三、人脸识别与活体检测
1. ARKit活体检测
- 动作捕捉实现:
class FaceTrackingVC: UIViewController, ARSessionDelegate {let arSession = ARSession()func setupAR() {let config = ARFaceTrackingConfiguration()arSession.delegate = selfarSession.run(config)}func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {guard let faceAnchor = anchors.first as? ARFaceAnchor else { return }// 检测眨眼动作(blendShapes[.eyeBlinkLeft]值变化)if faceAnchor.blendShapes[.eyeBlinkLeft]?.doubleValue ?? 0 > 0.5 {// 记录眨眼动作完成}} }
2. 云端人脸比对
- 调用阿里云API示例:
func compareFaces(idCardImage: UIImage, liveFaceImage: UIImage) {let request = AliyunFaceCompareRequest()request.idCardImage = idCardImage.jpegData(compressionQuality: 0.8)request.liveImage = liveFaceImage.jpegData(compressionQuality: 0.8)AliyunFaceService.shared.compareFaces(request) { result inif result.similarity > 0.85 {// 验证通过}} }
四、安全与合规实现
1. 数据传输加密
- HTTPS证书绑定:
let session = URLSession(configuration: .default, delegate: SSLPinningDelegate(), delegateQueue: nil)class SSLPinningDelegate: NSObject, URLSessionDelegate {func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge,completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {// 验证服务器证书指纹} }
2. 敏感数据存储
- Keychain存储示例:
func saveToKeychain(data: Data, key: String) -> Bool {let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword,kSecAttrAccount as String: key,kSecValueData as String: data]return SecItemAdd(query as CFDictionary, nil) == errSecSuccess }
3. 合规性处理
- 隐私权限弹窗:
if #available(iOS 14, *) {ATTrackingManager.requestTrackingAuthorization { status in// 处理授权状态} }
五、异常处理与日志
1. 错误类型定义
enum AuthError: Error {case smsCodeExpiredcase ocrRecognitionFailedcase faceMismatch(similarity: Double)case livenessCheckFailed(action: String)
}
2. 日志记录
import os.log
let authLogger = OSLog(subsystem: "com.yourapp.auth", category: "authentication")func logAuthEvent(message: String) {os_log("%{public}@", log: authLogger, type: .info, message)
}
六、完整流程示例
func startRealNameAuth() {// Step 1: 手机验证sendSMSCode(phone: "+8613812345678") { success inguard success else { return }// Step 2: 身份证OCRcaptureIDCard { image inrecognizeIDCard(image) { idInfo inguard validateIDNumber(idInfo.number) else { return }// Step 3: 人脸比对performLivenessCheck { faceImage incompareFaces(idCardImage: idInfo.photo, liveFaceImage: faceImage) { result inif result.success {completeAuth()}}}}}}
}
关键注意事项
-
性能优化:
- 使用
Core Image
的CIContext
实现多线程图像处理 - 对OCR识别结果建立本地缓存,减少重复请求
- 使用
-
用户体验:
- 添加证件边框识别引导(使用
Vision
的VNDetectRectanglesRequest
) - 活体检测时通过
AVSpeechSynthesizer
提供语音指引
- 添加证件边框识别引导(使用
-
灾备方案:
- 当自动识别失败时,允许手动输入身份证信息
- 提供人工审核通道(上传照片+视频验证)
-
法律要求:
- 在《隐私协议》中明确说明生物特征数据的使用范围
- 提供永久性账号注销入口,支持彻底删除生物数据
如需进一步优化,可以考虑:
- 使用
Metal Performance Shaders
加速图像处理 - 通过
Combine
框架实现验证状态的状态机管理 - 对关键操作添加区块链存证(如使用Hyperledger Fabric)
相关文章:
iOS实名认证模块的具体实现过程(swift)
实名认证是当前APP的一个基础功能了,今天我集成了实名认证模块在iOS应用中的具体实现步骤,结合技术细节与最佳实践: 一、手机号验证 1. 发送短信验证码 技术实现:// 使用Alamofire调用第三方短信API AF.request("https://s…...
UE5定序器中摇臂挂载摄像机 让摄像机始终朝向目标
1. 搭建摄像机摇臂并加入 Sequencer 在关卡中: Cinematics → Add Level Sequence,新建并打开一个 Level Sequence。 在视口里 右键 → Cinematic → Cine Camera Actor Rig → Crane,放一个 CameraRig_Crane。 默认 Crane 自带一个 CineCa…...
Redis BigKey 问题是什么
BigKey 问题是什么 BigKey 的具体表现是 redis 中的 key 对应的 value 很大,占用的 redis 空间比较大,本质上是大 value 问题。 BigKey怎么找 redis-cli --bigkeysscanBig Key 产生的原因 1.redis数据结构使用不恰当 2.未及时清理垃圾数据 3.对业务预…...
硬件中断请求号和lspci命令查看到的device id有关系吗?
这是我忽然想到的一个人问题 硬件中断请求号(IRQ)与lspci命令查看到的设备ID(Device ID)没有直接对应关系,但两者在系统硬件管理中通过以下方式间接关联: 一、硬件层面的独立标识 Device ID的本质…...
Qt 中 QWidget涉及的常用核心属性介绍
欢迎来到干货小仓库 一匹真正的好马,即使在鞭子的影子下,也能飞奔 1.enabled API说明isEnabled()获取到控件的可用状态setEnabled()设置控件是否可使用.true:可用,false:禁用 禁用:指该控件不能接收任何用…...
编程日志5.3
串的习题 1.Problem - 2030 #include<iostream> using namespace std; int main() { char s[500]; int n; cin >> n; getchar();//去掉空格部分 while (n--) { gets(s);//老式写法 vs显示错误题目解答正确 int cnt 0; …...
sql的性能分析
慢查询日志:通过慢查询日志需要优化的sql语句。 慢查询日志记录了所有执行时间超过指定参数的所有sql语句。 开启慢日志查询开关:show_query_log1 设置慢查询日志的时间:long_query_time?。 show variables like ‘slow_query_log’&…...
JAVA 锁—— synchronized
32 位机器上java对象头中,markWord 示意图如上所示,64 位机器扩展前面标识位数,如 hashcode(25 -> 31),线程ID(23 -> 54) 如果启用了偏向锁: synchronized添加偏向锁:只有1个线程加锁的情况下&#…...
游戏引擎学习第274天:基于弹簧的动态动画
回顾前一天内容,并为今天的工作设定目标 我们昨天展示了一些内容,现在先回顾一下昨天的进展。我们目前正在处理的是角色跳跃的动画——特别是身体部分的跳跃。 现在角色的动画状态如下: 正在实现角色的移动和跳跃。跳跃中已经加入了一些预备…...
【英语笔记(二)】句子成分、基本句型;简单描述十大词类与从句的分类、助动词和非谓语动词的使用
1. 介词 at, in, on 的用法区别 1.1 表示时间的区别 1. 表示时间的某一点、某一时刻或年龄等用 at。如: I get up at six in the morning. 我早上六点钟起床。He got married at the age of 25. 他 25 岁结婚。 2. 泛指一般意义的上午、下午或晚上以及月或年等较…...
TAPIP3D:持久3D几何中跟踪任意点
简述 在视频中跟踪一个点(比如一个物体的某个特定位置)听起来简单,但实际上很复杂,尤其是在3D空间中。传统方法通常在2D图像上跟踪像素,但这忽略了物体的3D几何信息和摄像机的运动,导致跟踪不稳定…...
RabbitMQ的工作队列模式和路由模式有什么区别?
RabbitMQ 的工作队列模式(Work Queues)和路由模式(Routing)是两种不同的消息传递模式,主要区别在于消息的分发逻辑和使用场景。以下是它们的核心差异: 1. 工作队列模式(Work Queues)…...
armv7 backtrace
ref: ARM Cortex-M3/M4/M7 Hardfault异常分析_arm hardfault-CSDN博客...
Python并发编程:开启性能优化的大门(7/10)
1.引言 在当今数字化时代,Python 已成为编程领域中一颗璀璨的明星,占据着编程语言排行榜的榜首。无论是数据科学、人工智能,还是 Web 开发、自动化脚本编写,Python 都以其简洁的语法、丰富的库和强大的功能,赢得了广大…...
泰勒展开式
常用的 泰勒展开式(Taylor series expansion)是指把一个函数在某点的邻域内展开成幂级数的形式。以函数 f ( x ) f(x) f(x) 在点 a a a 处展开为例,其泰勒展开式为: f ( x ) f ( a ) f ′ ( a ) ( x − a ) f ′ ′ ( a ) 2 …...
深入理解 Polly:.NET Core 中的健壮错误处理策略
在现代软件开发中,错误处理是构建高可用、健壮系统的关键之一。尤其是当应用依赖外部服务(如 API、数据库或其他网络资源)时,临时的服务中断、超时或其他不可预见的错误都会影响应用的稳定性。为了提升系统的容错能力,…...
【Bootstrap V4系列】学习入门教程之 组件-巨幕(Jumbotron)和列表组(List group)
Bootstrap V4系列 学习入门教程之 组件-巨幕(Jumbotron)和列表组(List group) 一、巨幕(Jumbotron)1.1 带有圆角1.2 全宽且无圆角 二、列表组(List group)2.1 Basic example2.2 Acti…...
02.three官方示例+编辑器+AI快速学习webgl_animation_skinning_blending
本实例主要讲解内容 这个示例展示了Three.js中骨骼动画混合(Skeletal Animation Blending)的实现方法,通过加载一个士兵模型,演示了如何在不同动画状态(如站立、行走、跑步)之间进行平滑过渡。核心技术包括动画混合器(AnimationM…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1商用服务开通教程以及模型体验
在当今数字化浪潮迅猛推进的时代,云计算与人工智能技术的深度融合正不断催生出众多创新应用与服务,为企业和个人用户带来了前所未有的便利与发展机遇。本文将重点聚焦于在华为云这一行业领先的云计算平台上,对 DeepSeek-V3/R1 商用服务展开的…...
大语言模型通过MCP控制STM32-支持Ollama、DeepSeek、openai等
MCP控制STM32 MCP部分 1.下载源码 git clone https://github.com/ana52070/MCP_Control_STM32.git cd MCP_Control_STM32 cd mcp-led_oled2. 创建并激活虚拟环境 为了避免不同项目之间的依赖冲突,建议使用虚拟环境。根据你的操作系统和 Python 版本,…...
Linux-Ubuntu安装Stable Diffusion Forge
SD Forge在Win上配置起来相对简单且教程丰富,而在Linux平台的配置则稍有门槛且教程较少。本文提供一个基于Ubuntu24.04发行版(对其他Linux以及SD分支亦有参考价值)的Stable Diffusion ForgeUI安装配置教程,希望有所帮助 本教程以N…...
LoRA(Low-Rank Adaptation)原理详解
LoRA(Low-Rank Adaptation)原理详解 LoRA(低秩适应)是一种参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)技术,旨在以极低的参数量实现大模型在特定任务上的高效适配。其核心思想基于低秩分解假设,即模型在适应新任务时,参数更新矩阵具有低秩特性,可用少量参…...
分享一个可以用GPT打标的傻瓜式SD图片打标工具——辣椒炒肉图片打标助手
一、打标效果展示 请参考下图,了解最终的打标效果: 打标速度提升百分之300; 打标成本: gpt4o每百张图约5毛rmb; gpt4o-mini价格更低; 更有claude,grok,gemini,豆包等…...
实战项目2(03)
目录 任务场景一【重点】 【sw1配置】 【sw2配置】 任务场景二【重点】 【sw1配置】 【sw2配置】 【sw3配置】 任务场景一【重点】 掌握基于SVI实现跨VLAN通信——某公司网络为了减少广播包对网络的影响,网络管理员对网络进行了VLAN划分,完成VLA…...
PyCharm软件下载和配置Python解释器
以下是详细的PyCharm下载及解释器环境配置步骤: 有什么问题可以留评论(看见会回复的) 一、PyCharm下载 1. 访问官网 进入JetBrains官网:https://www.jetbrains.com/pycharm/ 2. 选择版本 Community版(免费&…...
《从零构建一个简易的IOC容器,理解Spring的核心思想》
大家好呀!今天我们要一起探索Java开发中最神奇的魔法之一 —— Spring框架的IOC容器!🧙♂️ 我会用最最最简单的方式,让你彻底明白这个看似高深的概念。准备好了吗?Let’s go! 🚀 一、什么是IOC容器&…...
差分与位移算子
差分与位移算子是数值分析和离散数学中处理序列或离散函数的重要工具。它们通过算子代数简化差分的计算和分析,以下是关键概念和关系的总结: 1. 位移算子(Shift Operator) 定义: 位移算子 ( E ) 将函数 ( f(x) ) 沿自变…...
Robot之VideoMimic:《Visual Imitation Enables Contextual Humanoid Control》翻译与解读
Robot之VideoMimic:《Visual Imitation Enables Contextual Humanoid Control》翻译与解读 导读:这篇论文介绍了VIDEOMIMIC,一个基于视觉模仿的真实到模拟到真实流水线,用于训练人形机器人执行上下文相关的全身动作。该方法通过分…...
【Java学习日记34】:this关键字和成员变量
为什么不需要加 this? 作用域规则: Java编译器在查找变量时遵循“就近原则”。 先在当前方法内查找局部变量或参数。 若找不到,则去类的成员变量中查找。 getName() 的上下文: 该方法没有参数或局部变量名为 name,因…...
包名查看器APP:高效管理手机应用的实用工具
包名查看器APP是一款功能强大的文件查看软件,专为安卓用户设计,能够帮助用户快速了解手机上安装和未安装的APK包信息。作为酷安首发的APK信息查看工具,它提供了比系统设置更详细的信息,如版本号、包名、MD5等,帮助用户…...
左右括号的最小处理次数
1、题目描述 多多君在处理一个由左结号(和右语号)组成的字符串,多多君每次处理时可以顺序读取一个字符或者一个有效括号子串,求问多多的最小处理次数。 输入描述: 第一行为一个整数N,表示字符串长度(1<…...
22.第二阶段x64游戏实战-分析周围对象类型
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:21.第二阶段x64游戏实战-分析采集物偏移 上一个内容里发现采集物的名字通过我们…...
【C/C++】无符号调试:GDB解栈实战指南
文章目录 无符号调试:GDB解栈实战指南1 生成并加载 Core Dump2 查看原始堆栈信息(地址形式)3 确认加载的共享库地址范围4 手动转换地址为函数名5 反汇编关键代码段6 加载外部符号文件(如有)7 结合系统库文档分析8 示例…...
梦熊联盟:202505基础语法-题解
202505基础语法-题解 T1 - 九的倍数 解法: 对于 9 的倍数,只需要判定其各位的数码和是否为 9 的倍数即可。 例如判断一个数是不是 9 的倍数,只要判断其各位数字之和是不是 9 的倍数,因为一个数能被 9 整除当且仅当它的各位数字之和…...
Java SE(11)——内部类
1.内部类 定义:Java中的内部类(Inner Class)是指在一个类的内部定义的类。 使用场景:当一个类的内部,存在一个部分需要完成的结构进行描述,而该内部结构只为外部类提供服务,那么这个内部结构就可以使用内部类ÿ…...
优化审核模块响应时间从8s降至1.2s的数据库解决方案
优化审核模块响应时间从8s降至1.2s的数据库解决方案 要优化审核模块的数据库性能,需要从多个层面进行分析和优化。以下是具体的SQL语句设计和优化方案: 1. 分析当前性能瓶颈 首先需要找出慢查询: -- 查看慢查询日志中的审核模块相关查询 …...
YOLO-World:基于YOLOv8的开放词汇目标检测
文章目录 前言1、出发点2、方法2.1.TextEncoder2.2.ReparmVLPAN2.3.输出头 3、实验3.1.数据集3.2.LVIS测试集 总结 前言 本文介绍一篇来自腾讯的开放词汇检测工作,发表自CVPR2024,论文链接,开源地址。 1、出发点 GroundingDINO在开放词汇检测…...
NX989NY104美光科技芯片NY109NY113
NX989NY104美光科技芯片NY109NY113 存储市场新势力:美光科技的崛起与技术突围 在半导体行业波澜壮阔的浪潮中,美光科技宛如一颗璀璨的明珠,以其独特的技术实力和敏锐的市场洞察力,在存储领域占据了重要的一席之地。尤其是其旗下…...
LabVIEW的PID参数自适应控制
在工业控制领域,PID 控制凭借结构简单、稳定性好、工作可靠等优点被广泛应用。然而,传统固定参数的 PID 控制在面对复杂多变的工况时,控制效果往往难以达到最优。基于 LabVIEW 实现 PID 控制根据情况选择参数(即参数自适应调整&am…...
Quartus与Modelsim-Altera使用手册
目录 文章内容: 视频内容: Quartus: ModelSim: 顶层设计与子模块: 只是对所查阅的相关文章的总结与视频总结 文章内容: 这篇对基础操作很详细: 一、Quartus II软件的使用_quartus2软件上…...
设计模式之工厂模式(二):实际案例
设计模式之工厂模式(一) 在阅读Qt网络部分源码时候,发现在某处运用了工厂模式,而且编程技巧也用的好,于是就想分享出来,供大家参考,理解的不对的地方请多多指点。 以下是我整理出来的类图: 关键说明&#x…...
数据可视化大屏——智慧社区内网比对平台
综述分析: 智慧社区内网数据比对信息系统 这段代码实现了一个智慧社区内网数据比对信息系统的前端界面,采用三栏式布局展示各类社区安全相关数据。界面主要由左侧数据统计、中间地图展示和右侧数据分析三部分组成,使用了多种图表可视化技术…...
Spark任务调度流程详解
1. 核心调度组件 DAGScheduler:负责将Job拆分为Stage,处理Stage间的依赖关系。 TaskScheduler:将Task分配到Executor,监控任务执行。 SchedulerBackend:与集群管理器(如YARN、K8s)通信&#x…...
LeetCode 215题解 | 数组中的第K个最大元素
数组中的第K个最大元素 一、题目链接二、题目三、算法原理四、编写代码 一、题目链接 数组中的第K个最大元素 二、题目 三、算法原理 法一:排序 法二:优先级队列(堆) 重点看法二: 默认建大堆,意味着以…...
探秘 Cursor 核心:解锁系统提示词的进阶之路
在 AI 编程领域,Cursor 无疑是一颗耀眼的明星,其母公司 Anysphere 在短短三个月内,估值从 25 亿美元狂飙至 100 亿美元,这样的发展速度令人咋舌。而 Cursor 强大功能背后的核心 —— 系统提示词,始终笼罩着一层神秘的面…...
ElasticSearch入门详解
1.ElasticSearch 1.1 ElasticSearch(简称es) Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。 能够达到实时搜索,稳定,可靠,快速,安装使用方便。 客户端支持Java、.NET(C#)、PHP、Py…...
【计算机网络01】 网络组成与三种交换方式
【参考资料】 《自顶向下的计算机网络第八版》湖科大计算机网络(b站)王道考研(b站) 文章目录 一、网络基础概念解析1.1 网络、互联网与因特网 二、因特网发展三阶段(了解)三、ISP3.1 ISP基本概念3.2 基于I…...
计算机网络——以太网交换机
目录 交换机的作用 以太网交换机的自学习功能 因为以太网交换机有自学习功能,所以以太网交换机支持即插即用 交换机的作用 它工作在数据链路层,为结点转发帧,并且可以根据一个帧的目的MAC地址去进行相应的转发,以及交换机的每…...
机器视觉开发教程——C#如何封装海康工业相机SDK调用OpenCV/YOLO/VisionPro/Halcon算法
目录 引言前期准备Step1 创建工程Step2 创建接口2.1定义操作相机实例接口方法2.2定义设置相机参数接口方法(部分) Step3 创建基类3.1定义操作相机实例&&设置相机参数的抽象层3.2定义操作相机实例&&设置相机参数的公用方法1.获取当前帧图…...
c++STL-string的模拟实现
cSTL-string的模拟实现 string的模拟实现string的模拟线性表的实现构造函数析构函数获取长度(size)和获取容量(capacity)访问 [] 和c_str迭代器(iterator)交换swap拷贝构造函数赋值重载(&#x…...