nimeet 文档中心
English

iOS 快速开始与功能指南

iOS:前置条件、安装、Token、加入频道、发布订阅、事件、错误处理与排障;接口名与签名在构建时取自公开 SDK 接口定义。

接口小节由公开 SDK 接口定义生成

版本 v1.1.0 · 更新于 2026-10-26 · 修订 1

iOS 端是 Objective-C 选择器形状的原生引擎:AgoraRtcEngineKit 单例 + AgoraRtcEngineDelegate 回调。方法名与声网 iOS SDK 兼容版本逐符号一致(公开 SDK 接口定义,apiVersion 见本页「平台与公开接口定义」)。

前置条件

  • Xcode 16+、iOS 15+ 部署目标、Swift 5.9+(也支持 Objective-C)。
  • Info.plist 必须有 NSCameraUsageDescription 与 NSMicrophoneUsageDescription,否则采集会被系统直接拒绝(无弹窗)。
  • 屏幕共享需要单独的 Broadcast Upload Extension(ReplayKit),并配置 App Group。
  • 已拿到 appId 与 Token 服务(见 控制台开通服务与获取凭证)。

安装

ruby
# Podfile(坐标以发布版本为准)
pod 'NimeetRtc', :path => '../sdk/ios'

Swift Package 与 Carthage 形态在发布说明里会同步给出。

获取 Token

客户端不能持有 customerSecret。推荐宿主 App 自带后端签发,Token 通过 RtcTokenProvider 的 callback 形态注入(与 Android 端同一个概念):

swift
let provider = FallbackTokenProvider(providers: [
    CallbackTokenProvider { channel, uid, role, completion in
        authClient.fetchRtcToken(channel: channel, uid: uid, role: role, completion: completion)
    },
    StaticTokenProvider(token: ProcessInfo.processInfo.environment["NIMEET_TEST_TOKEN"] ?? "")
])

加入频道

swift
import NimeetRtc

final class MeetingController: NSObject, AgoraRtcEngineDelegate {
    private var engine: AgoraRtcEngineKit?

    func start(appId: String, token: String, localView: UIView) {
        let config = AgoraRtcEngineConfig()
        config.appId = appId
        engine = AgoraRtcEngineKit.sharedEngine(withAppId: appId, delegate: self)
        engine?.setChannelProfile(.liveBroadcasting)
        engine?.enableVideo()
        let canvas = AgoraRtcVideoCanvas()
        canvas.view = localView
        engine?.setupLocalVideo(canvas)
        engine?.startPreview()

        let options = AgoraRtcChannelMediaOptions()
        options.clientRoleType = .broadcaster
        engine?.joinChannel(byToken: token,
                            channelId: "weekly-sync",
                            uid: 10001,
                            mediaOptions: options,
                            joinSuccess: { channel, uid, elapsed in
            print("joined \(channel) uid=\(uid) elapsed=\(elapsed)")
        })
    }

    func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int) {
        // 远端用户加入:分配远端画面容器
    }

    func rtcEngine(_ engine: AgoraRtcEngineKit, didOfflineOfUid uid: UInt, reason: AgoraUserOfflineReason) {
        // 远端用户离开
    }

    func rtcEngine(_ engine: AgoraRtcEngineKit, didOccurError errorCode: AgoraErrorCode) {
        // 错误号分流,见错误处理一节
    }
}

发布与订阅

原生端没有 publish(track):入会时由 AgoraRtcChannelMediaOptions 决定发布什么,之后用开关方法控制。

swift
engine?.muteLocalAudioStream(true)        // 静音麦克风
engine?.muteLocalVideoStream(true)        // 关闭摄像头画面
engine?.updateChannelMediaOptions(options) // 切角色 / 改订阅范围

屏幕共享用 ReplayKit:宿主 App 启动 Broadcast Upload Extension,扩展里调用 startScreenCapture: 把样本缓冲喂给 SDK。

事件

回调何时触发典型处理
rtcEngine:didJoinedOfUid:elapsed:远端用户加入分配容器
rtcEngine:firstRemoteVideoDecodedOfUid:size:elapsed:远端首帧解码渲染
rtcEngine:didOfflineOfUid:reason:远端离开释放容器
rtcEngine:didOccurError:运行时错误按 AgoraErrorCode 分流
Token 将过期回调权限到期前续期后 renewToken:

错误处理

  • 同步方法返回 Int32:0 成功,负值为声网错误号。
  • 异步错误走 didOccurError。
  • 未实现的能力返回 -4(ERR_NOT_SUPPORTED),显式失败。

排障

现象原因处理
打开摄像头无反应Info.plist 缺 usage description补 NSCameraUsageDescription / NSMicrophoneUsageDescription
真机黑屏、模拟器正常模拟器没有摄像头用真机验证采集链路
入会失败Token 与 appId/频道不匹配GET /v1/tokens/verify 自查
屏幕共享无画面Extension 未配置 App Group检查 extension 的 NSExtension 配置与共享容器
后台断流iOS 挂起应用使用 ReplayKit 或前台音频会话保活策略

下一步

平台信息

项值
平台iOS
语言Swift / Objective-C
SDK 包NimeetRtc
接口版本4.7.0
兼容参考声网 ios 端 API

本端公开接口与声网 ios 端 API 对齐;安装与运行要求见上面前置条件。

可用性

