如何在App中保存凭证实现AutoFill?调用SecAddSharedWebCredential遇报错
Hey there, let's work through this error you're hitting when trying to save shared web credentials. I've dealt with this exact issue before, so here's a breakdown of what's going on and how to fix it:
为什么会出现这个错误?
这个-909错误的根源很直接:用户的Safari设置里没有开启「自动填充密码」功能。哪怕你只是想在App内使用保存的凭证,共享Web凭证系统是依赖iOS的Autofill框架的,必须要求Safari的Autofill开关处于开启状态,才能正常完成凭证的存储操作。
解决方案步骤
1. 引导用户开启Safari的Autofill设置
你需要在App里添加友好的提示,引导用户去系统设置中开启该功能,具体路径是:
- 打开「设置」→ 找到「Safari」→ 点击「密码」→ 开启「自动填充密码」
- 同时确保「允许填充来自」选项中,勾选了「iCloud密码」或「本地密码」(根据用户的存储偏好)
2. 代码层面优化:提前检查Autofill状态
为了避免直接抛出错误,你可以在调用SecAddSharedWebCredential之前,先检查Autofill是否可用,示例代码如下:
import Security // 检查Autofill是否可用的工具函数 func isAutofillAvailable() -> Bool { let status = SecIsSharedWebCredentialAvailable() return status == errSecSuccess } // 调用示例 if isAutofillAvailable() { // 替换成你的实际域名、用户名、密码 SecAddSharedWebCredential("your-app-domain.com" as CFString, "user123" as CFString, "pass456" as CFString) { error in if let error = error { print("保存凭证失败:\(error.localizedDescription)") } else { print("凭证已成功保存到共享Web凭证库") } } } else { // 这里可以弹出UI提示,引导用户去开启设置 print("请先在Safari设置中开启「自动填充密码」功能") }
3. 额外注意事项
- 域名格式要规范:
domain参数必须是有效的正式域名(比如your-app.com),不能用IP地址、本地主机名或者自定义字符串,否则也会导致保存失败。 - 隐私合规提示:在调用保存凭证前,最好先弹窗询问用户是否同意保存,既符合App Store的隐私要求,也能提升用户体验。
- 权限配置:确保你的App的
Info.plist中没有禁用相关系统权限(默认情况下是允许的,无需额外配置)。
只要用户开启了Safari的Autofill功能,这个接口就能正常把凭证存入共享Web凭证库,实现你想要的「App内和Safari跨端自动填充」的需求啦。
内容的提问来源于stack exchange,提问作者Chip
相关产品推荐
相关产品推荐

