ios - 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 已过时。
解决方案
假设您已经使用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
}
}
推荐阅读
- java - 根据全局布尔值运行一组测试
- sql - 如何合并来自同一个表的两个分组查询?
- bash - bash 脚本的 if 和 else 语句
- database - Weblogic 控制台上的应用程序 STOP/START 上的 ADF Web 应用程序数据库连接问题
- javascript - Fetch API 中的请求信号属性
- excel - 使用 R1C1 符号和动态工作表参考编码 SUMIF 的难度
- excel - Excel VBA Outlook - 主题包含未找到回复电子邮件
- java - 使用 C++ 打开 Android 手电筒
- android - 禁用 Android 自动填充验证码
- stripe-payments - 您没有设置有效的可发布密钥。在 laravel 中清除缓存后,使用您的可发布密钥调用 stripe.setpublishablekey()