该端 SDK:正式可用。本页代码片段使用公开 API;运行时的能力边界以实际发布的 SDK 包为准。

加入频道链路

下列方法名、参数类型与返回值与同端 API 参考一致。一个平台若有多个重载,这里展示最常用的那一个;完整重载见同端 API 参考页。

步骤接口方法重载数
开启视频与本地预览AgoraRtcEngineKitenableVideo1
加入频道AgoraRtcEngineKitjoinChannelByToken:channelId:info:uid:joinSuccess:1
离开频道AgoraRtcEngineKitleaveChannel:1
创建实例 / 初始化AgoraRtcEngineKitsharedEngineWithAppId:delegate:1
typescript
enableVideo(): int
joinChannelByToken:channelId:info:uid:joinSuccess:(token?: NSString*, channelId: NSString*, info?: NSString*, uid: NSUInteger, joinSuccessBlock?: void(^ )(NSString*channel,NSUInteger uid,NSInteger elapsed)): int
leaveChannel:(leaveChannelBlock?: void(^ )(AgoraChannelStats*stat)): int
sharedEngineWithAppId:delegate:(appId: NSString*, delegate?: id): instancetype

事件与回调

该端 SDK 没有事件回调。

错误码

常量值
AgoraErrorCodeAdmGeneralError1005
AgoraErrorCodeAdmInitLoopback1022
AgoraErrorCodeAdmInitPlayout1008
AgoraErrorCodeAdmInitRecording1011
AgoraErrorCodeAdmJavaResource1006
AgoraErrorCodeAdmNoPlayoutDevice1360
AgoraErrorCodeAdmNoRecordingDevice1359
AgoraErrorCodeAdmPlayAbnormalFrequency1020
AgoraErrorCodeAdmRecordAbnormalFrequency1021
AgoraErrorCodeAdmRecordAudioFailed1018
AgoraErrorCodeAdmRuntimePlayoutError1015
AgoraErrorCodeAdmRuntimeRecordingError1017
AgoraErrorCodeAdmSampleRate1007
AgoraErrorCodeAdmStartLoopback1023
AgoraErrorCodeAdmStartPlayout1009
AgoraErrorCodeAdmStartRecording1012
AgoraErrorCodeAdmStopPlayout1010
AgoraErrorCodeAdmStopRecording1013
AgoraErrorCodeAlreadyInUse19
AgoraErrorCodeBitrateLimit115
AgoraErrorCodeBufferTooSmall6
AgoraErrorCodeConnectionInterrupted111
AgoraErrorCodeConnectionLost112
AgoraErrorCodeDecryptionFailed120
AgoraErrorCodeEncryptedStreamNotAllowedPublish130
AgoraErrorCodeFailed1
AgoraErrorCodeInitNetEngine21
AgoraErrorCodeInvalidAppId101
AgoraErrorCodeInvalidArgument2
AgoraErrorCodeInvalidChannelId102
AgoraErrorCodeInvalidState8
AgoraErrorCodeInvalidToken110
AgoraErrorCodeInvalidUserAccount134
AgoraErrorCodeJoinChannelRejected17
AgoraErrorCodeLeaveChannelRejected18
AgoraErrorCodeLoadMediaEngine1001
AgoraErrorCodeNoError0
AgoraErrorCodeNoServerResources103
AgoraErrorCodeNotInChannel113
AgoraErrorCodeNotInitialized7
AgoraErrorCodeNotReady3
AgoraErrorCodeNotSupported4
AgoraErrorCodePcmSendBufferOverflow201
AgoraErrorCodePcmSendFormat200
AgoraErrorCodeResourceLimited22
AgoraErrorCodeSizeTooLarge114
AgoraErrorCodeStartCall1002
AgoraErrorCodeStartCamera1003
AgoraErrorCodeStartVideoRender1004
AgoraErrorCodeTimedOut10
AgoraErrorCodeTokenExpired109
AgoraErrorCodeTooManyDataStreams116
AgoraErrorCodeVcmEncoderEncodeError1602
AgoraErrorCodeVcmEncoderInitError1601
AgoraErrorCodeVcmEncoderSetError1603
AgoraErrorCodeVcmUnknownError1600
AgoraErrorCodeVdmCameraNotAuthorized1501
AgoraErrorCodeVideoEffectAssetInvalid1700
AgoraErrorCodeVideoEffectEngineInvalid1702
AgoraErrorCodeVideoEffectInvalidBundlePath1707
AgoraErrorCodeVideoEffectInvalidParam1705
AgoraErrorCodeVideoEffectNodeNotActive1704
AgoraErrorCodeVideoEffectNotSupported1706
AgoraErrorCodeVideoEffectSaveFailed1701
AgoraErrorCodeWatermarkAGRB128
AgoraErrorCodeWatermarkInfo127
AgoraErrorCodeWatermarkParam124
AgoraErrorCodeWatermarkPath125
AgoraErrorCodeWatermarkPng126
AgoraErrorCodeWatermarkRead129

平台 REST 层用 REST 错误码;SDK 层把连接/鉴权失败映射成声网错误号,映射表见 各端 SDK 错误标识。

本页由文档构建流水线生成 · 2026-10-31 01:24:02 UTC · 文档中心 v1.1.0.

内容依据公开 API 定义.

ni-meet 是自建 RTC PaaS,媒体面基于 LiveKit(Apache-2.0),并与声网 API 兼容。