Інтеграція Twilio SDK для звонків у мобільному застосунку
Twilio Voice SDK бере на себе медіатранспорт, кодування аудіо, TURN-інфраструктуру та глобальну маршрутизацію через власні data centers. Розробнику залишаються: сигналізація через Twilio, управління аудіосесією на платформі та інтеграція з системними звонковими інтерфейсами. Швидше, ніж WebRTC з нуля, але менш гнучко та дорожче при масштабуванні.
Серверна частина: Access Token
Twilio Voice SDK аутентифікується через короткоживучі Access Token, які генерує ваш бекенд за допомогою Twilio Helper Library. Токен містить VoiceGrant — дозволи на входящі та вихідні звонки.
from twilio.jwt.access_token import AccessToken
from twilio.jwt.access_token.grants import VoiceGrant
token = AccessToken(
account_sid=ACCOUNT_SID,
signing_key_sid=API_KEY_SID,
private_key=API_KEY_SECRET,
identity=user_id,
ttl=3600
)
token.add_grant(VoiceGrant(
outgoing_application_sid=TWIML_APP_SID,
incoming_allow=True
))
return token.to_jwt()
Мобільний клієнт отримує токен при запуску та оновлює його до закінчення. Twilio SDK сповіщає через делегат accessTokenInvalidOrExpired — тоді робимо запит на новий токен та викликаємо updateAccessToken.
Android SDK
Залежність: com.twilio:voice-android:6.x.x. SDK працює поверх WebRTC, але пропонує high-level API.
// Ініціалізація
Voice.initialize(context, LogLevel.DEBUG)
// Вихідний звонок
val connectOptions = ConnectOptions.Builder(accessToken)
.params(mapOf("To" to phoneNumber))
.build()
val call = Voice.connect(context, connectOptions, object : Call.Listener {
override fun onConnected(call: Call) { /* звонок встановлений */ }
override fun onDisconnected(call: Call, error: CallException?) { /* завершився */ }
override fun onConnectFailure(call: Call, error: CallException) { /* помилка */ }
})
Входящі звонки приходять через FCM. Twilio SDK обробляє FCM payload через Voice.handleMessage():
override fun onMessageReceived(message: RemoteMessage) {
if (Voice.handleMessage(context, message.data, object : MessageListener {
override fun onCallInvite(callInvite: CallInvite) {
// показуємо сповіщення про входящий звонок
showIncomingCallNotification(callInvite)
}
override fun onCancelledCallInvite(cancelledInvite: CancelledCallInvite, ...) {
// звонок скасований до відповіді
}
})) { /* це Twilio push */ }
}
Прийняття звонку: callInvite.accept(context, callListener).
iOS SDK
CocoaPods: pod 'TwilioVoice', '~> 6.x'. PushKit обов'язковий для входящих звонків — APNs VoIP канал.
// Реєстрація PushKit токена у Twilio
func pushRegistry(_ registry: PKPushRegistry,
didUpdate credentials: PKPushCredentials,
for type: PKPushType) {
TwilioVoice.register(accessToken: token,
deviceToken: credentials.token) { error in }
}
// Входящий звонок через PushKit
func pushRegistry(_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping () -> Void) {
TwilioVoice.handleNotification(payload.dictionaryPayload,
delegate: self,
delegateQueue: nil)
// ОБОВ'ЯЗКОВО викликати CallKit reportNewIncomingCall до completion
}
Порушення правила вклику CallKit до completion у PushKit делегаті — примусове завершення застосунку iOS. Це не попередження, це крах.
CallKit інтеграція через TVODefaultAudioDevice — Twilio пропонує готовий AVAudioSession менеджер, який правильно взаємодіє з CallKit. Замінити на кастомний через TwilioVoice.audioDevice = customDevice.
TwiML та маршрутизація на сервері
Коли мобільний клієнт звонить через Twilio, запит йде на ваш TwiML Application webhook. Бекенд відповідає TwiML — XML-інструкціями для Twilio:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Dial callerId="+1234567890">
<Client>recipient_user_id</Client>
</Dial>
</Response>
Для звонків на звичайні телефонні номери — <Number> замість <Client>. Twilio виступає посередником, ваш сервер керує логікою маршрутизації.
Запис звонків та аналітика
Запис через TwiML <Record> або програмно через REST API — доступна без змін у SDK. Twilio зберігає записи на своїх серверах, надаючи URL для скачування. Аналітика звонків (тривалість, якість, статуси) — через Twilio Console або REST API.
Обмеження та коли дивитися в сторону WebRTC
Twilio Voice додає latency через relay — всі медіапотоки йдуть через data centers Twilio, не P2P. Для більшості задач це непомітно (< 50 мс додаткової затримки при найближчому PoP), але в регіонах без близького data center Twilio (Центральна Азія, частина Африки) затримка помітна.
Вартість: Twilio Voice billing — за хвилину з'єднання. При великих обсягах (10 000+ хвилин/день) власний WebRTC + TURN дешевше, але дорожче в розробці та підтримці.
Що входить в роботу
Налаштовуємо Twilio аккаунт (TwiML App, API Keys, Push Credentials), реалізуємо бекенд для генерації Access Token та webhook, інтегруємо Twilio Voice SDK на Android та/або iOS з CallKit/ConnectionService, тестуємо входящі/вихідні звонки на реальних пристроях.
Строка: 1–3 тижні в залежності від складності маршрутизації та вимог до UI звонку.







