Skip to content

Instantly share code, notes, and snippets.

@wizard1066
Created January 15, 2023 19:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wizard1066/bcee75bcda62f69cf471403eab1b015d to your computer and use it in GitHub Desktop.
Save wizard1066/bcee75bcda62f69cf471403eab1b015d to your computer and use it in GitHub Desktop.
import Foundation
import MultipeerConnectivity
import SwiftUI
import os
class MultipeerSession: NSObject, ObservableObject {
static var shared = MultipeerSession()
private let serviceType = "connect"
private let myPeerId = MCPeerID(displayName: UIDevice.current.name)
private var serviceAdvertiser: MCNearbyServiceAdvertiser!
private var serviceBrowser: MCNearbyServiceBrowser!
public var session: MCSession!
private let log = Logger()
override init() {
session = MCSession(peer: myPeerId, securityIdentity: nil, encryptionPreference: .required)
serviceAdvertiser = MCNearbyServiceAdvertiser(peer: myPeerId, discoveryInfo: nil, serviceType: serviceType)
// serviceBrowser = MCNearbyServiceBrowser(peer: myPeerId, serviceType: serviceType)
super.init()
session.delegate = self
serviceAdvertiser.delegate = self
// serviceBrowser.delegate = self
serviceAdvertiser.startAdvertisingPeer()
// serviceBrowser.startBrowsingForPeers()
}
deinit {
serviceAdvertiser.stopAdvertisingPeer()
serviceBrowser.stopBrowsingForPeers()
}
func startHost() {
session = MCSession(peer: myPeerId, securityIdentity: nil, encryptionPreference: .required)
session.delegate = self
serviceAdvertiser = MCNearbyServiceAdvertiser(peer: myPeerId, discoveryInfo: nil, serviceType: serviceType)
serviceAdvertiser.delegate = self
serviceAdvertiser.startAdvertisingPeer()
}
func startClient() {
session = MCSession(peer: myPeerId, securityIdentity: nil, encryptionPreference: .required)
session.delegate = self
serviceBrowser = MCNearbyServiceBrowser(peer: myPeerId, serviceType: serviceType)
serviceBrowser?.delegate = self
serviceBrowser.startBrowsingForPeers()
}
func returnPeerID() -> MCPeerID {
return myPeerId
}
}
extension MultipeerSession: MCNearbyServiceAdvertiserDelegate {
func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {
log.error("ServiceAdvertiser didNotStartAdvertisingPeer: \(String(describing: error))")
}
public func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
log.info("didReceiveInvitationFromPeer \(peerID)")
print("invitationHandler")
invitationHandler(true, self.session)
}
}
extension MultipeerSession: MCNearbyServiceBrowserDelegate {
func browser(_ browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: Error) {
log.error("ServiceBrowser didNotStartBrowsingForPeers: \(String(describing: error))")
}
func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String: String]?) {
log.info("ServiceBrowser found peer: \(peerID)")
browser.invitePeer(peerID, to: self.session, withContext: nil, timeout: 10)
print("invitePeer")
}
func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
log.info("ServiceBrowser lost peer: \(peerID)")
}
}
extension MultipeerSession: MCSessionDelegate {
func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
log.info("peer \(peerID) didChangeState: \(state.rawValue)")
}
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
var looked = Looker.shared
log.info("didReceive bytes \(data.count) bytes")
let foo = String(decoding: data, as: UTF8.self)
DispatchQueue.main.async {
if foo == "free" {
looked.paused = false
} else {
looked.paused = true
}
}
}
public func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
log.error("Receiving streams is not supported")
}
public func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
log.error("Receiving resources is not supported")
}
public func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
log.error("Receiving resources is not supported")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment