自动填充凭证
Android、iOS 和 Web 平台都内置了密码管理器,可以自动识别用户名和密码输入框,安全地存储和调用这些凭证。
为了让苹果和谷歌实现自动填充和保存凭证功能,需要配置应用与网站之间的双向关联。本指南将沿用深度链接的配置步骤,并额外添加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和Web平台实现凭证自动填充。
<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
等。在不进行额外配置的情况下,该属性也可用于电话号码、一次性验证码、信用卡信息等更多场景。
配置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应用站点关联文件
创建名为apple-app-site-association
的站点关联文件(无文件扩展名),将TEAMID.BUNDLEID
替换为你的Apple团队ID和应用Bundle ID(例如:8L65AZE66A.com.company.myapp
):
{
"applinks": {
"details": [
{
"appID": "TEAMID.BUNDLEID",
"paths": ["*"]
}
]
}
}
将该文件上传至网站HTTPS服务的.well-known
目录,访问地址格式应为:https://my-app.com/.well-known/apple-app-site-association
验证配置
在iOS设备上验证应用站 点关联文件是否正确:
进入设置
> 开发者
> 通用链接
-> 诊断工具
,输入URL(如https://my-app.com
),验证结果会显示如下:
绿色勾号表示验证通过,黄色警示则表示存在问题。
其他验证工具
Apple提供的验证工具可能会误报有效配置。
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