如何程序化实现应用中可通过switch启用/禁用的fingerprint lock集成
嘿,我来帮你搞定指纹锁开关的实现!下面分通用逻辑和两大主流平台的具体代码示例来给你讲清楚,保证你能快速集成到自己的应用里:
整体实现核心逻辑
不管是Android还是iOS,核心思路都是这几步:
- 存储开关状态:用本地存储记录用户是否开启指纹锁,默认设为关闭
- 设置页开关控件:给用户提供可视化的开关,切换时同步更新存储状态,同时提前检查设备是否支持指纹(避免开了开关却用不了)
- 应用启动触发验证:每次打开应用时,读取存储的开关状态,如果是开启状态,就弹出指纹验证界面,验证通过才能进入应用
- 前置校验:必须先判断设备是否支持生物识别、用户有没有录入指纹,不然会出现验证失败的异常
Android 具体实现步骤
1. 先加权限和依赖
在AndroidManifest.xml里添加生物识别权限(适配新老版本):
<!-- API 29+ 推荐用这个 --> <uses-permission android:name="android.permission.USE_BIOMETRIC" /> <!-- 如果要兼容API 28及以下,加上这个 --> <uses-permission android:name="android.permission.USE_FINGERPRINT" />
2. 封装存储开关状态的方法
用SharedPreferences来存状态,简单又方便:
// 保存开关状态 private fun saveFingerprintEnabled(enabled: Boolean) { val sharedPref = getSharedPreferences("AppSettings", Context.MODE_PRIVATE) sharedPref.edit().putBoolean("fingerprint_lock_enabled", enabled).apply() } // 获取当前开关状态 private fun isFingerprintEnabled(): Boolean { val sharedPref = getSharedPreferences("AppSettings", Context.MODE_PRIVATE) return sharedPref.getBoolean("fingerprint_lock_enabled", false) // 默认关闭 }
3. 设置页添加Switch控件
在设置页的布局文件里加个开关:
<Switch android:id="@+id/fingerprintSwitch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启用指纹锁" android:layout_margin="16dp"/>
然后在设置页的Activity里绑定逻辑:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_settings) val fingerprintSwitch = findViewById<Switch>(R.id.fingerprintSwitch) // 初始化开关状态为存储的数值 fingerprintSwitch.isChecked = isFingerprintEnabled() fingerprintSwitch.setOnCheckedChangeListener { _, isChecked -> saveFingerprintEnabled(isChecked) // 如果用户开启开关,先检查设备能不能用指纹 if (isChecked && !isBiometricAvailable()) { Toast.makeText(this, "你的设备不支持指纹解锁或未录入指纹哦", Toast.LENGTH_SHORT).show() // 自动把开关切回关闭状态 fingerprintSwitch.isChecked = false saveFingerprintEnabled(false) } } }
4. 封装设备生物识别检查方法
private fun isBiometricAvailable(): Boolean { val biometricManager = BiometricManager.from(this) return when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG)) { BiometricManager.BIOMETRIC_SUCCESS -> true // 支持且已录入 else -> false // 不支持或未录入 } }
5. 应用启动时触发指纹验证
在主Activity的onCreate方法里加验证逻辑:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 如果开关开启且设备支持,就弹指纹验证 if (isFingerprintEnabled() && isBiometricAvailable()) { showFingerprintDialog() } // 其他应用初始化逻辑... } private fun showFingerprintDialog() { // 构建验证弹窗的提示信息 val promptInfo = BiometricPrompt.PromptInfo.Builder() .setTitle("指纹验证") .setSubtitle("请验证你的指纹以进入应用") .setNegativeButtonText("取消") .build() // 创建BiometricPrompt实例,处理验证结果 val biometricPrompt = BiometricPrompt(this, object : BiometricPrompt.AuthenticationCallback() { override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { super.onAuthenticationSucceeded(result) Toast.makeText(this@MainActivity, "验证成功!", Toast.LENGTH_SHORT).show() // 验证通过,继续进入应用主界面 } override fun onAuthenticationFailed() { super.onAuthenticationFailed() Toast.makeText(this@MainActivity, "指纹不匹配,请重试", Toast.LENGTH_SHORT).show() } override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { super.onAuthenticationError(errorCode, errString) Toast.makeText(this@MainActivity, errString, Toast.LENGTH_SHORT).show() // 如果用户取消或者出现错误,这里可以选择退出应用或者提供密码登录选项 } }) // 弹出验证弹窗 biometricPrompt.authenticate(promptInfo) }
iOS 具体实现步骤
1. 添加权限描述
在Info.plist里添加生物识别权限的描述(必须加,不然App会崩溃):
<key>NSFaceIDUsageDescription</key> <string>需要使用指纹/Face ID验证,保护你的应用数据安全</string>
2. 封装存储开关状态的方法
用UserDefaults来存储:
// 保存开关状态 private func saveFingerprintEnabled(enabled: Bool) { UserDefaults.standard.set(enabled, forKey: "fingerprint_lock_enabled") } // 获取当前开关状态 private func isFingerprintEnabled() -> Bool { return UserDefaults.standard.bool(forKey: "fingerprint_lock_enabled") }
3. 设置页添加UISwitch控件
在设置页的ViewController里添加开关和标签:
override func viewDidLoad() { super.viewDidLoad() // 创建开关 let fingerprintSwitch = UISwitch(frame: CGRect(x: 20, y: 100, width: 0, height: 0)) fingerprintSwitch.isOn = isFingerprintEnabled() fingerprintSwitch.addTarget(self, action: #selector(switchValueChanged(_:)), for: .valueChanged) // 创建标签 let switchLabel = UILabel(frame: CGRect(x: 60, y: 100, width: 250, height: 30)) switchLabel.text = "启用指纹/Face ID锁" view.addSubview(fingerprintSwitch) view.addSubview(switchLabel) } @objc private func switchValueChanged(_ sender: UISwitch) { saveFingerprintEnabled(enabled: sender.isOn) if sender.isOn { // 检查设备是否支持生物识别 let context = LAContext() var error: NSError? guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { sender.isOn = false saveFingerprintEnabled(enabled: false) // 给用户提示 let alert = UIAlertController(title: "提示", message: "你的设备不支持指纹/Face ID或未录入哦", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) return } } }
4. 应用启动时触发验证
在AppDelegate的didFinishLaunchingWithOptions方法里加逻辑:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { if isFingerprintEnabled() { showBiometricAuthentication() } return true } private func showBiometricAuthentication() { let context = LAContext() var error: NSError? // 先检查设备是否支持 guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { return } // 弹出验证界面 let reason = "请验证指纹/Face ID以进入应用" context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { [weak self] success, error in DispatchQueue.main.async { if success { print("验证成功") // 验证通过,进入主界面 } else { // 验证失败,给用户提示 let alertMsg = error?.localizedDescription ?? "无法完成验证" let alert = UIAlertController(title: "验证失败", message: alertMsg, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self?.window?.rootViewController?.present(alert, animated: true) // 可选:如果验证失败可以退出应用 // exit(0) } } } }
额外注意点
- 指纹验证失败后,一定要提供备用方案(比如密码登录),不能直接把用户卡在外面
- Android要注意API版本兼容,比如
BiometricManager是API 29才有的,低版本需要用旧的FingerprintManager - iOS上如果用户禁用了生物识别,开关开启后也要做相应的提示处理
内容的提问来源于stack exchange,提问作者Jeevandeep Saini
相关产品推荐
相关产品推荐

