Отправка 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:
- Не работает на симуляторе — нужно тестировать на реальном устройстве.
- На iPad контроллер отображается как popover, если приложение работает в режиме split view.
Также в библиотеке
Rate Limiting в PHP: Ограничение частоты запросов для защиты сайта
Работа с датами в Swift (iOS/macOS): библиотеки и фреймворки
Stripe для JavaScript (Node.js): полное руководство с примерами
Event Bus и паттерн Observer в C++: реализация и примеры
Планировщик задач на TypeScript: библиотека node-schedule