多点连接发现设备两次

4

我有以下代码,我的目标是让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) {

}


 }

而对于 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) {

    }



    }

Thanks,


你在开发过程中是否更改了任一设备的对等标识显示名称?当我使用类似的苹果近场技术iBeacon时,如果您更改了名称/对等标识,则会导致内核中对单个设备的重复映射,从而导致一个设备被检测两次。尝试从每个设备中删除应用程序,看看问题是否仍然存在。 - mattyb
1个回答

5
这是由于设备向其他设备广告其可用性的方式所导致的。

enter image description here

每当外设准备好进行通信时,它们会发送数据包来传递信息,这被称为广告。根据广告数据,设备在发现时可能返回附加数据。

如果外设支持主动扫描并且应用程序在前台,则会调用 didDiscoverPeripheral 两次。第一次调用包含来自外设的广告数据包中的数据。第二次调用包含来自外设的扫描响应数据包中的附加数据。

要了解更多信息,请查看 this thread如何解决这个问题?您可以只保留您收到的 ID 列表,并且对于特定的对等 ID,丢弃任何其他的发现调用。
(有关 蓝牙广告 的更多信息,请查看蓝牙文档)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接