新手求助:如何在Xamarin.Forms中自动发送短信?有无免费方案
嘿,作为Xamarin.Forms新手就着手做自动发短信的功能,挺有想法的!我来给你梳理下Xamarin.Forms里实现短信发送的方法,重点说说免费的解决方案~
Xamarin.Forms发送短信的免费方案
一、原生平台原生实现(完全免费)
Xamarin.Forms是跨平台框架,短信发送依赖各平台的原生API,这是完全免费的方案,但要注意iOS和Android的差异:
Android端:可静默发送(需权限)
首先得在Android项目的AndroidManifest.xml里添加短信发送权限:
<uses-permission android:name="android.permission.SEND_SMS" />
Android 6.0及以上还需要动态申请权限,不然会被系统拦截:
const int SmsPermissionRequestCode = 1; // 在MainActivity里实现权限申请逻辑 public void RequestSmsPermission() { if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.SendSms) != Android.Content.PM.Permission.Granted) { ActivityCompat.RequestPermissions(this, new[] { Manifest.Permission.SendSms }, SmsPermissionRequestCode); } }
然后写发送短信的核心方法:
using Android.Telephony; public void SendSms(string phoneNumber, string message) { // 先确认权限已获取 if (ContextCompat.CheckSelfPermission(MainActivity.Instance, Manifest.Permission.SendSms) != Android.Content.PM.Permission.Granted) { RequestSmsPermission(); return; } var smsManager = SmsManager.Default; // 参数分别是收件人、发件人(可null)、内容、发送回执、送达回执(可null) smsManager.SendTextMessage(phoneNumber, null, message, null, null); }
iOS端:需用户交互(苹果隐私限制)
苹果的隐私政策不允许APP静默发送短信,必须通过系统自带的短信界面让用户确认发送。实现代码如下:
using MessageUI; using UIKit; public void SendSms(string phoneNumber, string message) { if (MFMessageComposeViewController.CanSendText) { var smsController = new MFMessageComposeViewController(); smsController.Recipients = new[] { phoneNumber }; smsController.Body = message; // 发送完成后关闭界面 smsController.Finished += (sender, args) => { ((MFMessageComposeViewController)sender).DismissViewController(true, null); }; // 获取当前页面的ViewController来弹出短信界面 var rootVC = UIApplication.SharedApplication.KeyWindow.RootViewController; rootVC.PresentViewController(smsController, true, null); } }
二、跨平台插件方案(免费,更便捷)
如果不想分别写Android和iOS的原生代码,可以用第三方插件Xam.Plugins.Messaging,它封装了各平台的短信、电话、邮件功能,使用起来更省心。
步骤:
- 在NuGet包管理器中搜索
Xam.Plugins.Messaging,安装到你的共享项目(PCL/NetStandard)和各个平台项目。 - 在共享项目中直接调用:
using Plugin.Messaging; public void SendSmsCrossPlatform(string phoneNumber, string message) { var smsMessenger = CrossMessaging.Current.SmsMessenger; if (smsMessenger.CanSendSms) { smsMessenger.SendSms(phoneNumber, message); } }
这个插件在Android上依然需要申请SEND_SMS权限,iOS上还是会弹出系统短信界面,和原生实现逻辑一致,但代码更简洁。
三、完全自动发送的免费方案(无用户交互)
如果你的需求是不需要用户手动确认,完全自动发送短信,那上面的方案在iOS上就行不通了,这时候可以用短信网关的免费试用服务,比如Twilio的免费额度(国外),或者国内阿里云、腾讯云的免费试用套餐。
以Twilio为例:
- 注册Twilio账号,获取免费试用额度和你的专属号码。
- 安装Twilio的NuGet包
Twilio到你的项目。 - 调用API发送短信:
using Twilio; using Twilio.Rest.Api.V2010.Account; public void SendAutoSms(string phoneNumber, string message) { // 替换成你的Twilio账号SID和Auth Token string accountSid = "你的Account SID"; string authToken = "你的Auth Token"; TwilioClient.Init(accountSid, authToken); var smsMessage = MessageResource.Create( body: message, from: new Twilio.Types.PhoneNumber("你的Twilio号码"), to: new Twilio.Types.PhoneNumber(phoneNumber) ); }
注意:免费试用有发送次数限制,且发送的短信会带有Twilio的标识,适合测试阶段使用。国内用户可以选择国内云服务商的免费短信套餐,不过大多需要实名认证。
总结
- 如果接受用户交互(iOS必须):优先用原生API或
Xam.Plugins.Messaging,完全免费,符合平台规范。 - 如果需要无交互自动发送:选择短信网关的免费试用方案,适合测试或小额度发送需求。
内容的提问来源于stack exchange,提问作者mah
相关产品推荐
相关产品推荐

