Compare commits
2 Commits
10e08435a7
...
69c4ec3e06
| Author | SHA1 | Date | |
|---|---|---|---|
| 69c4ec3e06 | |||
| c55b8e38ca |
@@ -47,12 +47,12 @@ final class NoteEditingSessionServer: NSObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func invite(peer: Peer, to note: NoteInvitation.NoteContent) {
|
func invite(peer: Peer, to note: NoteInvitation.NoteContent) {
|
||||||
guard peer.state == .available else { return }
|
guard peer.state == .available, let note = try? JSONEncoder().encode(note) else { return }
|
||||||
browser.invitePeer(
|
browser.invitePeer(
|
||||||
peer.mcPeer,
|
peer.mcPeer,
|
||||||
to: session,
|
to: session,
|
||||||
withContext: try! JSONEncoder().encode(note),
|
withContext: note,
|
||||||
timeout: 5
|
timeout: 600
|
||||||
)
|
)
|
||||||
guard let idxToUpdate = visiblePeers.firstIndex(where: { $0.mcPeer == peer.mcPeer }) else { return }
|
guard let idxToUpdate = visiblePeers.firstIndex(where: { $0.mcPeer == peer.mcPeer }) else { return }
|
||||||
visiblePeers[idxToUpdate].state = .invitationPending
|
visiblePeers[idxToUpdate].state = .invitationPending
|
||||||
|
|||||||
@@ -65,12 +65,55 @@ struct NoteInvitation: Identifiable {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Ostatnim obiektem jest struktura `Peer`, która jest opisem aktualnego stanu połączenia wykrytego innej instancji systemu w pobliżu użytkownika.
|
Ostatnim obiektem jest struktura `Peer`, która jest opisem aktualnego stanu połączenia wykrytego innej instancji systemu w pobliżu użytkownika. Składa się z wartości enumerowanej opisującej stan połączeniao raz identyfikatorem użytkownika w sieci peer to peer. Implementuja ona protokół `Idenfitiable`, by móc zostać poprawnie użyta do rysowania listy dostępnych klientów w pobliżu użytkownika.
|
||||||
|
|
||||||
|
```swift
|
||||||
|
struct Peer: Identifiable {
|
||||||
|
enum ConnectionState {
|
||||||
|
case available
|
||||||
|
case joined
|
||||||
|
case rejected
|
||||||
|
case invitationPending
|
||||||
|
}
|
||||||
|
|
||||||
|
var id: String { mcPeer.displayName }
|
||||||
|
let mcPeer: MCPeerID
|
||||||
|
var state: ConnectionState
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
== Warstwa sieciowa i komunikacja P2P
|
== Warstwa sieciowa i komunikacja P2P
|
||||||
|
Całość komunikacji między urządzeniami odbywa się z wykorzystaniem frameworka Multipeer Connectivity. Klient twórcy notatki pełni rolę serwera, a pozostali użytkownicy, po uprzednim zaproszeniu, mogą dołączyć do edycji notatki, wysyłać swoje zmiany jak i odbierać zmiany, które dystrybuuje serwer.
|
||||||
|
|
||||||
== Odkrywanie innych urządzeń
|
== Odkrywanie innych urządzeń
|
||||||
|
Obiekt reprezentujący serwer został nazwany `NoteEditingSessionServer`, który dziedziczy właściowści po klasie `NSObject`, która jest uniwersalną implementacją wielu zachowań, które są wymagane od frameworków udostępnianych przez Apple, które zostały napisane w języku Objective-C. Jego konstruktor w przyjmowanych argumentach oczekuje tylko obiektu `OwnPeer`, który będzie wykorzystywany do identyfikacji instancji aplikacji u innych klientów. Sama implementacja konstruktora tworzy nową sesję `MCSession`; obiekt `MCNearbyServiceBrowser`, który odpowiada za wykrywanie pobliskich klientów. Finalnie przypisuje referencję do samego siebie jako parametr `delegate` dla utworzonych `MCSession` i `MCNearbyServiceBrowser`. Pozwala nam to zaimplementować metody, które będą wykorzystywane wewnątrz tych obiektów do komunikacji z innymi użytkownikami. Protokoły delegujące dla wspomnianych obiektów nazywają się odpowiednio `MCSessionDelegate` oraz `MCNearbyServiceBrowserDelegate`. Moja implementacja tych protokołów zostanie przedstawiona w dalszej części pracy.
|
||||||
|
|
||||||
|
```swift
|
||||||
|
init(peer: OwnPeer) {
|
||||||
|
ownPeer = peer
|
||||||
|
browser = .init(peer: peer.peer, serviceType: "peered")
|
||||||
|
session = .init(peer: peer.peer, securityIdentity: nil, encryptionPreference: .required)
|
||||||
|
super.init() // wykonuje pozostałą część
|
||||||
|
browser.delegate = self //
|
||||||
|
session.delegate = self
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
W momencie, gdy autor notatki otworzy ekran edycji, wykonuje się metoda `startServer()`, która wywołuje metodę `startBrowsingForPeers()` obiektu `MCNearbyServiceBrowser`. Opuszczenie ekranu edycji wywołuje metodę `stopServer()`, która wywołuje analogiczną metodę `stopBrowsingForPeers()` oraz zatrzymuje sesję poprzez wywołanie metody `disconnect()` obiektu `MCSession`.
|
||||||
|
|
||||||
|
```swift
|
||||||
|
func startServer() {
|
||||||
|
browser.startBrowsingForPeers()
|
||||||
|
}
|
||||||
|
|
||||||
|
func stopServer() {
|
||||||
|
browser.stopBrowsingForPeers()
|
||||||
|
session.disconnect()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
== Transportowanie danych
|
== Transportowanie danych
|
||||||
== Algorytm rozwiązywania konfliktów
|
== Algorytm rozwiązywania konfliktów
|
||||||
== Środowisko developerskie i stack technologiczny
|
== Środowisko developerskie i stack technologiczny
|
||||||
|
|||||||
LFS
BIN
Binary file not shown.
Reference in New Issue
Block a user