Finish peer discovery section

This commit is contained in:
2026-05-17 21:23:53 +02:00
parent 4f9b1476cc
commit 91ce5bb73b
2 changed files with 73 additions and 2 deletions
+71
View File
@@ -165,7 +165,78 @@ func session(
}
```
Przechodząc do implementacji klienta, całość jest reprezentowana przez obiekt `NoteEditingSessionClient`. Jego konstruktor przyjmuje tylko identyfikator użytkownika, który jest typem `MCPeerID`, a implementacja obejmuje również stworzenie instancji `MCSession` do wykorzystania w trakcie połączenia z serwerem oraz instancji `MCNearbyServiceAdvertiser`, która propaguje informacje o kliencie do wszystkich innych klientów w pobliżu. Do obu obiektów przypisujemy obiekt delegujący, który będzie właśnie utworzoną instancją `NoteEditingSessionClient`. Dla `MCNearbyServiceAdvertiser` obiekt delegującego musi implementować protokół `MCNearbyServiceAdvertiserDelegate`.
```swift
init(peer: MCPeerID) {
ownPeer = peer
session = MCSession(
peer: peer,
securityIdentity: nil,
encryptionPreference: .required
)
advertiser = MCNearbyServiceAdvertiser(
peer: peer,
discoveryInfo: [:],
serviceType: "peered"
)
super.init()
advertiser.delegate = self
session.delegate = self
}
```
Instancja `NoteEditingSessionClient` jest tworzona już przy pierwszym uruchomieniu aplikacji. Po utworzeniu przez użytkownika przyjaznej nazwy, która będzie używana do identyfikacji, w tle wywoływana jest metoda `startBrowsingForNotes()`, która wywołuje `startAdvertisingPeer()` obiektu `advertiser`. Przed rozpoczęciem nasłuchiwania aplikacja wywołuje również `stopBrowsingForNotes()`, by zatrzymać nasłuchiwanie, jeśli wcześniej było ono rozpoczęte, oraz zatrzymuje działanie obiektu `MCSession`, by zamknąć ewentualnie istniejącą sesję edycji notatki.
```swift
func startBrowsingForNotes() {
advertiser.startAdvertisingPeer()
}
func stopBrowsingForNotes() {
advertiser.stopAdvertisingPeer()
session.disconnect()
}
```
Jedyna metoda wymagana przez protokół `MCNearbyServiceAdvertiserDelegate` nazywa się `adverties()` i w argumentach przyjmuje informację o otrzymanym zaproszeniu i metadanych jakie to zaproszenie zawierało. Aplikacja próbuje zdekodować migawkę notatki, a następnie konstruuje obiekt `NoteInvitation` i umieszcza go w tablicy `invitations`. Umieszczenie w tablicy trzeba wykonać na głównym wątku, ponieważ, analogicznie jak w wypadku implementacji `MCNearbyServiceBrowserDelegate`, nie mamy gwarancji na jakim wątku będzie wykonywała się ta metoda.
```swift
func advertiser(
_ advertiser: MCNearbyServiceAdvertiser,
didReceiveInvitationFromPeer peerID: MCPeerID,
withContext context: Data?,
invitationHandler: @escaping (Bool, MCSession?) -> Void
) {
guard
let context,
let noteContent = try? JSONDecoder().decode(NoteInvitation.NoteContent.self, from: context)
else { return }
DispatchQueue.main.async {
self.invitations.append(
.init(
invitatorID: peerID,
note: noteContent,
invitationHandler: { [weak self, invitationHandler] accepted in
guard let self else { return }
invitationHandler(accepted, self.session)
DispatchQueue.main.async {
self.invitations.removeAll { $0.id == peerID }
}
}
)
)
}
}
```
== Transportowanie danych
== Algorytm rozwiązywania konfliktów
== Środowisko developerskie i stack technologiczny
== Implementacja logiki P2P
BIN
View File
Binary file not shown.