在 Swift (iOS/macOS) 上发送短信:MessageUI API 和第三方服务

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

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

开始课程

在 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                    

推荐