2017-02-16 7 views
1

J'essaie d'implémenter Bonjour NetServiceBrowser dans Swift3 afin de découvrir les hôtes sur mon réseau.La recherche de service Bonjour ne trouve pas d'hôtes

Lorsque je recherche manuellement dans le terminal en utilisant la commande suivante, je vais trouver les hôtes.

dns-sd -B 

Cependant, lorsque je tente d'utiliser le NetServiceBrowser à Swift (voir code ci-dessous), elle imprime uniquement « à partir de la recherche .. ». J'ai implémenté cette classe en suivant les Bonjour documentation.

Je ne comprends pas ce qui ne va pas. Est-ce que Bonjour fonctionne différemment pour Swift? Je n'ai pas trouvé d'exemple en ligne. J'ai essayé plusieurs variantes sur le domain ("local", "local.", "") Ou plusieurs variantes pour name.

class ZeroConf: NSObject, NetServiceBrowserDelegate, NetServiceDelegate{ 

    var browser: NetServiceBrowser! 
    var services = [NetService]() 
    let domain = "local" 
    let name = "_http._tcp" 



    func startSearch(){ 
     self.services.removeAll() 
     self.browser = NetServiceBrowser() 
     self.browser.delegate = self 
     self.browser.searchForServices(ofType: name, inDomain: domain) 
    } 


    func netService(_ sender: NetService, didNotPublish errorDict: [String : NSNumber]) { 
     debugPrint(errorDict) 
    } 

    func netServiceBrowserWillSearch(_ browser: NetServiceBrowser) { 
     print("starting search..") 
    } 

    func netServiceBrowserDidStopSearch(_ browser: NetServiceBrowser) { 
     print("Stoped search") 
    } 

    func netServiceBrowser(_ browser: NetServiceBrowser, didNotSearch errorDict: [String : NSNumber]) { 
     print("error in search") 
     debugPrint(errorDict) 
    } 

    func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) { 
     print("found service") 
     services.append(service) 
     debugPrint(service) 
    } 

    func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool) { 
     if let ix = self.services.index(of:service) { 
      self.services.remove(at:ix) 
      print("removing a service") 
     } 
    } 

    func netServiceDidResolveAddress(_ sender: NetService) { 
     print("did resolve address") 
    } 
} 
+0

Attend boiteux, mais est un tableau de services alloués? – ystack

+0

Le code est supposé fonctionner. Cependant, si vous l'exécutez dans un terrain de jeu, vous devez activer 'needsIndefiniteExecution' de' PlaygroundSupport' en raison du comportement asynchrone. – vadian

+0

@ystack oui il est alloué sur la même ligne que sa déclaration – TmKVU

Répondre

0

J'ai découvert pourquoi cela ne fonctionnait pas pour moi. J'ai essayé d'exécuter le code de la boucle principale alors qu'il devrait apparemment être appelé à partir d'un thread différent. Par conséquent, j'ai changé mon code dans startSearch à

DispatchQueue.main.async { 
     self.browser.schedule(in: RunLoop.current, forMode: .defaultRunLoopMode) 
     self.browser.searchForServices(ofType: self.name, inDomain: self.domain) 
     RunLoop.current.run() 
}