Multipeer Connectivity foundDevice两次

Zan*_*der 4 ios multipeer-connectivity swift

我有下面的代码,我的目标是让mac识别具有Multipeer Connectivity的iOS设备.这在大多数情况下起作用,除了当我运行这两个时我得到两个 "FOUND !!!" 在控制台中.我怎样才能解决这个问题?

这是我的iOS设备代码:

import UIKit
import MultipeerConnectivity

class ViewController: UIViewController, MCNearbyServiceBrowserDelegate,      MCNearbyServiceAdvertiserDelegate {


let browser = MCNearbyServiceBrowser(peer: MCPeerID(displayName: "iOS Device"), serviceType: "example-test")
let peerID = MCPeerID(displayName: "iOS Device")
let advertiser = MCNearbyServiceAdvertiser(peer: MCPeerID(displayName: "iOS Device"), discoveryInfo: nil, serviceType: "example-test")



override func viewDidLoad() {
    super.viewDidLoad()
    advertiser.delegate = self
    advertiser.startAdvertisingPeer()
    browser.delegate = self
    browser.startBrowsingForPeers()
}

func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {

}

func browser(_ browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: Error) {

}

func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
    print("FOUND!!!")
}

func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {

}

func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {

}


 }
Run Code Online (Sandbox Code Playgroud)

对于mac:

import MultipeerConnectivity

class ConnectionsManager: NSObject, MCNearbyServiceBrowserDelegate,     MCNearbyServiceAdvertiserDelegate {


let browser : MCNearbyServiceBrowser
let advertiser: MCNearbyServiceAdvertiser
let peerID = MCPeerID(displayName: "macDevice")



override init() {
    advertiser = MCNearbyServiceAdvertiser(peer: MCPeerID(displayName: "mac Device"), discoveryInfo: nil, serviceType: "example-test")
    browser = MCNearbyServiceBrowser(peer: MCPeerID(displayName: "mac Device"), serviceType: "example-test")
    super.init()
    advertiser.delegate = self
    advertiser.startAdvertisingPeer()
    browser.delegate = self
    browser.startBrowsingForPeers()
}
deinit {
    browser.stopBrowsingForPeers()
    advertiser.stopAdvertisingPeer()
}

    func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {

    }

    func browser(_ browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: Error) {

    }

    func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
        print("FOUND!!!")
    }

    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {

    }

    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {

    }



    }
Run Code Online (Sandbox Code Playgroud)

谢谢,

Pen*_*esh 5

这种情况正在发生,因为设计将其可用性宣传给其他设备.

在此输入图像描述

每当外围设备准备好进行通信时,它们就会以数据包的形式发送该信息,这称为广告.基于广告数据设计可以在发现时返回附加数据.

如果外围设备支持主动扫描并且应用程序位于前台,则会有两次调用 didDiscoverPeripheral.第一个呼叫包含来自外围设备的广告包中的数据.第二个调用包含来自外设的扫描响应数据包的附加数据.

有关更多信息,请查看此主题.

怎么解决这个?您可以保留您收到的ID列表,并丢弃您为该特定对等ID获得的任何其他发现调用.

(有关蓝牙广告的更多信息,请查看蓝牙文档)