nimeet 文档中心
English

macOS 快速开始与功能指南

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

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

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

macOS 端与 iOS 共用 AgoraRtcEngineKit / AgoraRtcEngineDelegate 形状,差别在桌面采集:可以按「显示器 id」或「窗口 id」钉住采集源,并且需要系统屏幕录制权限与对应 entitlement。

前置条件

  • Xcode 16+、macOS 12+ 部署目标。
  • Info.plist 补 NSCameraUsageDescription、NSMicrophoneUsageDescription;屏幕共享需在「系统设置 → 隐私与安全性 → 屏幕录制」中授权。
  • 若开启 App Sandbox:需要 com.apple.security.device.camera、com.apple.security.device.audio-input、com.apple.security.device.screen-capture。
  • 已拿到 appId 与 Token 服务(见 控制台开通服务与获取凭证)。

安装

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

获取 Token

与 iOS 相同:Token 由后端签发,客户端通过 CallbackTokenProvider 注入;macOS 端可以把 Token 缓存在内存里,不要写进 Keychain 的明文项。

加入频道

swift
import NimeetRtc

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

    func start(appId: String, token: String, localView: NSView) {
        engine = AgoraRtcEngineKit.sharedEngine(withAppId: appId, delegate: self)
        engine?.setChannelProfile(.liveBroadcasting)
        engine?.enableVideo()
        let canvas = AgoraRtcVideoCanvas()
        canvas.view = localView
        engine?.setupLocalVideo(canvas)
        engine?.startPreview()
        engine?.joinChannel(byToken: token, channelId: "weekly-sync", uid: 10001, mediaOptions: .init()) { channel, uid, elapsed in
            print("joined \(channel) uid=\(uid)")
        }
    }

    func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int) { }
    func rtcEngine(_ engine: AgoraRtcEngineKit, didOfflineOfUid uid: UInt, reason: AgoraUserOfflineReason) { }
}

发布与订阅

桌面端最常用的是「共享某个窗口」:

swift
// 1) 枚举源
engine?.getScreenCaptureSources(withThumbSize: CGSize(width: 160, height: 90),
                               iconSize: CGSize(width: 32, height: 32),
                               includeScreen: true) { sources in
    // 2) 选一个窗口源,按 windowId 钉住采集
    if let window = sources.first(where: { $0.sourceType == .window }) {
        let params = AgoraScreenCaptureParameters()
        params.frameRate = 15
        let region = CGRect.zero
        engine?.startScreenCapture(byWindowId: window.windowId, regionRect: region, captureParams: params)
    }
}

按显示器采集用 startScreenCaptureByDisplayId:regionRect:captureParams:;停止用 stopScreenCapture。

事件

与 iOS 同一套 delegate:rtcEngine:didJoinedOfUid:elapsed:、rtcEngine:didOfflineOfUid:reason:、rtcEngine:didOccurError:; 屏幕共享额外有源列表与采集状态回调。

错误处理

  • 同步方法返回 Int32,0 成功,负值为声网错误号;未实现能力返回 -4。
  • 屏幕共享最常见的失败不是版本不对,而是权限缺失:源列表为空时先检查系统授权与 entitlement。

排障

现象原因处理
源列表为空未授予屏幕录制权限系统设置授权后重启 App
共享窗口是黑屏选中了受保护窗口或最小化窗口换整屏或可见窗口
采集帧率很低frameRate 与分辨率过高降到 15fps / 1080p 以内
沙盒下崩溃缺少 entitlement补 com.apple.security.device.*
音视频都正常但远端听不到麦克风权限被拒检查 NSMicrophoneUsageDescription 与系统隐私设置

下一步

平台信息

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

本端公开接口与声网 macos 端 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 兼容。