ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Windows-universal-samples 之 SMS 收发示例:基于 Windows.Devices.Sms 的短信发送与后台接收实战指南

2026/9/25 3:41:40 拓冰建站 浏览量
Windows-universal-samples 之 SMS 收发示例:基于 Windows.Devices.Sms 的短信发送与后台接收实战指南 示例工程【免费下载链接】Windows-universal-samplesAPI samples for the Universal Windows Platform.项目地址https://gitcode.com/gh_mirrors/wi/Windows-universal-samples点击查看免费下载本文以 Windows-universal-samples 仓库中的 SmsSendAndReceive 示例Samples/SmsSendAndReceive/README.md为核心讲解如何在 UWP 应用中通过Windows.Devices.Sms低层 API 发送文本短信以及如何借助过滤规则Filter Rules与后台任务Background Task接收 SMS 消息。读完本文你将掌握cellularMessaging特殊能力声明、SmsDevice2异步发送流程以及SmsMessageReceivedTrigger触发式后台收信的整体实现套路。示例定位面向移动运营商的低层短信 APIWindows.Devices.Sms是一套面向移动运营商mobile operators的低层 API典型用途是运营商通过 SMS 作为信令通道向设备上的应用推送信息。例如运营商可以向语音信箱应用发送一条特殊格式的 SMS通知其未读留言数量已发生变化。因此本示例展示的核心能力只有两点发送文本消息Send text message设置过滤规则将其注册到后台基础设施并基于过滤规则接收 SMS。需要特别区分的是如果你要写的是面向最终用户、用于收发短信的聊天应用应当使用Windows.ApplicationModel.Chat命名空间而不是本示例所演示的Windows.Devices.Sms。Windows.Devices.Sms面向的受众是移动运营商与获得运营商/OEM 特权授权的应用这一点在示例界面文案中也有明确说明见 SendTextMessage.xamlSMS functionality is only available to mobile operator apps and apps given privileged access by mobile network operators and OEMs。项目结构前台应用 后台任务两个工程示例只提供 C# 语言版本仓库内目录结构如下Samples/SmsSendAndReceive/ ├── README.md └── cs/ ├── SmsBackgroundTask/ # 后台任务组件winmdobj 输出 │ ├── SmsBackgroundTask.cs │ └── SmsBackgroundTask.csproj └── SmsSendAndReceive/ # UWP 前台应用AppContainerExe 输出 ├── Package.appxmanifest ├── SampleConfiguration.cs # 场景列表定义 ├── SendTextMessage.xaml / .xaml.cs ├── RegisterWithBackgroundTask.xaml / .xaml.cs ├── SmsSendAndReceive.csproj └── SmsSendAndReceive.sln解决方案文件 SmsSendAndReceive.sln 同时包含SmsSendAndReceive与SmsBackgroundTask两个工程其中前台工程通过ProjectReference引用后台任务工程见 SmsSendAndReceive.csproj。前台应用提供两个导航场景由 SampleConfiguration.cs 注册Send a text message—— 对应SendTextMessage页面Register with background task—— 对应RegisterWithBackgroundTask页面。两个工程均以10.0.22621.0为目标平台版本并通过Microsoft.NETCore.UniversalWindowsPlatform5.0.0 的 NuGet 包引用 UWP 基础库见两个 .csproj 中的PackageReference。前提条件cellularMessaging 特殊能力由于示例访问的是移动宽带运营商专用的特权 API包清单必须声明cellularMessaging能力。这是一个特殊用途能力special-use capability与普通能力不同它通过受限能力命名空间r来声明。仓库中的 Package.appxmanifest 给出了完整声明Package xmlns:rhttp://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities IgnorableNamespacesuap mp r ... Capabilities r:Capability NamecellularMessaging / /Capabilities /Package两个必须知悉的限制README 的 Remark 部分明确指出该示例无法通过 WACKWindows 应用认证工具包验证因为它使用了特殊用途能力该示例要求手机设备已进行 OEM 开发者解锁OEM developer unlocked。硬件方面运行环境为带移动宽带调制解调器mobile broadband modem的手机设备或 PC客户端与手机端均为 Windows 10。场景一使用 SmsDevice2 发送文本短信发送短信的核心逻辑位于 SendTextMessage.xaml.cs 的Send_Click事件处理器中完整流程分为三步获取默认 SMS 设备、构造文本消息、异步发送并解析结果。1. 获取默认 SMS 设备device SmsDevice2.GetDefault();SmsDevice2.GetDefault()返回系统默认的短信设备。代码注释指出如果这是应用第一次访问 SMS 设备系统会提示用户授予本应用的访问权限见 SendTextMessage.xaml.cs。获取失败会抛出异常并被捕获后显示错误信息。2. 构造文本消息SmsTextMessage2 msg new SmsTextMessage2(); msg.To SendToText.Text; // 目标号码 msg.Body SendMessageText.Text; // 消息正文界面要求号码不含空格例如14255551234见 SendTextMessage.xaml发送前会校验收件人与正文是否为空。3. 异步发送并解析结果SmsSendMessageResult result await device.SendMessageAndGetResultAsync(msg);SendMessageAndGetResultAsync返回SmsSendMessageResult成功与失败分支的处理非常值得借鉴成功时result.IsSuccessful true输出result.CellularClass如 GSM/CDMA并遍历result.MessageReferenceNumbers逐个输出消息引用编号MessageReferenceNumber[i]供后续按引用号跟踪消息状态失败时输出result.ModemErrorCode调制解调器错误码与result.IsErrorTransient错误是否为瞬态。当ModemErrorCode SmsModemErrorCode.MessagingNetworkError消息网络错误时进一步输出result.NetworkCauseCode若result.CellularClass CellularClass.Cdma还会追加输出result.TransportFailureCause传输失败原因这是 CDMA 网络下诊断丢包/失败的关键字段见 SendTextMessage.xaml.cs。整个发送过程被try/catch包裹SmsDevice2.GetDefault()与发送阶段任一异常都会通过rootPage.NotifyUser呈现给用户。场景二用过滤规则注册后台任务接收短信接收短信不是靠轮询而是通过过滤规则 系统触发SmsMessageReceivedTrigger 后台任务三件套实现注册逻辑位于 RegisterWithBackgroundTask.xaml.cs 的Register_Click中。过滤规则的两个维度消息类型与动作类型注册前必须先选定消息类型Message Type与过滤动作类型Filter Action Type否则直接给出提示并返回见 RegisterWithBackgroundTask.xaml.cs。界面上两类单选组RegisterWithBackgroundTask.xaml与代码中的枚举一一对应SmsMessageType消息类型枚举值界面选项含义TextText普通文本短信默认AppApp应用发送的短信WapWapWAP 推送消息BroadcastBroadcast小区广播消息VoicemailVoicemail语音信箱消息SmsFilterActionType过滤动作类型枚举值界面选项含义AcceptAccept接受消息默认AcceptImmediatelyAccept Immediately立即接受DropDrop丢弃消息PeekPeek只窥视不消费消息注册流程的代码骨架// 1. 构造单条过滤规则 SmsFilterRule filter new SmsFilterRule(messageType); // 2. 以动作类型为参数构造过滤规则集合并加入规则 SmsFilterRules filterRules new SmsFilterRules(actionType); IListSmsFilterRule rules filterRules.Rules; rules.Add(filter); // 3. 用过滤规则创建 SMS 接收触发器 SmsMessageReceivedTrigger trigger new SmsMessageReceivedTrigger(filterRules); // 4. 构建并注册后台任务 BackgroundTaskBuilder taskBuilder new BackgroundTaskBuilder(); taskBuilder.SetTrigger(trigger); taskBuilder.TaskEntryPoint SmsBackgroundTask.SampleSmsBackgroundTask; // 入口点与清单一致 taskBuilder.Name SampleSmsBackgroundTask; // 任务名用于识别 BackgroundTaskRegistration taskRegistration taskBuilder.Register();代码中BackgroundTaskEntryPoint常量值为SmsBackgroundTask.SampleSmsBackgroundTask必须与包清单中Extension Categorywindows.backgroundTasks EntryPointSmsBackgroundTask.SampleSmsBackgroundTask保持一致见 Package.appxmanifest否则后台任务无法启动。注册成功后代码将Completed事件挂接到OnCompleted处理器并调用UpdateBackgroundTaskUIState(true)把界面状态切换为 Registered。注销与状态回读注销通过遍历BackgroundTaskRegistration.AllTasks按任务名匹配后调用Unregister(true)完成true表示即使任务正在运行也强制注销随后界面状态切回 Unregistered。OnCompleted处理器展示了 UWP 后台任务回传前台状态的经典手法后台任务把状态写入ApplicationData.Current.LocalSettings以任务 ID 为键前台在Completed事件中通过sampleDispatcher.RunAsync切回 UI 线程从LocalSettings读取该键值并显示到BackgroundTaskStatus文本框见 RegisterWithBackgroundTask.xaml.cs。后台任务侧接收、弹通知与应答后台任务实现在 SmsBackgroundTask.cs 中类SampleSmsBackgroundTask实现IBackgroundTask接口。Run方法是后台任务入口其内部逻辑为挂接取消处理器taskInstance.Canceled OnCanceled处理系统取消调用DisplayToast执行真正的接收逻辑将运行状态写入LocalSettings正常完成写Completed被取消时OnCanceled写Canceled。DisplayToast的核心是从触发详情中取消息SmsMessageReceivedTriggerDetails smsDetails taskInstance.TriggerDetails as SmsMessageReceivedTriggerDetails; if (smsDetails.MessageType SmsMessageType.Text) { SmsTextMessage2 smsTextMessage smsDetails.TextMessage; // 用 ToastText02 模板构造 toast第一行发件人 From第二行正文 Body ToastNotificationManager.CreateToastNotifier().Show(notification); } // 关键应答ack消息 smsDetails.Accept();两个值得注意的细节触发详情可感知消息类型SmsMessageReceivedTriggerDetails.MessageType与注册时的过滤规则对应本示例只处理Text类型其它类型打印调试信息Accept()应答处理完消息后调用smsDetails.Accept()向系统确认消息已被消费。这与过滤动作类型密切相关——若注册时选择Peek窥视消息不会被系统消费后续处理必须依赖Accept()显式应答。toast 模板ToastTemplateType.ToastText02包含两个文本节点示例分别填入发件人From与正文Body实现收到短信即弹系统通知的典型体验。构建与运行按 README 的步骤构建与运行方式如下若以 ZIP 方式下载示例务必解压整个压缩包而不仅是当前示例所在文件夹——整个示例集共享SharedContent目录中的公共代码App.xaml、MainPage、样式等本示例的 .csproj 通过$(SharedContentDir)宏引用这些文件见 SmsSendAndReceive.csproj解压不完整会导致构建失败启动 Visual Studio选择File Open Project/Solution进入解压目录依次打开Samples→SmsSendAndReceive→cs双击 SmsSendAndReceive.sln按CtrlShiftB或Build Build Solution构建部署与运行二选一仅部署Build Deploy Solution部署并调试运行按F5或Debug Start Debugging不调试直接运行按CtrlF5或Debug Start Without Debugging。解决方案预置了Debug/Release×ARM/x64/x86六种配置组合见 SmsSendAndReceive.slnRelease 配置启用 .NET Native 工具链以提升运行性能。清单与版本要点最后汇总几个易踩坑的清单级细节均以仓库 Package.appxmanifest 为准能力声明r:Capability NamecellularMessaging /位于受限命名空间r下同时IgnorableNamespaces需包含r后台任务扩展Extension Categorywindows.backgroundTasks EntryPointSmsBackgroundTask.SampleSmsBackgroundTask中任务类型为Task Typegeneral /EntryPoint 必须与代码中BackgroundTaskBuilder.TaskEntryPoint一致目标设备家族TargetDeviceFamily NameWindows.UniversalMinVersion 为10.0.10240.0MaxVersionTested 为10.0.22621.0即面向 Windows 10 通用设备家族手机标识mp:PhoneIdentity声明了 PhoneProductId/PhonePublisherId这是面向手机平台的清单要素前置硬件手机设备或带移动宽带调制解调器的 PC且手机需 OEM 开发者解锁示例无法通过 WACK 认证。整体而言该示例是一份低层短信能力 后台触发接收的最小可运行模板前台两个页面分别演示发送与注册后台任务工程演示消费与应答配合清单文件中的特殊能力与后台任务扩展声明构成了移动运营商场景下 UWP 短信信令通道的完整闭环。赞分享示例工程【免费下载链接】Windows-universal-samplesAPI samples for the Universal Windows Platform.项目地址https://gitcode.com/gh_mirrors/wi/Windows-universal-samples点击查看免费下载相关推荐Umi-OCR完整指南免费开源离线OCR工具5分钟轻松开启高效文字识别Umi OCR完整指南免费开源离线OCR工具5分钟轻松开启高效文字识别 在数字化办公时代你是否经常需要从图片、PDF文档或屏幕截图中提取文字每天面对大量OCR桌面应用【免费下载】 Tibco RV 发送与接收示例Tibco RV 发送与接收示例 欢迎使用Tibco RV发送与接收Demo。本资源是专为那些希望学习和应用Tibco RVRendezvous技术在.NE上一篇Ubuntu 24.04 ROCm 安装指南AMD GPU 驱动到多卡带宽一次跑通下一篇grex版本控制教程新手开发者的Git指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考