Skip to main content
Mobile SDKs

In-app voice. Three lines of code.
Native iOS. Native Android.

Drop the BBBVoice client into your existing app. Native audio session, real WebRTC via Twilio's native SDKs, a 1-hour server-minted token. Your customer talks to your AI agent without leaving your app.

Both SDKs are in the repo today, foundation-drop status, stable public API.

✓ iOS Swift Package · ✓ Android Gradle library · CallKit handoff in 6.6.1

Wraps Twilio Voice native SDKs · DEK-encrypted token mint · Per-call attribution

iOS

iOS 15+ · Swift Package

live
Install
.package(url: "https://github.com/MoayadAlobaidi/Foundry.git", from: "1.0.0"),
// targets: [.target(name: "App", dependencies: ["BBBVoice"])],
Use it
import BBBVoice
import SwiftUI

@StateObject var client = BBBVoiceClient(
    tenantId: "<your-tenant-uuid>")

Button("Talk to support") {
    Task { try? await client.startCall(language: .ar) }
}
mobile/ios/BBBVoice/

Android

Android 7.0+ (API 24) · Gradle library

live
Install
dependencies {
    implementation("ae.blackbit:voice:1.0.0")
}
Use it
val client = BBBVoiceClient(this, tenantId = "<your-tenant-uuid>")

lifecycleScope.launch {
    client.startCall(Language.AR, VoiceChoice.FEMALE)
}
mobile/android/bbb-voice/
What you get

The thin layer between your app and the agent.

Your app integrates the SDK; the SDK handles every fiddly thing about voice that you don't want to own — audio session config, WebRTC plumbing, token rotation, per-call attribution, audit.

Native audio

AVAudioSession on iOS, AudioManager on Android. Real WebRTC via the Twilio Voice native SDKs — not a webview wrapper.

Encrypted token mint

Your app never sees a long-lived secret. The SDK fetches a 1h Twilio JWT from bbb-voice on each call — server-issued, rate-limited per IP.

Per-call attribution

Every in-app call records platform, sdk_version, device_model, network type to public.mobile_sdk_sessions. Visible in your console runs feed alongside web calls.

16 languages, 4 Arabic dialects

Same language coverage as the web widget. Auto-detection on first turn or pass an explicit Language enum.

Visitor continuity

Persisted visitor_id (UserDefaults / SharedPreferences) gives multi-call history per install, with 30-day rotation policy (Tier 6.9.1).

Audit-logged

Every call lands in your tenant audit log. CSV export available per-tenant for GDPR Art. 15 / PDPL Art. 14 data-subject requests.

How auth works

Your app never sees a long-lived secret.

The SDK only ever holds a short-lived (1-hour) call-grant JWT minted by your BBB tenant. No Twilio credentials ship in your binary. If the JWT leaks, the blast radius is one hour and rate-limited per IP.

1

Your app calls POST /v1/calls/browser/mobile-access-token

Sends tenantId + platform + sdk_version + visitor_id

2

bbb-voice mints Twilio Voice JWT (1h TTL)

Identity tagged mobile-{ios|android}-{visitor}

3

SDK opens WebRTC PeerConnection via Twilio SDK

Audio frames flow; transcript indexed in your tenant

4

Call ends INSERT INTO mobile_sdk_sessions

Per-call attribution: platform, device_model, jitter, etc.

What's not in this version

Foundation drop. Stable API. Polish ships next.

We deliberately ship the SDK with a stable public surface so you can integrate today. The polish below ships in 6.6.1 (Q3 2026) without breaking anything you've already wired.

Tier 6.6.1 · Q3 2026

  • iOS CallKit handoff for backgrounded calls
  • Android ConnectionService equivalent
  • PushKit (iOS) / Firebase Cloud Messaging (Android) for inbound calls
  • Pre-built UI components: BBBCallButton, BBBCallPanel
  • Bluetooth headset routing helper + AirPods latency tuning preset

Tier 7+ · 2027

  • React Native bindings (TypeScript thin wrapper)
  • Flutter plugin (community-driven, BBB-supported)
  • On-device wake-word + handoff to BBB voice on cue
App config you'll need

Two things to add to your app.

iOS Info.plist

<key>NSMicrophoneUsageDescription</key>
<string>To talk to the AI agent.</string>

Plus enable Background Modes → "Audio, AirPlay, and Picture in Picture" if you want calls to keep running when the user backgrounds your app.

Android — runtime permission

ActivityCompat.requestPermissions(
  activity,
  arrayOf(Manifest.permission.RECORD_AUDIO),
  REQ_MIC
)

The library's manifest already declares RECORD_AUDIO; you just request it at runtime on Android 6.0+.

Want to wire it into your app?

Either grab the SDK from the GitHub repo today, or book a 20-min call and we'll pair on the integration with your eng team.