在 Swift (iOS/macOS) 上发送短信:MessageUI 库与替代方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Swift (iOS/macOS) 上发送短信:库与 API 概览



在现代移动开发中,发送短信的功能仍然很受欢迎:从电话号码验证到批量通知。在 Apple 生态系统(iOS/macOS)中,使用 Swift 语言有多种方法——从内置的 MessageUI 到与云短信服务商集成。本文将介绍主要的库和 API、它们的优缺点,并提供实用的代码示例。



1. 内置库 MessageUI



最简单的方法是使用 MessageUI 框架,它适用于 iOS 和 macOS。它允许调用标准的短信发送界面(通过 MFMessageComposeViewController),无需集成第三方 SDK。



功能:

  • 通过系统“信息”应用发送短信。
  • 支持附件(图片、视频、联系人)。
  • 无需在服务商处注册。


限制:

  • 仅在物理设备上运行(不支持模拟器)。
  • 用户会看到界面并确认发送。
  • 不适合自动(服务器端)发送。


Swift (iOS) 代码示例:

import MessageUIimport UIKit

class ViewController: UIViewController, MFMessageComposeViewControllerDelegate {

@IBAction func sendSMSTapped(_ sender: UIButton) { guard MFMessageComposeViewController.canSendText() else { print("设备不支持发送短信") return } let messageVC = MFMessageComposeViewController() messageVC.body = "你好!这是来自 Swift 的测试短信。" messageVC.recipients = ["+79123456789"] messageVC.messageComposeDelegate = self present(messageVC, animated: true, completion: nil) }

func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) { switch result { case .sent: print("短信已发送") case .cancelled: print("用户已取消") case .failed: print("发送失败") @unknown default: break } controller.dismiss(animated: true, completion: nil) }}


对于 macOS,使用 NSSharingService 并指定类型 .composeMessage,但其功能有限。



2. Twilio——云短信 API



Twilio 是最流行的程序化短信发送服务之一。在 Swift 应用中集成可通过 REST API 或官方 Swift 客户端 twilio-swift 实现。



优势:

  • 高送达率,支持超过 100 个国家。
  • 无需用户参与即可发送(服务器端逻辑)。
  • 灵活配置:发件人、模板、Webhook。


通过 URLSession 发送的示例:

import Foundation

func sendSMSviaTwilio(to phoneNumber: String, message: String) { let accountSID = "YOUR_ACCOUNT_SID" let authToken = "YOUR_AUTH_TOKEN" let fromNumber = "+1234567890" // 您的 Twilio 号码 let urlString = "https://api.twilio.com/2010-04-01/Accounts/\\(accountSID)/Messages.json" guard let url = URL(string: urlString) else { return } var request = URLRequest(url: url) request.httpMethod = "POST" let loginString = "\\(accountSID):\\(authToken)" guard let loginData = loginString.data(using: .utf8) else { return } let base64Login = loginData.base64EncodedString() request.setValue("Basic \\(base64Login)", forHTTPHeaderField: "Authorization") let bodyParams = "To=\\(phoneNumber)&From=\\(fromNumber)&Body=\\(message)"

推荐