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 连接蓝牙
如何使用swift 4查看Multipeer Connectivity框架中的MCBrowserViewController