Created
January 15, 2023 19:30
-
-
Save wizard1066/bcee75bcda62f69cf471403eab1b015d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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