Envío de SMS en Swift (iOS/macOS): API MessageUI y servicios de terceros

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Envío de SMS en Swift (iOS/macOS): API y bibliotecas



En el desarrollo para iOS y macOS, a menudo surge la necesidad de enviar mensajes SMS — para verificación de usuarios, envío de notificaciones o integración con CRM. En este artículo, analizaremos dos enfoques principales: el uso del framework integrado MessageUI para enviar SMS a través de la aplicación del sistema y la integración con proveedores de SMS en la nube (Twilio, Nexmo/Vonage) a través de HTTP API. También discutiremos las limitaciones y las mejores prácticas.



1. Envío de SMS a través de MessageUI (solo iOS)



El framework MessageUI proporciona el controlador MFMessageComposeViewController, que permite enviar un SMS desde tu aplicación utilizando la interfaz estándar de iOS. Importante: este método solo funciona en dispositivos reales (no en el simulador) y requiere una tarjeta SIM activa.



Paso 1: Importar el framework

Añade la importación en el archivo donde trabajarás con SMS:

import MessageUI


Paso 2: Verificar la posibilidad de envío

Antes de llamar al controlador, asegúrate de verificar si el dispositivo puede enviar SMS:

if MFMessageComposeViewController.canSendText() {    // se puede enviar} else {    // mostrar error al usuario}


Paso 3: Crear y configurar el controlador

let messageVC = MFMessageComposeViewController()messageVC.body = "Su código de confirmación: 123456"messageVC.recipients = ["+79001234567"]messageVC.messageComposeDelegate = self // no olvide establecer el delegadopresent(messageVC, animated: true, completion: nil)


Paso 4: Implementar el delegado

extension YourViewController: MFMessageComposeViewControllerDelegate {    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {        controller.dismiss(animated: true) {            switch result {            case .sent:                print("SMS enviado")            case .cancelled:                print("Cancelado")            case .failed:                print("Error de envío")            @unknown default:                break            }        }    }}


Limitaciones:

  • No funciona en el simulador.
  • El usuario ve la interfaz y puede modificar el mensaje.
  • No es adecuado para envío automático (por ejemplo, en la parte del servidor).
  • No está disponible en macOS (solo iOS).


2. Envío de SMS a través de API de terceros (Twilio, Nexmo y otros)



Para el envío de SMS desde el servidor (sin intervención del usuario), utilice las HTTP API de los proveedores en la nube. Veamos un ejemplo con Twilio, uno de los servicios más populares.



Paso 1: Obtener credenciales

Regístrese en Twilio, obtenga el Account SID, el Auth Token y el número de teléfono del remitente (por ejemplo, +15005550006 para pruebas).



Paso 2: Enviar una solicitud POST

Utilice URLSession para llamar a la API de Twilio:

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                    

Recommendations