Отправка текстовых сообщений из вашего iOS-приложения может быть необходимой или желаемой функцией, и мы уже видели, как эта задача решается для наших друзей на Android. Пришло время решить её с помощью Swift.
Хотя Twilio — это REST API, и вы могли бы сделать HTTP-запрос к нему напрямую, вам пришлось бы хранить учётные данные Twilio внутри приложения, что создаёт серьёзную угрозу безопасности. Злоумышленник мог бы декомпилировать приложение, извлечь ваши учётные данные и использовать ваш аккаунт Twilio в своих целях.
Держу пари, @SwiftOnSecurity высказался бы по этому поводу.
Чтобы избежать этого, мы создадим бэкенд-приложение, которое реализует Twilio REST API, скрывает ваши учётные данные и отправляет SMS-сообщения за вас. Затем вы сможете вызывать это бэкенд-приложение из вашего Swift-приложения и отправлять SMS-сообщения, не подвергая риску свои учётные данные.
Используя Twilio REST API, нам также понадобятся следующие инструменты для отправки сообщения:
— Xcode 8 и Swift 3
— Аккаунт Twilio и номер телефона Twilio — получите его бесплатно.
— Ваш любимый язык для создания бэкенда. Я создам сервер с помощью библиотеки twilio-python. Но вы можете выбрать другой серверный язык из доступных библиотек.
— Если вы остановитесь на Python, вам также понадобится Flask — микрофреймворк для создания бэкенда.
— Инструмент для обработки вебхуков. Мы будем использовать ngrok. Узнайте больше о нём от Фила Нэша. Альтернативно, у вас может быть сервер, развёрнутый на Heroku или аналогичной платформе.
Поскольку мы используем Python на бэкенде и запускаем небольшое приложение на Flask, откройте ваш любимый текстовый редактор, чтобы создать файл `app.py`.
Давайте проверим, что всё работает, с помощью быстрого примера «Hello World»:
Запустите приложение из терминала в директории проекта `app.py`:
Откройте в браузере http://127.0.0.1:5000/hello или любой другой порт, на котором запущено ваше приложение, и вы должны увидеть сообщение «Hello World».
Теперь убедимся, что к приложению можно обратиться не только с localhost, запустив его через ngrok. В терминале выполните команду:
Мы можем использовать сгенерированный URL, чтобы предоставить мобильному приложению доступ к этому бэкенду. Вы должны увидеть что-то вроде этого:
Когда базовые функции работают, как ожидалось, мы можем заменить код «Hello World» новым эндпоинтом в нашем Flask-приложении для обработки отправки SMS-сообщений. Затем iOS-приложение сможет отправлять запросы к нему, и мы будем готовы к работе.
Не забудьте заменить Account Sid, Auth Token и номер телефона Twilio на свои из Twilio Console. Затем перезапустите приложение: `python run app.py`.
Вы можете убедиться, что всё работает, сделав быстрый curl-запрос с вашим номером телефона и URL ngrok.
Если вы создаёте проект с нуля, вероятно, вы хотите быстрее выйти в продакшн, чем это позволит даже наше небольшое Python-приложение.
Убедитесь, что у вас включены Functions в консоли, и используйте следующий код, чтобы сделать то же самое, что мы сделали с Python.
Когда наше Python-приложение запущено, мы можем приступить к созданию iOS-приложения.
Клонируйте этот репозиторий, который содержит storyboard с настройками Auto Layout и соответствующими `UILabel`, `UITextField` и `UIAction` для этого приложения. Я использую Xcode 8 и Swift версии 3.
Откройте терминал и перейдите в директорию, где вы хотите разместить проект. Введите следующую команду для клонирования, или вы можете скачать zip-файл проекта:
В клонированном репозитории есть файл `Podfile`, в котором перечислены зависимости, которые необходимо установить. Мы используем только Alamofire для HTTP-запросов, так что это единственное, что там указано. Установите его с помощью следующей команды:
Вы можете получить сообщение об ошибке, что нужно выполнить `pod repo update`, так как в Cocoapods 1.0 эта команда больше не выполняется автоматически при `pod install`. Сделайте это, а затем снова выполните `pod install`.
CocoaPods позаботится о связывании всех фреймворков, создав новую рабочую область Xcode. Теперь, открывая проект в Xcode, вам нужно использовать `TwilioSms.xcworkspace` вместо обычного проекта Xcode.
Перейдите к файлу `ViewController.swift`, где уже есть следующий код:
Этот фрагмент задаёт переменные для номера телефона, `phoneNumberField`, и сообщения, `messageField`, используя `UITextField` для захвата пользовательского ввода. Мы также подключили `@IBAction` к `ViewController` и установили действие как метод `sendData(_:)`, который будет вызываться при нажатии кнопки «Send».
Вы можете проверить, что Alamofire установлен корректно, добавив эту строку в `ViewController.swift` под стандартным `import UIKit`:
Нажмите «Command-B», чтобы убедиться, что проект собирается с нашей зависимостью.
Если вы соберёте и запустите проект, то сможете поэкспериментировать, вводя текст в поля `UITextField`, но пока они ничего не делают. Мы исправим это через минуту.
Откройте `ViewController.swift` и добавьте следующий код в класс `ViewController` внутри метода `sendData(_:)`:
Мы задали параметры для POST-запроса к нашему Flask-серверу, используя значения из наших `UITextField` в качестве параметров `To` и `Body`. Затем мы указали заголовок запроса как form-encoded URL, чтобы Twilio мог принять данные так же, как это было сделано ранее при запросе через curl.
Вуаля! Мы только что получили SMS от T. Swift. Да, это Twilio Swift!
Вы также создали кусок кода на Python, который можно повторно использовать на других платформах и продолжать делать HTTP-запросы напрямую к нему.
С аналогичным подходом вы могли бы добавить поиск номеров телефонов или генерировать звонки прямо из приложения. Если вы хотите использовать IP Messaging, Video или Client, вам также понадобится сервер для генерации токенов доступа к этим сервисам. Какую бы задачу в области коммуникаций вы ни решали, вы уже на пути к её успешному выполнению.
Я бы с удовольствием узнала о том, что вы создаёте. Найдите меня в Twitter @meganspeir или отправьте письмо на mspeir@twilio.com.