2017-02-16 3 views
1

Я пытаюсь реализовать Bonjour NetServiceBrowser в Swift3, чтобы обнаружить хосты в моей сети.Открытие службы Bonjour не находит хостов

Когда я вручную ищу в терминале, используя следующую команду, я найду хосты.

dns-sd -B 

Однако, когда я пытаюсь использовать NetServiceBrowser в Swift (см код ниже), он будет печатать только «начиная поиск ..». Я реализовал этот класс, следуя Bonjour documentation.

Я не понимаю, что происходит не так. Отличается ли Bonjour для Swift? Я не мог найти рабочий пример в Интернете. Я попробовал несколько вариантов на domain («местный», «местный», «») или несколько вариантов для 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

Выглядит хромой, но выделен массив услуг? – ystack

+0

Код должен работать. Однако, если вы запустите его на игровой площадке, вам необходимо включить 'needsIndefiniteExecution'' PlaygroundSupport' из-за асинхронного поведения. – vadian

+0

@ystack да выделено на той же строке, что и декларация – TmKVU

ответ

0

Я узнал, почему он не работает для меня. Я попытался выполнить код из основного цикла, пока он, видимо, должен быть вызван из другого потока. Следовательно, я изменил свой код в startSearch на

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