You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:09:00