Repository navigation
en US sdk ios api
Applies to the Swift SDK/XCFramework delivered with the matching version. AkNativeRtcClient runs on the main actor and owns the device session, media tracks, WHIP/WHEP, signaling, and recovery. UIKit/SwiftUI hosts own controls, permissions, renderers, audio route, and ReplayKit extension. Follow the iOS integration walkthrough for dependencies and signing first.
let rtc = AkNativeRtcClient(localRenderer: previewRenderer, delegate: self)
rtc.setInitialMediaEnabled(microphone: false, camera: false)
rtc.joinWithAccessTicket(baseURL: serverURL, roomID: roomID,
accessTicket: oneUseTicket, passcode: "")serverURL must use HTTPS with a certificate trusted by the iPhone, not the Mac's 127.0.0.1. The backend ticket is one-use. Call @MainActor methods from the right actor and preserve HTTP status from thrown or delegate errors.
| Method | Input | Result | Edge case |
|---|---|---|---|
AkNativeRtcClient(localRenderer:delegate:) |
Local RTCVideoRenderer, AkNativeRtcClientDelegate
|
Client | SDK observes foreground/background. Keep one active client per meeting. |
joinWithAccessTicket(baseURL:roomID:accessTicket:passcode:) |
Origin, room, one-use ticket, passcode (empty if none) | Delegate didJoin or didFailHTTP/didFail
|
Waiting room is not publication permission; ticket replay fails. |
createMeeting(settings:creator:) |
Settings dictionary and business-backend async throws creator |
Dictionary with roomId/accessTicket
|
Creator authenticates business users and handles idempotent retry; never send admin credentials to the app. |
listMembers() / participantForPublication(_:)
|
Publication ID for the latter | Member list / member ID or nil
|
Membership/device can change after reconnect; distinguish views by publication ID. |
performRoomAction(_:payload:) |
Allowlisted action and fields | async throws -> Any |
Server rechecks role, device, and grant. Retrying cannot bypass 403. |
startContinuousRecording() / stopContinuousRecording(recordingId:) / getContinuousRecording()
|
Run ID for stop | Async recording state or no active run | Current host starts/stops; didChangeContinuousRecording reports active state. |
leave() / close()
|
None | Device leaves / object ends | Use one cleanup path for navigation. Obtain new business authorization after a kick. |
listDemoRooms(baseURL:) / createDemoMeeting(...) / issueDemoAccessTicket(...)
|
Isolated-test options | Demo rooms/ticket | Not a production identity service. |
getContinuousRecording() is the current active run, not historical archives. Post-meeting query and URLs use the separate archive SDK and view/play/download ticket. Host-only recording permission changes immediately after transfer.
| Method | Input | Result | Edge case |
|---|---|---|---|
setInitialMediaEnabled(microphone:camera:) |
Initial intent | Mic/camera startup flags | OS permission, meeting grants, and host policy still constrain publication. |
setMicrophoneEnabled(_:) / setCameraEnabled(_:)
|
Boolean |
didChangeLocalMedia reports effective state |
A button press is not proof of remote frames/audio. |
listCameras() / switchCamera(to:)
|
Optional camera ID | Device list / didSwitchCamera
|
Position uses AVCaptureDevice.Position; recheck list after permission/device changes. |
setRemoteAudioVolume(publicationID:volume:) |
Publication ID and 0–1 volume | Local playback change | Does not alter the remote microphone or original recording. |
setForeground(_:) |
Foreground Boolean | Capture lifecycle update | SDK observes system notifications; custom scene transitions may also need an explicit update. |
getSupportedVideoModes() / getEndpointInfo()
|
None | Modes / device-info dictionary | Supported mode is not actual FPS. Reports omit hardware-unique identifiers. |
makeCameraPictureInPicture(sourceView:) |
Camera UIView |
AkRtcCameraPictureInPicture or error |
Local display feature; no extra publication or recording change. |
prepareBroadcast(appGroup:) / broadcastIsActive() / stopBroadcastShare()
|
App Group / none | ReplayKit preparation, state, stop | Requires a signed broadcast extension and matching App Group. The OS can terminate sharing. |
Screen and camera are independent streams. A ReplayKit extension captures system content; the main app passes only trusted short-lived session context. Do not log that context or share it with other apps.
| Method | Input | Result | Edge case |
|---|---|---|---|
sendChatMessage(_:targetParticipantID:) |
Text, optional direct target |
didReceiveChatMessage / error |
Direct messages do not appear in public replay. |
uploadAttachment(data:fileName:contentType:caption:targetParticipantID:) / uploadAttachment(fileURL:caption:targetParticipantID:)
|
Data/file URL, type, caption, target |
didUploadAttachment / error |
Commit rechecks current device, room, and direct visibility. Prefer file URL for large files. |
uploadWhiteboardImage(fileURL:) |
Local image file URL | async throws -> AkRtcChatAttachment |
Material upload still needs a board-object event. Revoked write grant blocks final use. |
downloadAttachment(_:) / downloadAttachmentFile(_:) / releaseAttachmentFile(_:)
|
Authorized attachment / local temporary URL |
Data, temp URL, cleanup |
Use file download for large content and release temporary SDK files. |
attachmentPreview(_:maxDimension:) |
Image attachment and pixel limit | UIImage? |
Non-images or decode failure may return nil. Host chooses PDF/video viewers. |
sendHandRaised(_:) / sendReaction(_:)
|
Raised Boolean or reaction | Meeting event | Does not change publication grant. |
Key delegate callbacks: remote video/audio receive and remove manage each view; didChangeLocalMedia and didChangeMediaPermission drive controls; didChangeCapabilities drives host UI; board/chat callbacks drive collaboration; didChangeContinuousRecording drives the indicator; didFailHTTP retains status; nativeRtcClientDidLeave triggers final cleanup. Never revive a new session from stale events of an old session.