Finish peer invitation from server side

This commit is contained in:
2026-05-17 20:03:05 +02:00
parent c100443227
commit 4f9b1476cc
2 changed files with 54 additions and 3 deletions
+52 -1
View File
@@ -112,7 +112,58 @@ func stopServer() {
} }
``` ```
Obiekt `browser` w momencie wykrycia nowego użytkownika w pobliżu, wywołuje naszą metodę o nazwie `browser`, która przyjmuje wszystkie potrzebne informacje o znalezionym użytkowniku. Implementacja mojego systemu następnie upewnia się czy odkryty użytkownik nie jest jednocześnie autorem notatki, co jest znanym błędem w Multipeer Connectivity, a następnie po udanej weryfikacji dodajemy nowy obiekt dostępnego użytkownika do tablicy na podstawie której jest budowany interfejs z listą dostępnych użytkowników. Obiekt `browser` w momencie wykrycia nowego użytkownika w pobliżu, wywołuje naszą metodę o nazwie `browser()`, która przyjmuje wszystkie potrzebne informacje o znalezionym użytkowniku. Implementacja mojego systemu następnie upewnia się czy odkryty użytkownik nie jest jednocześnie autorem notatki, co jest znanym błędem w Multipeer Connectivity. Następnie po udanej weryfikacji dodajemy nowy obiekt dostępnego użytkownika do tablicy na podstawie której jest budowany interfejs z listą dostępnych użytkowników.
```swift
func browser(
_ browser: MCNearbyServiceBrowser,
foundPeer peerID: MCPeerID,
withDiscoveryInfo info: [String: String]?
) {
guard !visiblePeers.contains(where: { $0.mcPeer == peerID }) && peerID.displayName != ownPeer.peer.displayName else { return }
DispatchQueue.main.async {
self.visiblePeers.append(Peer(mcPeer: peerID, state: .available))
}
}
```
W sytuacji gdy użytkownik straci połączenie z połączonym klientem, następuje usunięcie jego identyfikatora z listy, poprzez wywołanie metody o takiej samej nazwie, ale z parametrami wskazującymi na scenariusz zgubienia klienta.
```swift
func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
DispatchQueue.main.async {
guard let peerIdx = self.visiblePeers.firstIndex(where: { $0.mcPeer == peerID }) else { return }
self.visiblePeers.remove(at: peerIdx)
}
}
```
Każda modyfikacja obiektów klasy w tym wypadku musi zostać wywołana na tym samym wątku, ponieważ Multipeer Connectivity nie gwarantuje, że kod będzie się wykonał zawsze na tym samym wątku. Wybrałem wątek główny, ze względu na bezpośrednie użycie właściwości klasy wewnątrz obiektów odpowiedzialnych za budowę interfejsu użytkownika.
O stanie połączenia z innymi klientami mój system jest informowany przez wykonanie metody session z parametrami zawierającymi informację o stanie, który jest reprezentowany przez typ enumeracji, obiekt sesji oraz identyfikator klienta, których ten stan połączenia dotyczy. Na podstawie tych argumentów, aplikacja aktualizuje tablicę `visiblePeers`.
```swift
func session(
_ session: MCSession,
peer peerID: MCPeerID,
didChange state: MCSessionState
) {
DispatchQueue.main.async {
guard let idx = self.visiblePeers.firstIndex(where: { $0.mcPeer == peerID }) else { return }
switch state {
case .connected:
self.visiblePeers[idx].state = .joined
case .notConnected:
let currentState = self.visiblePeers[idx].state
if currentState == .invitationPending || currentState == .joined {
self.visiblePeers[idx].state = .rejected
}
default:
break
}
}
}
```
== Transportowanie danych == Transportowanie danych
== Algorytm rozwiązywania konfliktów == Algorytm rozwiązywania konfliktów
BIN
View File
Binary file not shown.