跳到主要内容
版本:v8

自动填充凭据

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 错误,你需要将此指令复制到你的代码中作为解决方法。

这个示例应用使用了本指南中的技术,可以在 iOS、Android 和 Web 上实现凭据自动填充。

备注

autocomplete 属性允许自动填充 usernamecurrent-passwordnew-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 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 匹配),并且使用的 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 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-typeapplication/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 吗?

不需要,你只需要 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 或文档中的一个错误。Apple 确实在这里有一些可用的示例