自动填充凭证功能
Android、iOS 和网页平台都内置了密码管理器,可自动识别用户名和密码输入字段,并安全地存储和调用这些凭证。
要使苹果和谷歌能自动填充和保存凭证,必须在您的网站和应用之间建立双向关联。本指南将遵循与深度链接相同的步骤,但会额外说明Capacitor配置和使用autocomplete
属性的方法。
编写应用代码
您的应用需要为用户名和密码设置ion-input
元素,且必须使用autocomplete
属性。示例如下:
- Angular
- Javascript
<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和网页平台的凭证自动填充功能。
<form>
<ion-list>
<ion-item>
<ion-label>电子邮件地址</ion-label>
<ion-input type="email" name="email" autocomplete="email" required email></ion-input>
</ion-item>
<ion-item>
<ion-label>密码</ion-label>
<ion-input id="pwd" type="password" name="password" autocomplete="current-password" required></ion-input>
</ion-item>
</ion-list>
<ion-button type="submit">提交</ion-button>
</form>
针对ion-input
自动填充字段的webkit漏洞,您需要添加以下解决方案代码:
document.getElementById('pwd').children[0].addEventListener('change', (e) => {
this.password = (e.target as any).value;
});
autocomplete
属性支持自动填充多种凭证类型,如username
、current-pasword
、new-password
。该属性还可用于电话号码、一次性验证码、信用卡信息等场景,无需额外配置,详见MDN文档。
设置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
:
- 点击
+
添加Associated Domains
功能 - 在Domains部分点击
+
并填入applinks:my-app.com
,其中my-app.com
是您拥有并将创建应用关联文件的域名 - 确保启用
Automatically manage signing
(否则需在Apple开发者门户配置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设备上验证应用站点关联文件是否正确。
前往设置
> 开发者
> Universal Links
-> 诊断工具
。输入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"
}
网页配置
如果您的目标是网页平台,请遵循深度链接指南。
当设备上安装了您的应用后,在iOS Safari中访问您的网站时,顶部会显示打开应用的横幅。如果想避免此行为,可以考虑为应用使用单独的子域名。
iOS故障排除
有多种错误配置会导致应用无法在iOS上保存或调用凭证。