-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDataEngine.swift
More file actions
128 lines (101 loc) · 4.41 KB
/
DataEngine.swift
File metadata and controls
128 lines (101 loc) · 4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//
// DataEngine.swift
// SpriteKitTest
//
// Created by Christopher Schlitt on 6/8/17.
// Copyright © 2017 Cheeky WWDC. All rights reserved.
//
import Foundation
import SpriteKit
import MultipeerConnectivity
class DataEngine: NSObject, MCNearbyServiceAdvertiserDelegate, MCNearbyServiceBrowserDelegate, MCSessionDelegate {
// Data
var nodes = NodeStack()
weak var delegate: DataEngineDelegate?
// Connectivity
private let myPeerId = MCPeerID(displayName: UIDevice.current.name)
private let serviceAdvertiser: MCNearbyServiceAdvertiser
private let serviceBrowser: MCNearbyServiceBrowser
lazy var session: MCSession = {
let session = MCSession(peer: self.myPeerId, securityIdentity: nil, encryptionPreference: .none)
session.delegate = self
return session
}()
// Initialization
override init(){
print("Starting the engine")
self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: myPeerId, discoveryInfo: nil, serviceType: "drawing-service")
self.serviceBrowser = MCNearbyServiceBrowser(peer: myPeerId, serviceType: "drawing-service")
super.init()
self.serviceAdvertiser.delegate = self
self.serviceAdvertiser.startAdvertisingPeer()
self.serviceBrowser.delegate = self
self.serviceBrowser.startBrowsingForPeers()
}
deinit {
self.serviceAdvertiser.stopAdvertisingPeer()
self.serviceBrowser.stopBrowsingForPeers()
}
// Connection Methods - Advertising
func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
print("Received invitation from peer")
// Connect to the peer
invitationHandler(true, self.session)
}
// Connection Methods - Connecting
func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
print("Found a peer")
// Invite the peer
browser.invitePeer(peerID, to: self.session, withContext: nil, timeout: 10)
}
func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
// TODO
print("Lost a peer")
}
// Connection Methods - Data
func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
print("peer \(peerID) didChangeState: \(state)")
// TODO: Send all previous drawings to user
}
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
print("didReceiveData: \(data)")
// Extract Node
let receivedNode = NSKeyedUnarchiver.unarchiveObject(with: data) as! SKSpriteNode
// Save the Node
self.nodes.push(receivedNode)
// Draw the Node
self.delegate.drawNode(receivedNode)
}
func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
print("didReceiveStream")
}
func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
print("didStartReceivingResourceWithName")
}
func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
print("didFinishReceivingResourceWithName")
}
// Node handling methods - Custom
func sendNode(_ node: SKSpriteNode){
if session.connectedPeers.count > 0 {
let dataToSend = NSKeyedArchiver.archivedData(withRootObject: node)
do {
try self.session.send(dataToSend, toPeers: session.connectedPeers, with: MCSessionSendDataMode.reliable)
}
catch let error {
print("Error for sending: \(error)")
}
} else {
print("No Connected Peers")
}
}
}
/*
Protocol to allow saving and receiving drawings
*/
@objc protocol DataEngineDelegate: class {
// Called when a peer sends a drawing that should be shown
func drawNode(_ node: SKSpriteNode)
// Called when a peer sends a node (TODO)
@objc optional func removeNode(_ node: SKSpriteNode)
}