在 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)"