首页 > 解决方案 > AgoraKit 无法向远程用户发送 `userinfo`

问题描述

我正在将 Agora 集成到我的 iOS Swift 5 应用程序中,基本用例揭示了莫名其妙的行为。假设爱丽丝打电话给鲍勃,当爱丽丝加入指定用户信息的频道时:

        agoraKit.joinChannel(
            byToken: nil
          , channelId: "chan-1234"
          , info: "alice-userid"
          , uid: 0
        ) { [weak self] (sid, uid, elapsed) in
            print("\n Join channel ...: for sid: \(sid), uid: \(uid), dt: \(elapsed)")
        }

info: "alice-userid"Bob 无法访问以下数据:

    func rtcEngine(_ engine: AgoraRtcEngineKit, firstRemoteVideoDecodedOfUid uid:UInt, size:CGSize, elapsed:Int) {

        let userInfo = agoraKit.getUserInfo(byUid: uid, withError: nil)        
        print("added user: \(uid), with userinfo: \(userInfo)") // get uid, nil

    }

在鲍勃这边,userInfo是零。所以我尝试使用用户帐户加入,

         agoraKit.registerLocalUserAccount("alice-userid", appId: AppID)
        agoraKit.joinChannel(
              byUserAccount: "alice-account-data"
            , token: nil
            , channelId: "chan-1234"
        ) { [weak self] (sid, uid, elapsed) in
            print("\n Join channel ...: for sid: \(sid), uid: \(uid), dt: \(elapsed)")
        }

这完全失败了。我在这里引用文档:

在第二种情况下,文档有拼写错误,并且 API 已过时。

标签: iosswiftagora.io

解决方案


假设您已经使用registerLocalUserAccount:appId:方法注册了 Alice 和 Bob。他们都必须通过方法加入频道joinChannelByUserAccount:token:channelId:joinSuccess:。确保该registerLocalUserAccount:appId:方法返回 0,这意味着客户端已成功注册。

现在正如Agora 文档中关于getUserInfoByUid:withError:方法的说明:

用户加入频道后,SDK 会获取远程用户的用户 ID 和用户帐号,并将其缓存在映射表对象(AgoraUserInfo)中,并didUpdatedUserInfo在本地客户端触发回调。收到didUpdatedUserInfo回调后,可以调用该方法,通过传入用户ID,从userInfo对象中获取用户的用户账号。

这意味着调用的正确时机是调用getUserInfoByUid:withError:委托rtcEngine:didUpdatedUserInfo:withUid:方法的时间。

我从您的片段中猜测您的课程已经符合 AgoraRtcEngineDelegate 协议。所以你所要做的就是实现这个委托方法并getUserInfoByUid:withError:在方法体内调用。

例子:

步骤1:

让你的类符合 AgoraRtcEngineDelegate:

// Assign delegate when instantiating
lazy var agoraKit: AgoraRtcEngineKit = {
  AgoraRtcEngineKit.sharedEngine(withAppId: "YourAppID", delegate: self)
}()

// Assign delegate later
agoraKit.delegate = self
// Conform to AgoraRtcEngineDelegate
extension MyClass: AgoraRtcEngineDelegate {
  //...
}

第2步:

registerLocalUserAccount:appId:用方法注册用户。

// User with 'bob' username will be registered
let registerResponse: Int32 = agoraKit.registerLocalUserAccount("bob", appId: "YourAppID")
if registerResponse == 0 {
    // Successfully registered
} else {
    // Failed to register
}

第 3 步:

用户注册成功后加入频道。

agoraKit.joinChannel(byUserAccount: "bob", token: nil, channelId: "room123") { (channel, uid, elapsed) in
    print("User joined channel \(channel) with \(uid). Elapsed time is \(elapsed)ms.")
}

第4步:

实现rtcEngine:didUpdatedUserInfo:withUid:委托方法。

// This method will be triggered after Agora SDK
// caches user ID and user account of the remote user. 
func rtcEngine(_ engine: AgoraRtcEngineKit, didUpdatedUserInfo userInfo: AgoraUserInfo, withUid uid: UInt) {
    var error: AgoraErrorCode = .noError
    let userInfoWithUid = agoraKit.getUserInfo(byUid: uid, withError: &error)
    if error == .noError {
        // Do something with AgoraUserInfo object
    }
}

推荐阅读