跳到主要内容
版本:v5

自动填充凭据

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

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

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

Apple 应用网站关联文件

创建一个名为 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),将显示类似于下面的验证结果:

诊断

绿色对勾表示配置验证通过,黄色警告则表示存在问题。

其他验证工具

苹果提供了一个工具来验证关联。注意:它有时会对正确的配置显示失败。

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 匹配),并已使用 https 作为 androidScheme
"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-typeapplication/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 提供了一些有效的示例 在此处