【问题标题】:Multipeer Connectivity foundDevice twiceMultipeer Connectivity foundDevice 两次
【发布时间】: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,则会导致内核中重复映射到单个设备,从而导致对一个设备进行两次检测。尝试从每台设备上删除应用程序,看看问题是否仍然存在。

标签: ios swift multipeer-connectivity


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多