Kanały presence
Kanał, którego nazwa zaczyna się od presence-, używa autoryzacji kanału prywatnego i dodaje tożsamość członka. Twój backend przypisuje każdemu subskrybentowi member_id. Subskrybenci otrzymują bieżącą listę członków oraz zdarzenia dołączania i opuszczania kanału.
Używaj kanałów presence do list online, podglądu dokumentów, wskaźników pisania lub współdzielonych kursorów.
Subskrypcja
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}")
}
}W Swift i Kotlin subscribe zwraca bazowy typ kanału. Rzutuj go na PresenceChannel przed uzyskaniem dostępu do myId lub members. Swift udostępnia mapę członków dla bird:subscription_succeeded oraz Member dla zdarzeń dołączania i opuszczania. Kotlin udostępnia każde zdarzenie jako JsonElement. W obu klientach odczytuj bieżący roster z room.members.
bird:subscription_succeeded uruchamia się po zakończeniu subskrypcji. W tym momencie room.members zawiera bieżący roster, a room.myId zawiera Twój member_id. Wyrenderuj ten początkowy roster przed zastosowaniem późniejszych zdarzeń dołączania i opuszczania.
Autoryzacja przebiega tak samo jak w kanale prywatnym, z jednym dodatkiem: Twój endpoint zwraca member_data, ciąg JSON zawierający member_id i opcjonalny member_info, i musi podpisać dokładnie ten ciąg. Zobacz Autoryzacja kanałów.
Używaj member_info bezpiecznie
Każdy członek kanału otrzymuje member_info. Używaj go do małych, publicznych danych profilowych, takich jak nazwa wyświetlana lub URL awatara. Nie umieszczaj w nim adresów e-mail, ról autoryzacyjnych ani innych wrażliwych danych.
Twój backend przypisuje member_id i member_info w podpisanej odpowiedzi autoryzacyjnej. Klient może zażądać subskrypcji, ale nie może wybrać podpisanej tożsamości.
Członkowie i połączenia
Jeden członek może mieć kilka połączeń. Na przykład trzy otwarte karty tworzą jednego członka i trzy połączenia:
| Co się dzieje | Zdarzenie członka | Liczba połączeń kanału |
|---|---|---|
| Pierwsza karta subskrybuje | bird:member_added | 1 |
| Druga karta subskrybuje | brak | 2 |
| Druga karta się zamyka | brak | 1 |
| Ostatnia karta się zamyka | bird:member_removed | 0 |
room.members reprezentuje tożsamości, a nie sesje. Aby otrzymywać liczbę otwartych połączeń, włącz Connection counting i Connection count events, a następnie binduj bird:connection_count.
Odczyt obecności z serwera
Istnieją dwa odczyty po stronie serwera i żaden nie wymaga subskrypcji:
- Wylistuj członków kanału zwraca wartości member_id aktualnie subskrybowane w kanale presence.
- Pobierz kanał z include=member_count zwraca liczbę obecnych członków bez ich wypisywania.
member_count działa tylko w kanałach presence. Żądanie go na kanale publicznym lub prywatnym jest błędem walidacji, ponieważ te kanały nie mają członków.
Możesz też zażądać go podczas publikowania, co zwraca stan każdego docelowego kanału w danym momencie. Zobacz Publikowanie zdarzeń.
Następne kroki
- Autoryzacja kanałów opisuje member_data i ciąg podpisywany przez Twój backend.
- Kanały prywatne to ta sama autoryzacja bez tożsamości.
- Wykluczanie odbiorców zdarzeń zapobiega otrzymywaniu przez klienta własnej zmiany.
Powiązane zasoby
Kontynuuj z dokumentacją, przewodnikami i przykładami dotyczącymi tego tematu. Zasoby są w języku angielskim.
Poznaj możliwościRealtimePodążaj ścieżką naukiBuild your first integrationPrzewodnik wdrożeniowySend your first realtime event
Wypróbuj ćwiczenie i uzyskaj brief wdrożeniowy