如何用Xamarin.Essentials.SMS实现类BCC批量短信发送,避免收件人互见号码?
实现类似BCC的短信发送(Xamarin.Essentials替代方案)
你当前使用Xamarin.Essentials.Sms的方式会触发系统短信应用的群聊模式,导致所有收件人互相可见——这是因为Sms.ComposeAsync仅负责唤起系统短信界面,无法干预其群聊/单发的逻辑,也没法通过该API隐藏收件人列表。以下是两种可行的替代方案:
方案1:循环逐个发送单发消息
遍历收件人列表,每次仅给一个收件人预填短信,确保每条消息都是独立的单发内容,收件人看不到其他号码。缺点是用户需要多次确认发送操作。
修改后的代码示例:
public async Task<bool> TrySendSmsIndividuallyAsync(string message, List<string> recipients) { bool isSuccess = true; foreach (var recipient in recipients) { try { // 每次仅传入单个收件人 var smsMessage = new SmsMessage(message, new List<string> { recipient }); await Sms.ComposeAsync(smsMessage); // 可选:添加确认步骤,避免误操作或重复发送 var continueSending = await App.Current.MainPage.DisplayAlert( "发送提示", $"已准备发送给 {recipient},是否继续发送下一条?", "是", "否"); if (!continueSending) { isSuccess = false; break; } } catch (FeatureNotSupportedException) { isSuccess = false; break; } catch (Exception) { isSuccess = false; break; } } return isSuccess; }
方案2:使用原生平台API直接发送(减少手动确认)
通过Xamarin依赖服务调用Android/iOS原生短信API,实现批量单发。这种方式能减少用户操作,但需要申请相应权限,且需注意系统的短信发送限制(避免被判定为垃圾短信)。
步骤1:定义依赖服务接口
public interface ISmsBccSender { Task<bool> SendBccSmsAsync(string message, List<string> recipients); }
步骤2:Android平台实现
先在Android项目的AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.SEND_SMS" />
实现类:
[assembly: Dependency(typeof(SmsBccSenderAndroid))] namespace YourAppNamespace.Droid { public class SmsBccSenderAndroid : ISmsBccSender { public async Task<bool> SendBccSmsAsync(string message, List<string> recipients) { bool allSent = true; var smsManager = SmsManager.Default; foreach (var recipient in recipients) { try { smsManager.SendTextMessage(recipient, null, message, null, null); await Task.Delay(1000); // 间隔发送,避免触发系统限制 } catch (Exception) { allSent = false; } } return allSent; } } }
步骤3:iOS平台实现
先在iOS项目的Info.plist中添加短信权限描述:
<key>NSMessagesUsageDescription</key> <string>需要发送短信给联系人</string>
实现类:
[assembly: Dependency(typeof(SmsBccSenderiOS))] namespace YourAppNamespace.iOS { public class SmsBccSenderiOS : ISmsBccSender { public async Task<bool> SendBccSmsAsync(string message, List<string> recipients) { bool allSent = true; foreach (var recipient in recipients) { try { if (!MFMessageComposeViewController.CanSendText) { allSent = false; break; } var messageController = new MFMessageComposeViewController { Body = message, Recipients = new[] { recipient } }; messageController.Finished += (s, e) => { messageController.DismissViewController(true, null); }; UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(messageController, true, null); await Task.Delay(2000); // 预留发送时间 } catch (Exception) { allSent = false; } } return allSent; } } }
调用依赖服务
var smsSender = DependencyService.Get<ISmsBccSender>(); bool result = await smsSender.SendBccSmsAsync("你的短信内容", recipientsList);
关键说明
- Xamarin.Essentials的
Sms.ComposeAsync无法实现BCC效果,因为它仅负责唤起系统短信应用,无法控制其群聊模式的开关。 - 方案1无需额外权限,操作直观但用户需多次确认;方案2减少用户操作,但需要处理权限申请,且Android端后台发送可能受系统限制(如部分品牌手机的短信拦截机制)。
内容的提问来源于stack exchange,提问作者Alfa
相关产品推荐
相关产品推荐

