Отправка SMS на Swift (iOS/macOS): библиотека MessageUI и альтернативы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка SMS на Swift (iOS/macOS): обзор библиотек и API

В современной мобильной разработке возможность отправки SMS-сообщений остаётся востребованной функцией: от подтверждения номера телефона до массовых уведомлений. В экосистеме Apple (iOS/macOS) на языке Swift существует несколько подходов — от встроенного MessageUI до интеграции с облачными SMS-провайдерами. В этой статье мы разберём основные библиотеки и API, их преимущества и ограничения, а также приведём практические примеры кода.

1. Встроенная библиотека MessageUI

Самый простой способ — использовать фреймворк MessageUI, доступный на iOS и macOS. Он позволяет вызвать стандартный интерфейс отправки SMS (через MFMessageComposeViewController) без подключения сторонних SDK.

Возможности:

  • Отправка SMS через системное приложение «Сообщения».
  • Поддержка вложений (изображения, видео, контакты).
  • Не требует регистрации у провайдера.

Ограничения:

  • Работает только на физических устройствах (не в симуляторе).
  • Пользователь видит интерфейс и подтверждает отправку.
  • Не подходит для автоматической (серверной) отправки.

Пример кода на Swift (iOS):

import MessageUI
import UIKit

class ViewController: UIViewController, MFMessageComposeViewControllerDelegate {

    @IBAction func sendSMSTapped(_ sender: UIButton) {
        guard MFMessageComposeViewController.canSendText() else {
            print("Устройство не поддерживает отправку SMS")
            return
        }
        let messageVC = MFMessageComposeViewController()
        messageVC.body = "Привет! Это тестовое SMS из 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("SMS отправлено")
        case .cancelled:
            print("Отменено пользователем")
        case .failed:
            print("Ошибка отправки")
        @unknown default:
            break
        }
        controller.dismiss(animated: true, completion: nil)
    }
}

Для macOS используется NSSharingService с типом .composeMessage, но его функционал ограничен.

2. Twilio — облачный API для SMS

Twilio — один из самых популярных сервисов для программной отправки SMS. Интеграция в Swift-приложение осуществляется через REST API или официальный Swift-клиент twilio-swift.

Преимущества:

  • Высокая скорость доставки, поддержка более 100 стран.
  • Возможность отправки без участия пользователя (серверная логика).
  • Гибкие настройки: отправитель, шаблоны, вебхуки.

Пример отправки через 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)"
    request.httpBody = bodyParams.data(using: .utf8)
    
    URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            print("Ошибка: \(error)")
        } else if let data = data, let result = String(data: data, encoding: .utf8) {
            print("Ответ Twilio: \(result)")
        }
    }.resume()
}

3. Sinch — SDK для iOS

Sinch предоставляет нативный Swift SDK для отправки SMS. Он особенно удобен для приложений, уже использующих Sinch для голосовых звонков или чата.

Особенности:

  • Простая инициализация через SinchClient.
  • Поддержка шаблонов и отслеживания статуса доставки.
  • Работает на iOS и macOS (через Catalyst).

Пример инициализации:

<                    

Рекомендаций