跳到主要内容
版本:v8

自动填充凭据

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

为了让苹果和谷歌能够自动填充和保存凭据,必须在你的网站和应用之间配置双向关联。在本指南中,我们将遵循与 深度链接 相同的步骤,但会增加 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 和网页上自动填充凭据。

备注

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 ID、能力和配置文件)。

苹果应用站点关联文件

创建名为 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 设备上验证应用站点关联文件是否正确。

前往 设置 > 开发者 > 通用链接 -> 诊断工具。输入 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 Safari

iOS 故障排除

有多种配置错误可能导致应用无法在 iOS 上保存或调用凭据。

密码自动填充选项未显示。我应该检查什么?

  • Capacitor 服务器主机名必须与您网站的域名匹配
  • XCode 中的 Bundle Identifier 必须与 apple-app-site-association 文件中的 Bundle Identifier 匹配
  • apple-app-site-association 文件中前缀为 AppID 的团队标识符必须与您的 Apple 开发者账户中的团队标识符匹配
  • 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 验证工具报告 错误:无法解析应用站点关联

即使您的应用能够自动填充和保存凭据,Apple 的工具仍可能报告错误。请使用 Branch 提供的 替代工具 来验证您的 Apple 应用站点关联文件。

Apple 的文档与这些说明不同

Apple 关于 关联域名 的文档展示了一个 JSON 示例,其中包含一个名为 appIDs(和 components)的属性,它是一个数组,而本文的说明包含属性 appID(和 paths)。截至本文撰写时(2022 年 8 月)并在 iOS 15.6 上测试,本文档的说明是正确的,而 Apple 文档中的 JSON 示例似乎有误。这可能是 iOS 或文档中的一个错误。Apple 确实有一些可用的示例 在此处