一份完整的指南,教你如何在原生 iOS/Android 应用中测试 1Password、Bitwarden 等密码管理器的 Passkeys 功能。包含测试计划、常见问题及生产就绪策略。
Vincent
Created: October 2, 2025
Updated: January 27, 2026

See the original blog version in English here.
+70-page Enterprise Passkey Whitepaper:
Learn how leaders get +80% passkey adoption. Trusted by Rakuten, Klarna & Oracle
随着 iOS 17 和 Android 14 的发布,原生移动应用的 Passkey 格局发生了根本性的变化。第三方密码管理器首次可以充当 Passkey Providers,打破了 iCloud Keychain 和 Google Password Manager 的垄断。这意味着用户可以将他们信任的解决方案(如 1Password、Bitwarden 或 Dashlane)带入原生 App 的认证流程中。虽然这对用户选择权来说是一个巨大的胜利,但也给开发者带来了极大的复杂性。在原生移动应用中,你的 Passkey 实现可能在不同的密码管理器中表现各异。因此,团队必须正确测试原生 App Passkeys 和第三方密码管理器。
这份综合指南分享了我们在原生 App Passkey 测试中针对第三方密码管理器的实战经验。虽然 Passkey 生态系统在 2025 年已经相当成熟,但实际实施仍需要在各种密码管理器之间进行仔细验证。我们将经验总结成了一份实用的测试计划,确保你的原生 App 能与用户偏好的密码管理器无缝协作。

