-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCountdownerServiceManager.swift
executable file
·139 lines (102 loc) · 4.94 KB
/
CountdownerServiceManager.swift
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
129
130
131
132
133
134
135
136
137
138
139
// Copyright 2016-2017, Ralf Ebert
// License https://opensource.org/licenses/MIT
// Source https://www.ralfebert.de/tutorials/ios-swift-multipeer-connectivity/
import Foundation
import MultipeerConnectivity
enum Action: String {
case start
case pause
case reset
}
protocol CountdownerServiceManagerDelegate {
func connectedDevicesChanged(manager: CountdownerServiceManager, connectedDevices: [String])
func actionReceived(manager: CountdownerServiceManager, action: Action)
}
#if os(iOS) || os(watchOS) || os(tvOS)
let displayName = UIDevice.current.name
#elseif os(OSX)
let displayName = Host.current().name!
#endif
class CountdownerServiceManager: NSObject {
// Service type must be a unique string, at most 15 characters long
// and can contain only ASCII lowercase letters, numbers and hyphens.
private let CountdownerServiceType = "countdowner"
private let myPeerId = MCPeerID(displayName: displayName)
private let serviceAdvertiser : MCNearbyServiceAdvertiser
private let serviceBrowser : MCNearbyServiceBrowser
var delegate : CountdownerServiceManagerDelegate?
lazy var session : MCSession = {
let session = MCSession(peer: self.myPeerId, securityIdentity: nil, encryptionPreference: .required)
session.delegate = self
return session
}()
override init() {
self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: myPeerId, discoveryInfo: nil, serviceType: CountdownerServiceType)
self.serviceBrowser = MCNearbyServiceBrowser(peer: myPeerId, serviceType: CountdownerServiceType)
super.init()
self.serviceAdvertiser.delegate = self
self.serviceAdvertiser.startAdvertisingPeer()
self.serviceBrowser.delegate = self
self.serviceBrowser.startBrowsingForPeers()
}
func send(action: Action) {
// NSLog("%@", "action: \(action) to \(session.connectedPeers.count) peers")
if session.connectedPeers.count > 0 {
do {
try self.session.send(action.rawValue.data(using: .utf8)!, toPeers: session.connectedPeers, with: .reliable)
}
catch {
NSLog("%@", "Error for sending: \(error)")
}
}
}
deinit {
self.serviceAdvertiser.stopAdvertisingPeer()
self.serviceBrowser.stopBrowsingForPeers()
}
}
extension CountdownerServiceManager : MCNearbyServiceAdvertiserDelegate {
func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {
// NSLog("%@", "didNotStartAdvertisingPeer: \(error)")
}
func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
// NSLog("%@", "didReceiveInvitationFromPeer \(peerID)")
invitationHandler(true, self.session)
}
}
extension CountdownerServiceManager : MCNearbyServiceBrowserDelegate {
func browser(_ browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: Error) {
// NSLog("%@", "didNotStartBrowsingForPeers: \(error)")
}
func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
// NSLog("%@", "foundPeer: \(peerID)")
// NSLog("%@", "invitePeer: \(peerID)")
browser.invitePeer(peerID, to: self.session, withContext: nil, timeout: 10)
}
func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
// NSLog("%@", "lostPeer: \(peerID)")
}
}
extension CountdownerServiceManager : MCSessionDelegate {
func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
// NSLog("%@", "peer \(peerID) didChangeState: \(state)")
self.delegate?.connectedDevicesChanged(manager: self, connectedDevices:
session.connectedPeers.map {$0.displayName} )
}
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
// NSLog("%@", "didReceiveData: \(data)")
if let action = Action(rawValue: String(data: data, encoding: .utf8)!) {
// self.delegate?.actionReceived(manager: self, action: action, counter: <#Int#>)
self.delegate?.actionReceived(manager: self, action: action)
}
}
func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
// NSLog("%@", "didReceiveStream")
}
func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
// NSLog("%@", "didStartReceivingResourceWithName")
}
func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
// NSLog("%@", "didFinishReceivingResourceWithName")
}
}