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) {
}
}
感谢,
答
这是因为该方式图谋的发生宣传他们的可用性其他设计。
每当外设准备好沟通,他们发送的数据包的信息,这就是所谓的广告。根据广告数据,发现时可能会返回额外的数据。
如果外围支持主动扫描和应用程序是在前台,你会得到两个调用到didDiscoverPeripheral。第一个呼叫包含来自外设的广告数据包中的数据。第二个调用包含来自外设扫描响应数据包的附加数据。
欲了解更多信息结账this thread。
如何解决这个问题?您可以保留您收到的ID列表,并放弃您为该特定对等ID获得的任何额外发现呼叫。
(检查出的bluetooth advertising更多信息蓝牙文档)
有在开发过程中改变任一设备的节点ID显示名称?当我使用类似的Apple感应技术iBeacon时,如果更改了名称/对等ID,则会导致内核中的映射重复到单个设备,从而导致对一个设备进行两次检测。尝试从每台设备中删除应用,然后查看问题是否仍然存在。 – Midas