Looking for a dev-focused passkey reference? Download our Passkeys Cheat Sheet. Trusted by dev teams at Ally, Stanford CS & more.
密码管理器生态系统已经超越了平台原生的解决方案。用户会根据跨平台同步、企业功能或隐私偏好等特定需求,积极选择 1Password、Bitwarden、Dashlane、Proton Pass 和 NordPass 等第三方密码管理器。你的原生 iOS / Android 应用必须适应这种多样性,而不是强迫用户切换他们信任的密码管理方案。
根据我们在 Corbado 页面上测量的数据,我们发现只有 5-10% 的普通用户依赖第三方密码管理器。虽然这个数字听起来很低,但如果你在大规模环境中工作,这将对你的 Passkey 实现的感知和支持工单的数量产生巨大影响。我们发现,一些密码管理器对 WebAuthn 规范的实现略有不同,导致用户体验甚至 Bug 的细微差异。
原生 iOS 和 Android 应用提供了不同的 Passkey 使用方式。在 Android 上,你会遇到触发 Passkey 流程的 Passkey 叠加层(Overlay)和手动文本字段输入(对于 Web 应用,Android 也支持 Conditional UI)。iOS 展示了它自己的一套 Passkey 叠加层,以及 Conditional UI 和手动文本字段输入。此外,还有其他边缘情况需要检查。总而言之,你的原生应用必须优雅地处理:
正确的 Flag 配置决定了 Passkeys 是否能在不同设备和平台上按预期工作。关键值包括:
配置错误的 Flags 并不总是会导致立即失败。但是,它们可能会产生微妙的问题和不一致,例如 Passkeys 在一台设备上可用,但未跨设备同步(即使两台设备上都安装了同一个第三方密码管理器)。我们在测试中的一个发现是,一些第三方密码管理器错误地设置了 BE/BS Flags,这占了 Passkey 问题的一大部分。
Single-activity (Android) 和 single-scene
(iOS) 架构需要细致的生命周期管理。当密码管理器面板出现并被关闭时,你的 App 必须保留状态、处理回调并正确恢复。这在 Android 上尤其关键,因为
launchMode 配置可能会导致意外行为。
例如,我们发现将 MainActivity 设置为 launchMode="singleInstance"
会产生问题。在某些 Android 版本和 OEM 定制系统中,此模式会导致 Credential Manager
UI 作为单独的任务打开。这不仅会在“最近任务”屏幕中增加一个令人困惑的额外 App 条目,而且如果 App 在 Passkey 对话框打开时进入后台,还可能导致 App 挂起。
推荐的修复方法是将配置更改为 launchMode="singleTask"。这可以防止 Credential
Manager 生成单独的任务,确保在不同 OEM(Samsung、Google、Vivo 等)之间有更可预测的生命周期,并降低特定供应商 Bug 的风险。它为测试导航、叠加层和深度链接(Deeplinks)提供了更稳定的基础。
我们观察到,此类生命周期问题通常被伪装成“密码管理器 Bug”,而实际上是应用层面的问题。在不同提供商之间进行适当的检测和测试有助于及早识别这些模式。
将你的原生 App Passkey 测试重点放在最广泛采用的第三方密码管理器上:
主要目标(必须覆盖):
次要目标(基于你的用户群):
避免测试每一个可用的密码管理器的诱惑。专注于代表你 90% 用户群的提供商。我们的分析显示,这五个主要目标覆盖了欧盟/美国/英国/澳大利亚/新西兰 85% 的第三方密码管理器用户。
在开始每次测试运行之前,确保环境干净、可复现:
1. 清理凭证状态:
2. 稳定测试环境:
每个测试都验证 Passkey 功能的特定方面。请系统地记录结果,标记通过/失败状态,并详细记录任何异常情况。
验证优雅的取消处理
✓ 密码管理器面板正确打开
✓ 用户取消而不创建 Passkey
✓ App 返回登录屏幕
✓ 密码管理器中没有孤立的凭证
✓ UI 显示适当的重试选项
验证认证流程后的 Passkey 创建
✓ 本地认证可靠启动
✓ 生物识别认证成功完成
✓ 使用正确的 RP ID 创建了凭证
✓
App 转换到已认证状态,没有死循环
测试标准认证场景
✓ Passkey Overlay UI 出现或用户在文本字段场景中提供用户名
✓ 生物识别扫描和单一生物识别提示导致成功认证
✓ 没有选择循环或面板重新出现
✓ 认证后会话保持稳定
验证应用内 Passkey 管理
✓ 正确的 RP ID、可发现性和 BE/BS Flags
✓ 创建后 App 保持已认证状态
✓ 密码管理器立即更新并显示正确的标签
测试凭证生命周期管理
✓ 在设置中删除 Passkey
✓ Passkey 登录不可用
✓ 提供合适的回退选项
验证 App 到 Web 的可移植性
✓ 浏览器识别 App 创建的 Passkeys
✓ 选择面板显示正确的 RP 关联
✓ 认证完成,无需 QR/CDA 绕道
测试 Web 到 App 的凭证共享
✓ App 在选择中显示 Web 创建的凭证
✓ 首次尝试认证成功
✓ 没有强制密码回退
验证 Passkey 从原生 App 同步到桌面浏览器
✓ App 创建的 Passkey 同步到桌面密码管理器
✓ 同步的 Passkey 在桌面浏览器中无缝工作
✓ 不触发二维码 / 跨设备流程
✓ 认证完成,无需循环或错误
验证 Passkey 从桌面浏览器同步到原生 App
✓ 桌面创建的 Passkey 同步到移动密码管理器
✓ 原生 App 正确显示同步的 Passkey
✓ 认证成功,无需密码回退
✓ 日志将 assertion 绑定到正确的
credential ID
验证“手机作为安全密钥”场景
✓ 手机提供 App 创建的凭证用于 Web CDA
✓ 没有错误的“无可用 Passkeys”提示
✓ 移动端生物识别后 Web 会话完成
我们的广泛测试揭示了几个影响第三方密码管理器 Passkey 集成的反复出现的模式:
问题: 在一台设备上创建的凭证可能不会立即出现在其他设备上。
解决方案: 实现带有指数退避的重试逻辑。为遇到同步延迟的用户提供手动刷新选项。
问题: 密码管理器的行为在不同操作系统版本之间差异很大,尤其是在 Android 14+ 和 iOS 17+ 上。
解决方案: 维护兼容性矩阵,并根据检测到的操作系统版本调整流程。考虑为了最佳体验设置最低版本要求。
Become part of our Passkeys Community for updates & support.
成功在原生 App 中实现第三方密码管理器的 Passkey 支持需要有条不紊的测试和对细节的关注。我们经过实战验证的综合测试计划为验证你的 Passkey 集成提供了坚实的基础。
生产部署的关键要点:
Passkey 生态系统继续快速发展。密码管理器定期更新其实现,操作系统引入新功能,WebAuthn 规范本身也在进步。通过现在建立一个强大的测试框架,你将做好准备以适应技术的成熟。
随着新模式的出现,我们将继续更新我们的 SDK 和测试方法。对第三方密码管理器进行全面测试的投入将在减少支持负担和提高用户满意度方面带来回报。毕竟,无论用户选择哪种密码管理器,认证都应该简单好用。
Related Articles
Table of Contents