跳到主要内容
版本:v5

自动填充凭据

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 属性允许自动填充凭据类型,如 username、current-password、new-password。无需此额外配置,它也可以用于电话号码、一次性验证码、信用卡信息以及更多。

设置 Capacitor 服务器主机名​

默认情况下,Capacitor 将使用域名 localhost 提供服务(iOS 上为 capacitor://localhost,Android 上为 http://localhost)。由于您希望密码管理器为您的应用建议已存储的凭据,您需要将配置从 localhost 更改为 my-app.com(您与应用关联的域名)。

您可以在 capacitor.config.ts 或 capacitor.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 设备上验证应用站点关联文件是否正确。

前往 Settings > Developer > Universal Links > Diagnostics。输入 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: '[输入的密码]'
});
}

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

保存凭据

自动填充效果​

正确配置后,您的应用将显示以下附件栏,显示域名和用户名的名称。点击它将自动填充表单中的凭据。

如果您只看到一个钥匙图标和"Passwords"文本,则您可能需要保存您的第一个凭据,或者您的应用可能配置不正确。

自动填充凭据

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 前缀的 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-type 为 application/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 吗?​

不需要,您只需要 applinks 和 appID 属性。

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 在这里确实有一些可用的示例在此处。