<!--
* @Author: 梅继高
* @Date: 2021-12-07 21:07:27
* @LastEditTime: 2025-06-17 16:40:57
* @LastEditors: Dengni8023
* @Description:
* @FilePath: /JGSourceBase/JGSourceBase/JGSSecurityKeyboard/README.md
* Copyright © 2021 MeiJigao. All rights reserved.
-->
# `JGSourceBase`自定义安全键盘
`JGSSecurityKeyboard`使用手册及方案介绍
[TOC]
## `JGSourceBase`自定义安全键盘设计
`iOS`自定义安全键盘需要修改输入框的`inputView`属性为`JGSSecurityKeyboard`实例,该属性一般在文本框初始化时指定。
```mermaid
flowchart LR
subgraph UseSafeKeyboard[使用自定义安全软件盘]
start(UITextInput协议输入组件<br/>初始化) --设置inputView--> 安全软件盘{JGSSecurityKeyboard} --inputView = JGSSecurityKeyboard安全软件盘实例--> stop(完成安全软件盘配置)
subgraph 安全软件盘
CheckSwitch -->|数字输入0-9.| numer[JGSSecurityKeyboard<br/>+numberKeyboardWithTextField:title:] --> inputView[JGSSecurityKeyboard实例] --> keyboardPrperties[键盘属性配置]
CheckSwitch -->|中国居民身份证输入0-9X| idNo[JGSSecurityKeyboard<br/>+idCardKeyboardWithTextField:title:] --> inputView
CheckSwitch -->|通用安全输入| common[JGSSecurityKeyboard<br/>+keyboardWithTextField:title:] --> inputView
keyboardPrperties --> aesEncryptInputCharByChar[是否使用AES逐字符加密<br/>默认关闭<br/>关闭时整体内容AES加密]
keyboardPrperties --> randomPad[是否开启非数字键盘随机顺序<br/>默认关闭]
keyboardPrperties --> randomNumPad[是否开启数字键盘随机顺序<br/>默认开启]
keyboardPrperties --> enableFullAngle[是否开启全角符号输入<br/>默认关闭]
keyboardPrperties --> enableHighlightedWhenTap[是否允许非录屏时点击高亮<br/默认开启>]
end
end
```
```mermaid
flowchart LR
subgraph SafeKeyboardInit[安全软件盘随机布局]
start(键盘初始化) --> 键盘按键[keyboardKeys] --> sortKeys[键位排序+分组] --> addKeys[按键位添加按键] --> drawKeys[drawRect<br/>绘制展示图形内容的功能按钮] --> stop(完成随机布局)
subgraph 键盘按键
boardType{键盘类型} -->|英文字符键盘| charKeys[a-z] --> boardKeys[键盘输入按键]
boardType{键盘类型} -->|数字输入<br/>中国居民身份证输入| numKeys[0-9] --> boardKeys
boardType{键盘类型} -->|符号键盘| fullAngle{全半角} --是--> fullWithNum{是否混合数字} --是--> fullNumSym[数字+部分全角符号] --> boardKeys
fullWithNum --否--> fullSym[全角符号] --> boardKeys
fullAngle --否--> halfWithNum{是否混合数字} --是--> halfNumSym[数字+部分半角符号] --> boardKeys
halfWithNum --否--> halfSym[半角符号] --> boardKeys
end
end
```
```mermaid
flowchart LR
subgraph SafeKeyboardInputText[安全软件盘输入]
input[用户输入内容] --> keyboardInputText[keyboardInputText:] --> jg_keyboardInputText[jg_keyboardInputText<br/>输入组件delegate方法处理] --> JGSSwizzing_setText --> stop(完成输入)
subgraph JGSSwizzing_setText[hook系统组件setText:方法]
setJg_securityOriginText --> setText[逐字符替换输入内容<br/>填充文本框]
subgraph setJg_securityOriginText[jg_securityOriginText存储原始输入内容]
AES[AES加密原始内容] --加密后密文--> record[内存记录存储]
end
end
end
```
```mermaid
flowchart LR
subgraph SafeKeyboardInit[安全软件盘随机布局]
start(键盘初始化) --> 键盘按键[keyboardKeys] --> 键位排序+分组[sortKeys] --> addKeys[按键位添加按键] --> drawKeys[drawRect<br/>绘制展示图形内容的功能按钮] --> stop(完成随机布局)
subgraph 键盘按键
boardType{键盘类型} -->|英文字符键盘| charKeys[a-z] --> boardKeys[键盘输入按键]
boardType{键盘类型} -->|数字输入<br/>中国居民身份证输入| numKeys[0-9] --> boardKeys
boardType{键盘类型} -->|符号键盘| fullAngle{全半角} --是--> fullWithNum{是否混合数字} --是--> fullNumSym[数字+部分全角符号] --> boardKeys
fullWithNum --否--> fullSym[全角符号] --> boardKeys
fullAngle --否--> halfWithNum{是否混合数字} --是--> halfNumSym[数字+部分半角符号] --> boardKeys
halfWithNum --否--> halfSym[半角符号] --> boardKeys
end
subgraph 键位排序+分组
sortKeys{键盘类型} -->|数字输入<br/>中国居民身份证输入<br/>0-9| 数字键盘随机排序确定键位[randomNumKeys] --> numGroup[10个按键按<br/>3+3+3+1分四组] --> addNumSym[第四组第一个<br/>位置添加符号./X]
subgraph 数字键盘随机排序确定键位
randomNumPad{键盘属性} -->|是| randomNumKeys[键位随机排序] --> sortNumKeys[数字键位]
randomNumPad -->|否| keepNumKeys[键位不变]--> sortNumKeys
end
sortKeys -->|英文字符输入<br/>a-z| 通用键盘随机排序确定键位[randomLetterKeys] --> letterGroup[26个按键按<br/>10+9+7分三组]
subgraph 通用键盘随机排序确定键位
letterRandomPad{键盘属性randomPad} -->|是| randomLetterKeys[键位随机排序] --> sortLetterKeys[通用键盘键位]
letterRandomPad -->|否| keepLetterKeys[键位不变]--> sortLetterKeys
end
sortKeys -->|半角数字<br/>符号输入| 半角数字+符号随机排序确定键位[randomHalfNumSymKeys] --> halfNumSymGroup[按键按<br/>非随机数字+10+5分三组]
subgraph 半角数字+符号随机排序确定键位
halfNumSymRandomPad{键盘属性randomPad} -->|是| randomHalfNumSymKeys[键位随机排序] --> sortHalfNumSymKeys[通用键盘键位]
halfNumSymRandomPad -->|否| keepHalfNumSymKeys[键位不变]--> sortHalfNumSymKeys
end
end
end
```
```mermaid
flowchart LR
subgraph SafeKeyboardInput[安全软件盘输入]
input[用户输入] --> inputType{输入类型}
inputType --> touch{点击} --> touchType{点击类型}
inputType --> doubleClick{双击}
inputType --> longPress{长按击}
touchType --touchesBegan--> beginKeyType{按键类型}
touchType --touchesMoved--> moveKeyType{按键类型}
touchType --touchesEnded--> keyType{按键类型}
touchType --touchesCancelled--> keyType{按键类型}
beginKeyType --shift[大小写切换]--> refreshKeyboard[Shift按键背景色切换<br/>英文字母大小写刷新展示] --> stop
moveKeyType --> moveInKey{点击位置是否在按键内} --是--> recordScreen[是否录屏] --是--> normalKey[按键还原]
recordScreen --否--> enableHighlightedWhenTap{键盘属性enableHighlightedWhenTap} --是--> highlightKey[按键高亮]
moveInKey{点击位置是否在按键内} --否--> normalKey
end
```
```mermaid
flowchart LR
subgraph SafeKeyboardInputText[安全软件盘输入文本处理]
input[用户输入] --> inputType{输入类型}
inputType --> touch{点击} --> touchType{点击类型}
inputType --> doubleClick{双击}
inputType --> longPress{长按击}
touchType --touchesBegan--> beginKeyType{按键类型}
touchType --touchesMoved--> moveKeyType{按键类型}
touchType --touchesEnded--> keyType{按键类型}
touchType --touchesCancelled--> keyType{按键类型}
beginKeyType --shift[大小写切换]--> refreshKeyboard[Shift按键背景色切换<br/>英文字母大小写刷新展示] --> stop
moveKeyType --> moveInKey{点击位置是否在按键内} --是--> recordScreen[是否录屏] --是--> normalKey[按键还原]
recordScreen --否--> enableHighlightedWhenTap{键盘属性enableHighlightedWhenTap} --是--> highlightKey[按键高亮]
moveInKey{点击位置是否在按键内} --否--> normalKey
end
```
1. `JGSSecurityKeyboard`内布局设计包含:
- 顶部工具:`JGSKeyboardToolbar`
- 键盘输入区域:
- 字母、符号输入按键:英文字母、数字、全(中文)半(英文)角符号
- 功能按键:键盘切换、符号切换、全半角切换、大小写切换、空格、删除、回车换行