跳到主要内容
版本:v6

自动填充凭据

Android、iOS 和 Web 都内置了密码管理器,能够自动检测用户名和密码输入框,安全地存储和调用这些凭据。

为了让 Apple 和 Google 能够自动填充并保存凭据,需要在你的网站和应用之间建立双向关联。本指南将遵循与深度链接相同的步骤,但我们会增加Capacitor 配置和使用 autocomplete 属性的相关步骤。

编写应用代码

你的应用需要为用户名和密码准备 ion-input 组件,并且必须使用 autocomplete 属性。示例如下:

<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 上实现凭据自动填充。

备注

autocomplete 属性允许自动填充多种凭据类型,例如 usernamecurrent-paswordnew-password。即使没有本文提及的额外配置,它也能用于电话号码、一次性验证码、信用卡信息以及更多场景

设置 Capacitor 服务器主机名

默认情况下,Capacitor 将使用 localhost 域(iOS 上为 capacitor://localhost,Android 上为 http://localhost)。为了让密码管理器能为你的应用建议已存储的凭据,你需要将配置从 localhost 改为 my-app.com(与你应用关联的域名)。

你可以在 capacitor.config.tscapacitor.config.json 文件中进行修改:

const config: CapacitorConfig = {
...
server: {
hostname: 'my-app.com',
androidScheme: 'https',
}
};

iOS 配置

XCode 中的配置

在 XCode 中打开你的项目,并导航到 Signing & Capabilities

XCode capabilities

  • 点击 + 添加 Associated Domains 功能。
  • 在 Domains 部分点击 + 并输入 applinks:my-app.com,其中 my-app.com 是你拥有并将为其创建应用关联文件的域名。
  • 确保 Automatically manage signing 已启用(否则你需要在 Apple Developer Portal 中配置 App Ids、Capabilities 和 Profiles)。

Apple 应用站点关联文件

创建一个名为 apple-app-site-association 的站点关联文件,内容如下所示,并将 TEAMID.BUNDLEID 替换为你自己的 Apple Team ID 和应用 Bundle ID(例如:8L65AZE66A.com.company.myapp)。

{
"applinks": {
"details": [
{
"appID": "TEAMID.BUNDLEID",
"paths": ["*"]
}
]
}
}

注意:尽管这是一个 JSON 文件,但不要为其添加文件扩展名。

将该文件上传到你的网站(必须通过 HTTPS 托管)的 .well-known 文件夹中。 URL 应遵循此格式:https://my-app.com/.well-known/apple-app-site-association

验证

你可以在 iOS 设备上验证应用站点关联文件是否正确。

前往 设置 > 开发者 > 通用链接 -> 诊断工具。输入 URL(例如 https://my-app.com),你将看到类似下面的验证结果:

Diagnostics

绿色勾号表示配置验证成功,黄色警示则表示存在问题。

其他验证工具

Apple 提供了一个工具 用于验证关联。注意:它有时会对有效配置报错。

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: '[输入的密码]',
});
}

当调用上述代码时,如果保存的是新凭据或者密码与设备上已保存的不同,你将看到以下对话框。如果已保存的凭据没有变化,则不会看到此对话框。

Save Credentials

自动填充实战

当正确配置后,你的应用将显示如下辅助栏,其中包含域名和用户名。点击它将自动填充表单中的凭据。

如果你只看到一个钥匙图标和“密码”文字,可能需要先保存你的第一个凭据,或者你的应用可能配置有误。

Autofill Credentials## Android 配置

请遵循 Android 深度链接指南 创建网站关联文件并对 AndroidManifest.xml 进行相应修改,同时请确保:

  • 您的域名提供 HTTPS 服务,且证书有效可信
  • 您的 capacitor.config.ts 文件中已设置 hostname 属性为您的域名(需与 AndroidManifest.xml 中的 android:host 匹配),并正确配置 androidSchemehttps
"server": {
"androidScheme": "https",
"hostname": "my-app.com"
}

Web 配置

若您需要针对 Web 平台进行配置,请遵循 深度链接指南

当您在 iOS Safari 中访问您的网站时,如果设备上已安装了您的应用,页面顶部将显示横幅提示,提供打开应用的选项。若您不希望出现此行为,可以考虑为您的应用程序使用独立的子域名。

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 或自签名证书
  • 在浏览器中能够访问 https://my-app.com/.well-known/apple-app-site-association 这个 URL
  • 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 吗?

不需要,您只需要包含 applinksappID 属性。

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 或文档中的一个 Bug。Apple 在其 此处 提供了一些有效的工作示例。