Multipeer Connectivity foundDevice 两次

Posted

技术标签:

【中文标题】Multipeer Connectivity foundDevice 两次【英文标题】:Multipeer Connectivity foundDevice twice 【发布时间】:2016-11-20 15:00:39 【问题描述】:

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

    



    

谢谢,

【问题讨论】:

您是否在开发过程中更改了任一设备的 peer id 显示名称?当我使用类似的 Apple 接近技术 iBeacon 时,如果您更改名称/对等 ID,则会导致内核中重复映射到单个设备,从而导致对一个设备进行两次检测。尝试从每台设备上删除应用程序,看看问题是否仍然存在。 【参考方案1】:

这是因为设计向其他设计宣传其可用性的方式。

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

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

欲了解更多信息,请查看this thread。

如何解决这个问题?您可以只保留收到的 id 列表,并丢弃您为该特定对等 id 获得的任何其他发现调用。

(查看蓝牙文档以获取有关bluetooth advertising 的更多信息)

【讨论】:

以上是关于Multipeer Connectivity foundDevice 两次的主要内容,如果未能解决你的问题,请参考以下文章

Multipeer Connectivity 自动静默连接

如何检测 Multipeer Connectivity 邀请的拒绝?

无法通过 Multipeer Connectivity 连接蓝牙

如何使用swift 4查看Multipeer Connectivity框架中的MCBrowserViewController

如何使用 Multipeer Connectivity 安全地停止发送图像

通过 Multipeer Connectivity 发送 MPMediaItem