Presence 频道
名称以 presence- 开头的频道使用私有频道授权,并添加成员身份。你的后端为每个订阅者分配一个 member_id。订阅者会收到当前成员列表,以及成员加入或离开时的事件。
可以将 presence 频道用于在线花名册、文档查看者、输入指示器或协作光标。
订阅
const room = bird.subscribe("presence-room-1");
room.bind("bird:subscription_succeeded", () => {
console.log("me:", room.myId);
console.log("here now:", [...room.members.values()]);
});
room.bind("bird:member_added", (member) => console.log("joined", member.member_id));
room.bind("bird:member_removed", (member) => console.log("left", member.member_id));guard let room = bird.subscribe("presence-room-1") as? PresenceChannel else { return }
room.bind(BirdProtocol.Event.subscriptionSucceeded) { _ in
print("me:", room.myId ?? "")
print("here now:", room.members.keys)
}
room.bind(BirdProtocol.Event.memberAdded) { member in
print("joined", (member as? Member)?.memberId ?? "")
}
room.bind(BirdProtocol.Event.memberRemoved) { member in
print("left", (member as? Member)?.memberId ?? "")
}val room = bird.subscribe("presence-room-1")
if (room is PresenceChannel) {
room.bind(BirdProtocol.Event.SUBSCRIPTION_SUCCEEDED) {
println("me: ${room.myId}")
println("here now: ${room.members.keys}")
}
room.bind(BirdProtocol.Event.MEMBER_ADDED) { data ->
println("joined ${data?.jsonObject?.get("member_id")?.jsonPrimitive?.content}")
}
room.bind(BirdProtocol.Event.MEMBER_REMOVED) { data ->
println("left ${data?.jsonObject?.get("member_id")?.jsonPrimitive?.content}")
}
}在 Swift 和 Kotlin 中,subscribe 返回一个基础频道类型。在访问 myId 或 members 之前,需要将其转换为 PresenceChannel。Swift 提供一个成员映射用于 bird:subscription_succeeded,以及一个 Member 用于加入和离开事件。Kotlin 将每个事件表示为 JsonElement。在两个客户端中,都可以从 room.members 读取当前花名册。
bird:subscription_succeeded 在订阅完成时触发。此时,room.members 包含当前花名册,room.myId 包含你的 member_id。在应用后续的加入和离开事件之前,先渲染这个初始花名册。
授权流程与私有频道相同,但多了一项:你的端点返回 member_data,这是一个 JSON 字符串,携带 member_id 和可选的 member_info,并且必须对该字符串进行签名。参见频道授权。
安全使用 member_info
每个频道成员都会收到 member_info。将它用于少量公开的个人资料数据,例如显示名称或头像 URL。不要包含电子邮件地址、授权角色或其他敏感数据。
你的后端在签名的授权响应中分配 member_id 和 member_info。客户端可以请求订阅,但无法选择签名的身份。
成员与连接
一个成员可以持有多个连接。例如,三个打开的标签页产生一个成员和三个连接:
| 发生的操作 | 成员事件 | 频道连接数 |
|---|---|---|
| 第一个标签页订阅 | bird:member_added | 1 |
| 第二个标签页订阅 | 无 | 2 |
| 第二个标签页关闭 | 无 | 1 |
| 最后一个标签页关闭 | bird:member_removed | 0 |
room.members 代表的是身份而非会话。要接收打开的连接数,请启用连接计数和连接计数事件,然后绑定 bird:connection_count。
从服务器读取 presence 信息
有两种服务器端读取方式,都不需要订阅:
member_count 仅适用于 presence 频道。在公共或私有频道上请求它会产生验证错误,因为这些频道没有成员。
你也可以在发布消息时请求它,这会返回每个目标频道在该时刻的状态。参见发布事件。
后续步骤
相关资源
继续查阅此主题的文档、指南和示例。资源为英文。