Skip to main content

๐ŸŽ iOS

The SDK embeds the whole meeting client: BBBMeetingSDK.xcframework carries the Swift API, the JavaScript bundle and the assets, and links the React Native, Expo and WebRTC frameworks that ship next to it in the same Swift package. Your app passes a join URL; the SDK presents the meeting full-screen and reports back when the user leaves.

Swift packagehttps://github.com/ahmad-bbbb/bigbluebutton-mobile-sdk, exact version 0.1.0
Library productBBBMeetingSDK
RequirementsiOS 16.4 or later, Xcode 26.x

The frameworks are built with library evolution enabled, so a newer Swift compiler in your app is fine.


๐Ÿ“ฆ 1. Add the Swift packageโ€‹

The package has one library product, BBBMeetingSDK, which links every framework of the SDK. All of them are dynamic; Xcode embeds and signs them automatically.

By URL (recommended). In Xcode choose File โ†’ Add Package Dependencies, enter https://github.com/ahmad-bbbb/bigbluebutton-mobile-sdk and pick the exact version 0.1.0 (git tags 0.1.0 and v0.1.0). The package points at the *.xcframework.zip assets of GitHub Release v0.1.0 and checks their checksums.

Mirrored or local. The release assets are plain zips. To host them yourself, copy the repository-root Package.swift and change the URLs; the checksums stay the same. To use them from disk, unzip them into an xcframeworks/ folder next to a copy of Package.swift and declare the same targets by path, with the same names (for example .binaryTarget(name: "React", path: "xcframeworks/React.xcframework")), then Add Package Dependencies โ†’ Add Local.

CocoaPods. Not published yet. Vendoring the unzipped XCFrameworks in your own podspec works; the Flutter plugin's bbb_meeting_sdk.podspec does that and can serve as a template.

The list of frameworks in the package is on ๐Ÿ“ฆ Packages & versions.


๐Ÿงพ 2. Info.plist and capabilitiesโ€‹

A framework cannot declare these; add them to your app target:

KeyValue
NSMicrophoneUsageDescription, NSCameraUsageDescription, NSBluetoothAlwaysUsageDescription, NSBluetoothPeripheralUsageDescription, NSLocalNetworkUsageDescription, NSPhotoLibraryUsageDescription, NSPhotoLibraryAddUsageDescriptionyour wording
UIBackgroundModesaudio (meeting audio keeps running after the user presses Home)
UIViewControllerBasedStatusBarAppearancefalse โ€” the meeting UI drives the status bar through React Native, which needs view-controller-based appearance off (otherwise its status-bar calls are no-ops that log an error on every join)
io.livekit.reactnative.expo.ENABLE_MULTITASKING_CAMERA_ACCESStrue (the camera keeps running in picture-in-picture where iOS allows it)

Sharing the device's screen is optional and needs a Broadcast Upload Extension in your app: see ๐Ÿ–ฅ๏ธ iOS screen sharing.


๐Ÿ’ป 3. Codeโ€‹

import BBBMeetingSDK

// AppDelegate (optional: join initializes lazily; doing it here warms up the runtime)
BigBlueButtonSDK.shared.initialize(config: BBBSDKConfig(clientType: "NATIVE_MOBILE"))

// anywhere, from a view controller
BigBlueButtonSDK.shared.join(from: self, options: BBBJoinOptions(joinUrl: url), delegate: self)

extension MyViewController: BBBMeetingDelegate {
func meetingDidJoin() {}
func meetingDidLeave(reason: BBBLeaveReason, detail: String?) {} // the controller is already dismissed
func meetingDidFail(message: String) {}
}

BigBlueButtonSDK.shared.leave() // ask the running meeting to leave

BBBJoinOptions also carries meetingName, theme (.system, .light, .dark), pictureInPicture, screensharePresenter, embedMode, largeScreenLayout and devLogging. BBBSDKConfig.appVersion defaults to your app's CFBundleShortVersionString. All options are in the ๐Ÿ“˜ API reference.

Leave reasonsโ€‹

BBBLeaveReasonMeaning
leftthe user left (leave button, declined recording, cancelled the guest lobby), or your app called leave() (detail is host_leave)
endedthe meeting ended on the server, the user was removed or refused (for example by a moderator, or because the meeting is full), or a guest was denied; detail carries the end code
errorthe join failed or the session hit an unrecoverable error; detail carries the error message or reason code
unsupportedserver version or media bridge not supported by this client
cancelledthe container went away before the meeting UI reported anything

โš™๏ธ Behaviourโ€‹

  • One React Native runtime is created on first use and kept for the lifetime of the process.
  • A join while a meeting is open is ignored.
  • All delegate calls arrive on the main thread.
  • The simulator joins meetings but has no camera and no ReplayKit, so test media on a device.