2016-11-20 3 views
4

У меня есть код ниже, и моя цель состояла в том, чтобы получить mac для распознавания устройства iOS с поддержкой Multipeer. Это работало по большей части, за исключением того, что когда я запускаю оба из них, я получаю два «НАЙДЕНО !!!» в консоли. Как я могу это исправить?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) { 

} 


} 

И макинтош:

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) { 

    } 



    } 

Спасибо,

+0

Вы изменили пэра отображение идентификатора имя либо устройства во время разработки? Когда я использовал аналогичную технологию близости Apple iBeacon, если вы изменили идентификатор name/peer, то это привело к дублированию сопоставлений в ядре на одном устройстве, что привело к двум обнаружению для одного устройства. Попробуйте удалить приложения с каждого устройства и посмотреть, не исчезла ли проблема. – Midas

ответ

5

Это происходит из-за способа придумывает рекламировать их доступность другие устройства.

enter image description here

Всякий раз, когда периферийное устройство готово для связи они посылают эту информацию в пакеты данных, это называется реклама. На основе рекламных данных устройство может возвращать дополнительные данные при обнаружении.

Если периферийное поддерживает активное сканирование и приложение находится на переднем плане, вы получите две вызовы к didDiscoverPeripheral. Первый вызов содержит данные в рекламном пакете из периферии. Второй вызов содержит дополнительные данные из пакета ответа сканирования от периферийного устройства.

Для получения дополнительной информации оформить заказ this thread.

Как решить это? Вы можете просто сохранить список идентификаторов, которые вы получили, и отменить любые дополнительные вызовы обнаружения, которые вы получаете для этого конкретного идентификатора peer.

(проверьте документацию по Bluetooth Более подробную информацию о bluetooth advertising)

Смежные вопросы