You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:为.NET MAUI密码管理器实现跨平台AutofillService

.NET MAUI 实现密码管理器Autofill功能指南

一、Android平台核心实现步骤

1. 创建Autofill Service类

在MAUI项目的Platforms/Android目录下新建C#类,继承Android.Service.Autofill.AutofillService,重写关键方法:

using Android.App;
using Android.Content;
using Android.Service.Autofill;
using Android.Views.Autofill;
using Android.Widget;
using System.Collections.Generic;

namespace YourAppName.Platforms.Android
{
    [Service(Exported = true, Permission = "android.permission.BIND_AUTOFILL_SERVICE")]
    [IntentFilter(new[] { "android.service.autofill.AutofillService" })]
    [MetaData("android.autofill", Resource = "@xml/autofill_service")]
    public class MyAutofillService : AutofillService
    {
        public override void OnFillRequest(FillRequest request, CancellationSignal cancellationSignal, FillCallback callback)
        {
            // 获取当前页面的Autofill上下文结构
            var structure = request.FillContexts[request.FillContexts.Count - 1].Structure;
            var hints = new List<string>();

            // 遍历页面中的可填充视图,收集邮箱/密码类型的hint
            for (int i = 0; i < structure.ChildCount; i++)
            {
                var child = structure.GetChildAt(i);
                if (child.ClassName == Class.FromType(typeof(EditText)).Name)
                {
                    var editTextHints = child.AutofillHints;
                    if (editTextHints != null)
                    {
                        foreach (var hint in editTextHints)
                        {
                            if (hint == AutofillHints.Email || hint == AutofillHints.Password)
                            {
                                hints.Add(hint);
                            }
                        }
                    }
                }
            }

            // 构造填充数据(从你的密码管理器数据库中获取对应账号密码)
            var dataset = new Dataset.Builder(new RemoteViews(PackageName, Resource.Layout.autofill_list_item))
                .SetValue(AutofillId.FromViewId(structure, Resource.Id.email_input), AutofillValue.ForText("user@example.com"))
                .SetValue(AutofillId.FromViewId(structure, Resource.Id.password_input), AutofillValue.ForText("yourpassword"))
                .Build();

            // 返回填充结果,触发选择弹窗
            var response = new FillResponse.Builder()
                .AddDataset(dataset)
                .Build();

            callback.OnSuccess(response);
        }

        public override void OnSaveRequest(SaveRequest request, SaveCallback callback)
        {
            // 可选:实现保存新账号密码到密码管理器的逻辑
            callback.OnSuccess();
        }
    }
}

2. 添加配置文件和布局

  • 在Platforms/Android/Resources/xml目录下新建autofill_service.xml:
<?xml version="1.0" encoding="utf-8"?>
<autofill-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:settingsActivity="com.example.yourapp.SettingsActivity" />
  • 在Platforms/Android/Resources/layout目录下新建autofill_list_item.xml(弹窗中账号条目的布局):
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:textSize="16sp" />

3. 引导用户开启Autofill服务

在MAUI共享代码中添加跳转至系统Autofill设置的逻辑,让用户选择你的应用作为默认服务:

public static void OpenAutofillSettings()
{
#if ANDROID
    var intent = new Android.Content.Intent(Android.Provider.Settings.ActionRequestAutofillService);
    intent.SetData(Android.Net.Uri.Parse($"package:{Android.App.Application.Context.PackageName}"));
    Android.App.Application.Context.StartActivity(intent.AddFlags(Android.Content.ActivityFlags.NewTask));
#endif
}

二、iOS平台补充说明

iOS的AutoFill依赖ASCredentialProviderExtension,需在MAUI解决方案中添加iOS扩展目标,用C#编写扩展类:

  • 创建Credential Provider Extension类型的iOS扩展项目
  • 扩展类继承ASCredentialProviderViewController,重写ProvideCredentialAsync等方法,从密码管理器数据库读取数据返回给系统

三、关键注意事项

  • 密码必须用安全容器存储:Android用KeyStore,iOS用Keychain,MAUI可直接用Xamarin.Essentials.SecureStorage
  • 测试时需手动在系统设置中开启你的应用作为Autofill服务,否则不会触发弹窗
  • 复杂页面的输入框识别需要优化结构解析逻辑,适配更多AutofillHint类型

内容的提问来源于stack exchange,提问作者tengelberth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:56:18