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

如何在Xamarin Forms中自动读取短信验证码,无需用户手动输入?

嘿,我来帮你搞定Xamarin.Forms项目里自动读取短信验证码的需求!下面分原生实现和插件方案两种方式,你可以根据自己的项目情况选择:

自动读取验证码的实现方案(Xamarin.Forms)

原生平台实现(推荐)

因为Xamarin.Forms是跨平台框架,自动读取短信需要针对Android和iOS分别做平台特定处理,这种方式兼容性和稳定性更好。

Android端实现步骤

  1. 添加权限:在AndroidManifest.xml中添加短信相关权限,同时Android 10+需要动态申请危险权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
  1. 实现短信广播接收器:创建一个广播接收器来监听短信接收事件,提取验证码:
[BroadcastReceiver(Enabled = true, Exported = true)]
[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
public class SmsReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        if (intent.Action != "android.provider.Telephony.SMS_RECEIVED") return;

        var bundle = intent.Extras;
        if (bundle == null) return;

        var pdus = bundle.Get("pdus") as object[];
        if (pdus == null) return;

        foreach (var pdu in pdus)
        {
            var smsMessage = SmsMessage.CreateFromPdu((byte[])pdu);
            var messageContent = smsMessage.MessageBody;
            
            // 用正则匹配验证码(这里假设是6位数字,你可以根据实际调整)
            var regex = new Regex(@"\d{6}");
            var matchResult = regex.Match(messageContent);
            
            if (matchResult.Success)
            {
                var verificationCode = matchResult.Value;
                // 通过MessagingCenter把验证码传递到Forms界面
                MessagingCenter.Send<object, string>(this, "SmsCodeReceived", verificationCode);
                break;
            }
        }
    }
}
  1. 在Forms层接收验证码并填充:在你的注册页面构造函数里订阅MessagingCenter,收到验证码后自动填入输入框:
public VerificationPage()
{
    InitializeComponent();
    
    MessagingCenter.Subscribe<object, string>(this, "SmsCodeReceived", (sender, code) =>
    {
        // 回到UI线程更新控件
        Device.BeginInvokeOnMainThread(() =>
        {
            VerificationCodeEntry.Text = code;
        });
    });
}

iOS端实现步骤

iOS 12+提供了系统级的验证码自动填充功能,不需要额外读取短信,只需要给输入框配置对应的类型即可:

  1. 自定义Entry渲染器:创建一个自定义渲染器,给输入框设置OneTimeCode类型:
[assembly: ExportRenderer(typeof(Entry), typeof(VerificationEntryRenderer))]
namespace YourAppName.iOS.Renderers
{
    public class VerificationEntryRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);
            
            if (Control != null && UIDevice.CurrentDevice.CheckSystemVersion(12, 0))
            {
                // 设置为一次性验证码类型,系统会自动识别短信中的验证码
                Control.TextContentType = UITextContentType.OneTimeCode;
            }
        }
    }
}

这样当用户收到验证码短信时,系统会自动在键盘上方弹出验证码选项,用户点击就能自动填充,完全不需要手动输入。

插件方案

如果你不想写太多原生代码,可以尝试使用第三方插件,比如Plugin.SMS(注意检查插件的维护状态,确保和你的Xamarin.Forms版本兼容):

  1. 安装插件:通过NuGet安装Plugin.SMS到你的Forms项目和各个平台项目。
  2. 配置权限:和原生实现一样,Android需要添加短信权限,iOS需要在Info.plist中添加NSMessagesUsageDescription说明。
  3. 监听短信:调用插件的API监听短信,提取验证码逻辑和原生类似,同样通过MessagingCenter传递到Forms界面。

关键注意事项

  • Android 10及以上版本,需要动态申请READ_SMS和RECEIVE_SMS权限,不能只依赖Manifest配置。
  • iOS的自动填充功能需要短信内容包含"验证码"、"code"等关键词,系统才能识别为一次性验证码。
  • 测试时尽量使用真实设备,模拟器可能无法正常接收短信或触发自动填充。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:38:15