Multipeer Connectivity foundDevice两次

问题描述:

我有下面的代码,我的目标是让Mac识别具有Multipeer Connectivity的iOS设备。这大部分工作,除了当我运行这两个我得到两个“发现!!!”在控制台。我怎样才能解决这个问题?Multipeer Connectivity foundDevice两次

这里是我的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) { 

} 


} 

,以及在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) { 

    } 



    } 

感谢,

+0

有在开发过程中改变任一设备的节点ID显示名称?当我使用类似的Apple感应技术iBeacon时,如果更改了名称/对等ID,则会导致内核中的映射重复到单个设备,从而导致对一个设备进行两次检测。尝试从每台设备中删除应用,然后查看问题是否仍然存在。 – Midas

这是因为该方式图谋的发生宣传他们的可用性其他设计。

enter image description here

每当外设准备好沟通,他们发送的数据包的信息,这就是所谓的广告。根据广告数据,发现时可能会返回额外的数据。

如果外围支持主动扫描和应用程序是在前台,你会得到两个调用到didDiscoverPeripheral。第一个呼叫包含来自外设的广告数据包中的数据。第二个调用包含来自外设扫描响应数据包的附加数据。

欲了解更多信息结账this thread

如何解决这个问题?您可以保留您收到的ID列表,并放弃您为该特定对等ID获得的任何额外发现呼叫。

(检查出的bluetooth advertising更多信息蓝牙文档)