Multipeer Connectivity, как получить имя рекламного пира? - PullRequest
0 голосов
/ 09 июня 2019

iOS12 Swift 5.x

Я использую Multipeer Connectivity. Пока все работает хорошо, если я подключаю свои устройства в правильном порядке.

Используя код котельной плиты, выследил проблему до здесь.

func setupStream() {
  do {
    outputStream = try session.startStream(withName: "chat", toPeer: session.connectedPeers.first!)
    for debug in session.connectedPeers {
      print("Peer connected \(debug.displayName)")
    }
  } catch {
      print("unable to open stream")
  }
  if let outputStream = outputStream {
    outputStream.delegate = self
    outputStream.schedule(in: RunLoop.main, forMode:RunLoop.Mode.default)
    outputStream.open()
  }
}

Теперь, если я сначала запускаю рекламодателя, а затем браузеры ... это работает хорошо, очень хорошо. Но если я запускаю браузеры ДО рекламодателя, они, кажется, видят друг друга ... даже если я не рекламирую их и сервис от них и подключаюсь не к тому клиенту.

Как сказать, подключайся к равноправной рекламе сервиса, а не кого-нибудь и всех, кого найдешь ...

1 Ответ

0 голосов
/ 10 июня 2019

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()
}

И у меня нет матрицы соединений, у меня есть один хозяин и куча рабов. Может быть, не то, для чего предназначалась многопозиционная связь, но тем не менее хорошее решение.

...