跳到主要内容
版本: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 问题,您需要将此指令复制到您的代码中作为解决方案。

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

备注

autocomplete 属性允许自动填充凭据类型,如 usernamecurrent-passwordnew-password。它也可以在这种额外配置之外用于电话号码、一次性验证码、信用卡信息等更多类型

设置 Capacitor Server Hostname

默认情况下,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 功能

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

Apple App Site Association 文件

创建名为 apple-app-site-association 的站点关联文件,类似于下面的内容,将 TEAMID.BUNDLEID 替换为您的 Apple Team ID 和应用 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 提供了一个工具,可以验证链接、内容类型和 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 Deep Links 指南创建站点关联文件和相关的 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 Server Hostname 必须与您网站的域名匹配
  • 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 或自签名证书
  • https://my-app.com/.well-known/apple-app-site-association URL 可以在浏览器中显示
  • 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 或文档中的一个 bug。Apple 确实在此处有一些可用的示例。