【问题标题】:Multipeer Connectivity how to get the name of the advertising peer?Multipeer Connectivity 如何获取广告对等点的名称?
【发布时间】:2019-06-09 17:07:11
【问题描述】:

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

现在,如果我先启动广告客户,然后启动浏览器...它运行良好,非常好。但是,如果我在广告商之前启动浏览器,它们似乎可以互相看到......即使我没有从他们那里做广告,也没有从他们那里做服务并连接到错误的客户端。

如何说连接到广告服务的对等方,而不是你找到的任何人和每个人......

【问题讨论】:

    标签: ios swift multipeer-connectivity


    【解决方案1】:

    iOS 12、斯威夫特 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()
    }
    

    我没有得到一个连接矩阵,我得到一个主节点和一堆从节点。也许不是多重连接的本意,但一个好的解决方案永远不会少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多