自动填充凭证
Android、iOS 和 Web 都内置了密码管理器,能够自动检测用户名和密码字段,并安全地存储和调用这些凭证。
为了让苹果和谷歌能自动填充和保存凭证,必须在你的网站和应用之间配置双向关联。在本指南中,我们将遵循与深度链接相同的步骤,但会增加Capacitor 配置和使用 autocomplete 属性的步骤。
编写应用代码
你的应用需要为用户名和密码使用 ion-input,并且必须使用 autocomplete 属性。示例如下:
- Angular
- Javascript
<form>
<ion-list>
<ion-item>
<ion-label>电子邮件地址</ion-label>
<ion-input
appAutofill
type="email"
name="email"
autocomplete="email"
[(ngModel)]="email"
required
email
></ion-input>
</ion-item>
<ion-item>
<ion-label>密码</ion-label>
<ion-input
appAutofill
type="password"
name="password"
autocomplete="current-password"
required
[(ngModel)]="password"
></ion-input>
</ion-item>
</ion-list>
<ion-button type="submit">提交</ion-button>
</form>
由于一个与 ion-input 自动填充字段相关的 webkit bug,你需要一个变通方案:将 这个指令 复制到你的代码中。
这个 示例应用 使用了本指南中的技术,允许在 iOS、Android 和 Web 上自动填充凭证。
<form>
<ion-list>
<ion-item>
<ion-label>电子邮件地址</ion-label>
<ion-input type="email" name="email" autocomplete="email" required email></ion-input>
</ion-item>
<ion-item>
<ion-label>密码</ion-label>
<ion-input id="pwd" type="password" name="password" autocomplete="current-password" required></ion-input>
</ion-item>
</ion-list>
<ion-button type="submit">提交</ion-button>
</form>
由于一个与 ion-input 自动填充字段相关的 webkit bug,你需要以下变通代码:
document.getElementById('pwd').children[0].addEventListener('change', (e) => {
this.password = (e.target as any).value;
});
autocomplete 属性允许自动填充凭证类型,如 username、current-pasword、new-password。即使不进行额外配置,它也可用于电话号码、一次性验证码、信用卡信息等(更多类型)。
设置 Capacitor 服务器主机名
默认情况下,Capacitor 会使用 localhost 域提供服务(在 iOS 上是 capacitor://localhost,Android 上是 http://localhost)。由于你希望密码管理器为你的应用建议存储的凭证,你需要将配置从 localhost 更改为 my-app.com(你为应用关联的域名)。
你可以在 capacitor.config.ts 或 capacitor.config.json 文件中进行此设置:
const config: CapacitorConfig = {
...
server: {
hostname: 'my-app.com',
androidScheme: 'https',
}
};
iOS 配置
在 XCode 中配置
在 XCode 中打开你的项目,并导航到 Signing & Capabilities。

- 点击
+,添加Associated Domains功能。 - 在 Domains 部分点击
+,输入applinks:my-app.com,其中my-app.com是你拥有并将为其创建应用关联文件的域名。 - 确保
Automatically manage signing已启用(否则你需要在 Apple Developer Portal 中配置 App Id、Capabilities 和 Profiles)。
Apple 应用网站关联文件
创 建名为 apple-app-site-association 的网站关联文件,内容类似以下示例,将 TEAMID.BUNDLEID 替换为你自己的苹果团队 ID 和应用包 ID(例如:8L65AZE66A.com.company.myapp)。
{
"applinks": {
"details": [
{
"appID": "TEAMID.BUNDLEID",
"paths": ["*"]
}
]
}
}
注意:尽管这是一个 JSON 文件,但不要添加文件扩展名。
将该文件上传到你的网站上的 .well-known 文件夹(必须通过 HTTPS 托管)。
URL 应遵循以下格式:https://my-app.com/.well-known/apple-app-site-association
验证
你可以在 iOS 设备上验证你的应用网站关联文件是否正确。
前往 设置 > 开发者 > Universal Links -> 诊断。输入 URL(例如 https://my-app.com),将显示类似以下的验证结果:

绿色对勾表示配置验证通过,黄色警告则表示存在问题。
其他验证工具
苹果提供了一个 工具 来验证关联。注意:它有时会对正确的配置显示失败。
Branch 提供了一个 工具 来验证链接、内容类型和 JSON 结构。不过,它可能会在无效的 JSON 模式上显示误报。
保存凭证
要控制使用原生 iOS 密码管理器保存用户名和密码凭证,你需要使用 capacitor-ios-autofill-save-password 插件:
npm install capacitor-ios-autofill-save-password
如果你的应用目标平台是 iOS,代码需要在成功登录后保存凭证(其他平台不需要):
if (Capacitor.getPlatform() === 'ios') {
await SavePassword.promptDialog({
username: '[输入的用户名]',
password: '[输入的密码]',
});
}
当调用上述代码时,如果保存新凭证或密码与设备上保存的不同,你将看到以下对话框。如果保存的凭证没有变化,你将不会看到此对话框。

自动填充实践
正确配置后,你的应用将显示如下辅助栏,展示域名和用户名。点击它将自动填充表单中的凭证。
如果只看到钥匙图标和“密码”文本,则可能需要保存第一个凭证,或者你的应用可能配置有误。
## Android 配置
请按照 Android 深 度链接指南 创建网站关联文件并修改 AndroidManifest.xml,同时还需验证以下内容:
- 您的域名已启用 HTTPS,并拥有有效的受信任证书
- 您的
capacitor.config.ts文件中已将hostname属性设置为您的域名(需与AndroidManifest.xml中的android:host匹配),并已将androidScheme设置为https:
"server": {
"androidScheme": "https",
"hostname": "my-app.com"
}
Web 配置
如果您的应用面向 Web 端,请遵循 深度链接指南。
如果在设备上安装了您的应用,当您在 iOS Safari 中访问您的网站时,页面顶部会显示一个横幅,提供打开应用的选项。如果您希望避免此行为,可以考虑为您的应用程序使用单独的子域名。

iOS 故障排除
应用程序配置不当会导致在 iOS 上无法保存或调用凭据,以下是一些常见问题及解决方法。
密码的自动填充选项未显示,应该检查什么?
- Capacitor 服务器主机名必须与您的网站域名匹配
- XCode 中的 Bundle Identifier 必须与
apple-app-site-association文件中的 Bundle Identifier 匹配 apple-app-site-association文件中AppID前缀的 Team Identifier 必须与您 Apple 开发者帐户中的 Team Identifier 匹配- XCode 中关联域的前缀必须是
applinks: - XCode 中的关联域必须与您的网站域名匹配
apple-app-site-association文件必须通过https提供,且使用受信任的证书,不能使用http或自签名证书- URL
https://my-app.com/.well-known/apple-app-site-association可以在浏览器中访问 - 请求
apple-app-site-association的响应返回的content-type应为application/json apple-app-site-association文件不能使用文件扩展名apple-app-site-association文件已上传到名为.well-known的文件夹中- 不能对
apple-app-site-association使用重定向 - 您至少已保存一组凭据(如果从未提供过用户名或密码,则无法自动填充)
Apple 会通过其 CDN 检查 apple-app-site-association 文件,该文件最多可缓存一周。这意味着,如果初始检查时配置错误,即使您纠正了问题,它也可能无法正常工作。同样,如果您将良好配置更改为错误配置,由于设备已缓存您的域名与应用之间的关联,您的应用可能看起来仍然可以正常工作。
我需要 AutoFill Credential Provider 功能吗?
不需要,此功能不是必需的。
关联域中需要 webcredentials:domain 吗?
不需要,您只需要在关联域中包含 applinks:domain。
在 apple-app-site-association 中需要 webcredentials 吗?
不需要,您只需要 applinks 和 appID 属性。
Apple 验证工具报告 Error cannot parse app site association
即使您的应用程序可以自动填充和保存凭据,Apple 的工具也可能报告错误。请使用 Branch 提供的替代工具来验证您的 Apple App Site Association 文件。
Apple 的文档与本指南不同
Apple 关于关联域的文档展示的 JSON 示例中包含一个名为 appIDs(以及 components)的属性,它是一个数组,而本指南中包含的属性是 appID(以及 paths)。截至本文撰写时(2022年8月)以及 iOS 15.6 的测试,本指南的说明是正确的,而 Apple 文档中的 JSON 示例似乎有误。这可能是 iOS 或文档中的一个错误。Apple 在此处提供了一些有效的示例。