iOS 12, Swift 5
Нашел решение, которое я выкладываю здесь, довольно простое. Когда я рекламировал сервис, я делаю это с некоторой информацией об открытии. Ключ здесь, переменная открытия.
Блок выглядит так.
class ColorService : NSObject {
lazy var session : MCSession = {
let session = MCSession(peer: self.myPeerId, securityIdentity: nil, encryptionPreference: .required)
session.delegate = self
return session
}()
var delegate : ColorServiceDelegate?
// Service type must be a unique string, at most 15 characters long
// and can contain only ASCII lowercase letters, numbers and hyphens.
private let ColorServiceType = "example-color"
private let myPeerId = MCPeerID(displayName: UIDevice.current.name)
private let serviceAdvertiser : MCNearbyServiceAdvertiser
override init() {
let discover:[String:String] = ["prime":myPeerId.displayName]
self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: myPeerId, discoveryInfo: discover, serviceType: ColorServiceType)
super.init()
self.serviceAdvertiser.delegate = self
self.serviceAdvertiser.startAdvertisingPeer()
}
deinit {
self.serviceAdvertiser.stopAdvertisingPeer()
}
func stopAdvertising() {
self.serviceAdvertiser.stopAdvertisingPeer()
}
С другой стороны, когда я ищу услугу, я приглашаю только пиров, у которых есть набор для обнаружения, очевидно, используя эту информацию в качестве пира для приглашения.
extension ColorSearch : 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)")
NSLog("%@", "discoverInfo: \(info)")
primePeer = info!["prime"]
if primePeer != nil {
if peerID.displayName == primePeer {
browser.invitePeer(peerID, to: self.session, withContext: nil, timeout: 10)
}
}
}
func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
NSLog("%@", "lostPeer: \(peerID)")
}
func disconnect() {
self.session.disconnect()
}
И у меня нет матрицы соединений, у меня есть один хозяин и куча рабов. Может быть, не то, для чего предназначалась многопозиционная связь, но тем не менее хорошее решение.