在 Swift (iOS/macOS) 上发送短信:API 和库
在 iOS 和 macOS 开发中,经常需要发送短信——用于用户验证、发送通知或与 CRM 集成。本文将介绍两种主要方法:使用内置框架 MessageUI 通过系统应用发送短信,以及通过 HTTP API 与云短信提供商(Twilio、Nexmo/Vonage)集成。我们还将讨论限制和最佳实践。
1. 通过 MessageUI 发送短信(仅限 iOS)
MessageUI 框架提供了 MFMessageComposeViewController 控制器,允许您使用标准 iOS 界面从应用中发送短信。重要提示:此方法仅适用于真实设备(不适用于模拟器),并且需要有效的 SIM 卡。
步骤 1:导入框架
在您要处理短信的文件中添加导入:
import MessageUI步骤 2:检查发送能力
在调用控制器之前,务必检查设备是否可以发送短信:
if MFMessageComposeViewController.canSendText() { // 可以发送} else { // 向用户显示错误}步骤 3:创建并配置控制器
let messageVC = MFMessageComposeViewController()messageVC.body = "您的验证码:123456"messageVC.recipients = ["+79001234567"]messageVC.messageComposeDelegate = self // 不要忘记设置代理present(messageVC, animated: true, completion: nil)步骤 4:实现代理方法
extension YourViewController: MFMessageComposeViewControllerDelegate { func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) { controller.dismiss(animated: true) { switch result { case .sent: print("短信已发送") case .cancelled: print("已取消") case .failed: print("发送失败") @unknown default: break } } }}限制:
- 在模拟器中无法工作。
- 用户会看到界面并可以修改消息。
- 不适用于自动发送(例如服务器端)。
- 在 macOS 上不可用(仅限 iOS)。
2. 通过第三方 API 发送短信(Twilio、Nexmo 等)
对于服务器端短信发送(无需用户参与),请使用云提供商的 HTTP API。我们以 Twilio 为例——这是最流行的服务之一。
步骤 1:获取凭证
在 Twilio 注册,获取 Account SID、Auth Token 和发送者电话号码(例如测试用 +15005550006)。
步骤 2:发送 POST 请求
使用 URLSession 调用 Twilio API:
func sendSMSviaTwilio(to recipient: String, message: String) { let accountSID = "YOUR_ACCOUNT_SID" let authToken = "YOUR_AUTH_TOKEN" let fromNumber = "+15005550006" 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)" let loginData = loginString.data(using: .utf8)! let base64LoginString = loginData.base64EncodedString() request.setValue("Basic \\(base64LoginString)", forHTTPHeaderField: "Authorization") let bodyParams = [ "From": fromNumber, "To": recipient, "Body": message ] le