agora.io Swift端用户无法加入同一频道 远端加入无回调无语音
问题修复方案
1. 修复代理未绑定的核心问题
你代码中声明的agoraDelegate变量未做任何赋值,初始化声网引擎时传入的delegate实际为nil,导致所有远端用户加入、音频回调等事件都无法触发,这是didJoinedOfUid方法永远不被调用的直接原因。
修复步骤:
- 让
AgoraViewController遵守AgoraRtcEngineDelegate协议 - 删除无用的
agoraDelegate变量声明,初始化引擎时直接将delegate设置为self - 显式配置频道基础参数,保证和安卓端配置一致
修改后的代码示例:
import Foundation import AgoraRtcKit // 遵守AgoraRtcEngineDelegate协议 class AgoraViewController: UIViewController, AgoraRtcEngineDelegate { var agoraKit: AgoraRtcEngineKit? // 删除原来的agoraDelegate无用声明 override func viewDidLoad() { super.viewDidLoad() initializeAgoraEngine() // 建议先确认麦克风权限后再加入频道 joinChannel() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) leaveChannel() destroyInstance() } func initializeAgoraEngine() { agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: "你的有效AppId", delegate: self) // 显式开启音频模块 agoraKit?.enableAudio() // 频道场景和安卓端保持一致,.communication为通信场景,.liveBroadcasting为直播场景 agoraKit?.setChannelProfile(.communication) // 如果是直播场景,需要显式设置角色为主播才可以发流收流 // agoraKit?.setClientRole(.broadcaster) } func joinChannel() { let result = agoraKit?.joinChannel(byToken: "你的有效Token", channelId: "TestChannel2", info: nil, uid: 0, joinSuccess: {(channel, uid, elapsed) in print("加入频道成功,分配uid:\(uid)") }) } // 该回调现在会正常触发 func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int) { print("远端用户\(uid)加入频道") // 最新版SDK默认自动订阅远端音频,不需要额外调用接口 } func leaveChannel() { agoraKit?.leaveChannel { stats in print("离开频道成功") } } func destroyInstance() { AgoraRtcEngineKit.destroy() agoraKit = nil } }
2. 配置iOS麦克风权限
iOS系统要求应用必须主动申请麦克风权限,且在Info.plist中添加权限描述,未配置会导致麦克风被系统禁用,无法传输语音。
修复步骤:
- 打开项目的Info.plist文件,添加
Privacy - Microphone Usage Description项,值填写麦克风使用说明,例如「需要使用麦克风进行语音通话」 - 加入频道前主动触发权限申请,确认用户授权后再执行加入频道逻辑:
import AVFoundation func checkMicPermissionThenJoin() { AVAudioSession.sharedInstance().requestRecordPermission { granted in DispatchQueue.main.async { if granted { self.joinChannel() } else { print("麦克风权限被拒绝,无法进行语音通话") } } } }
3. 其他校验项
- 确认iOS和安卓两端使用的AppId、频道名、Token生成规则完全一致,若两端频道场景不同(一端为通信场景一端为直播场景)会直接导致无法互通
- 若你生成Token时绑定了固定uid,需要将
joinChannel方法中的uid参数替换为对应绑定的uid,不要传0 - 确认页面退出时
viewWillDisappear方法可正常触发,没有被父容器拦截,避免引擎实例未正常销毁导致下次加入频道异常
内容的提问来源于stack exchange,提问作者it75
相关产品推荐
相关产品推荐

