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

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

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

Начать курс

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

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

Что такое MessageUI.framework?

MessageUI — это системный фреймворк Apple, который позволяет приложениям интегрироваться с встроенным приложением «Сообщения». Основной класс для работы с SMS — MFMessageComposeViewController. Он предоставляет готовый UI-контроллер для составления и отправки сообщений. Важно отметить, что данный API работает только на реальных устройствах с активной SIM-картой (для iOS) или на Mac с настроенным iMessage (macOS 10.15+). На симуляторе функционал недоступен.

Подготовка проекта

Для использования MessageUI необходимо:

  • Подключить фреймворк MessageUI к проекту (обычно он уже есть в стандартной библиотеке).
  • Добавить импорт в файл, где будет вызываться отправка: import MessageUI.
  • Убедиться, что устройство может отправлять SMS — проверить через MFMessageComposeViewController.canSendText().

Базовый пример отправки SMS

Рассмотрим простейший пример: создание контроллера, установка получателя и текста, затем его отображение.

import UIKit
import MessageUI

class ViewController: UIViewController, MFMessageComposeViewControllerDelegate {

    @IBAction func sendSMSTapped(_ sender: UIButton) {
        // Проверяем, может ли устройство отправлять SMS
        guard MFMessageComposeViewController.canSendText() else {
            print("Устройство не поддерживает отправку SMS")
            return
        }

        // Создаём экземпляр контроллера
        let messageVC = MFMessageComposeViewController()
        messageVC.messageComposeDelegate = self

        // Устанавливаем получателя
        messageVC.recipients = ["+79991234567"]

        // Устанавливаем текст сообщения
        messageVC.body = "Привет! Это тестовое сообщение из моего приложения."

        // Отображаем контроллер
        present(messageVC, animated: true, completion: nil)
    }

    // MARK: - MFMessageComposeViewControllerDelegate
    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
        // Закрываем контроллер после отправки/отмены
        dismiss(animated: true, completion: nil)

        // Обрабатываем результат
        switch result {
        case .sent:
            print("Сообщение отправлено успешно")
        case .cancelled:
            print("Отправка отменена пользователем")
        case .failed:
            print("Ошибка при отправке сообщения")
        @unknown default:
            print("Неизвестный результат")
        }
    }
}

В этом коде мы:

  • Проверяем возможность отправки с помощью canSendText().
  • Создаём MFMessageComposeViewController и настраиваем получателей и тело сообщения.
  • Устанавливаем делегата (messageComposeDelegate) для обработки результата.
  • В методе делегата обрабатываем четыре возможных исхода: отправлено, отменено, ошибка, неизвестный статус.

Дополнительные возможности

MessageUI поддерживает не только простой текст, но и вложения:

// Добавление вложения (например, изображения)
if let imageData = UIImage(named: "photo")?.pngData() {
    messageVC.addAttachmentData(imageData, typeIdentifier: "public.png", filename: "photo.png")
}

Также можно установить тему сообщения (subject) — она будет видна в поле темы iMessage:

messageVC.subject = "Важное сообщение"

Особенности для macOS

Начиная с macOS 10.15, фреймворк MessageUI доступен и для десктопных приложений. Однако логика работы схожа с iOS, но есть нюансы:

  • На Mac требуется активная учётная запись iMessage в приложении «Сообщения».
  • Контроллер отображается как модальное окно, а не на весь экран.
  • Метод canSendText() возвращает true только если iMessage настроен.

Обработка ошибок и ограничения

Несколько важных моментов при использовании MessageUI:

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