自动填充凭据
Android、iOS 和 Web 都内置了密码管理器,可以自动检测用户名和密码字段,并安全地存储和调取这些凭据。
为了使 Apple 和 Google 能够自动填充和保存凭据,必须在你的网站和应用之间配置双向关联。在本指南中,我们将遵循与深度链接相同的步骤,但会增加 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 错误,你需要将此指令复制到你的代码中作为解决方法。
这个示例应用使用了本指南中的技术,可以在 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 错误,你需要以下解决方法代码:
document.getElementById('pwd').children[0].addEventListener('change', (e) => {
this.password = (e.target as any).value;
});
autocomplete 属性允许自动填充 username、current-password、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 App Site Association 文件
创建名为 apple-app-site-association 的站点关联文件,内容类似下方示例,将 TEAMID.BUNDLEID 替换为你自己的 Apple Team ID 和 App Bundle 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 设备上验证应用站点关联文件是否正确。
前往 设置 > 开发者 > 通用链接 -> 诊断。输入 URL(例如 https://my-app.com),验证结果将显示类似如下:

绿色勾号表示验证配置正确,而黄色警告表示存在问题。
其他验证工具
Apple 提供了一个工具来验证关联。注意:它有时会对正确的配置也报告失败。
Branch 提供了一个工具,用于验证链接、content-type 和 JSON 结构。不过它可能会对无效的 JSON schema 显示假阳性结果。
保存凭据
要控制使用原生 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 Developer Account 中的 Team Identifier 匹配- XCode 中的 Associated Domains 必须以
applinks:为前缀 - XCode 中的 Associated Domains 必须与你的网站域名匹配
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-app-site-association 文件由 Apple 通过其 CDN 检查,该 CDN 会缓存最多一周。这意味着如果初始检查时配置有误,即使你后来更正了问题,它也可能无法正常工作。这也意味着,如果你将一个正确的配置更改为一个有误的文件,你的应用可能表面上仍能正常工作,因为设备已经缓存了你的域名与应用之间的关联。
我需要 AutoFill Credential Provider 功能吗?
不需要,此功能并非必需。
我需要在 Associated Domains 中添加 webcredentials:domain 吗?
不需要,你只需要在 Associated Domains 中添加 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 确实在这里有一些可用的示例。