2017-02-16 1 views
1

네트워크에서 호스트를 검색하기 위해 Swift3에서 Bonjour NetServiceBrowser를 구현하려고합니다.Bonjour 서비스 검색에서 호스트를 찾을 수 없음

다음 명령을 사용하여 터미널에서 수동으로 검색 할 때 호스트를 찾을 수 있습니다. 그러나

dns-sd -B 

, 내가 스위프트의 NetServiceBrowser (아래 코드 참조)를 사용하려고 할 때, 그것은 단지 인쇄합니다 "검색을 시작 ..". Bonjour documentation을 따라이 클래스를 구현했습니다.

나는 무엇이 잘못 될지 이해하지 못합니다. Bonjour는 Swift와 다른 점이 있습니까? 온라인에서 실습 예제를 찾을 수 없었습니다. 나는 ("로컬", "로컬.", "") 또는 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

코드가 작동해야합니다. 그러나 놀이터에서 실행하면 비동기 동작 때문에'PlaygroundSupport'의'needsIndefiniteExecution'을 활성화해야합니다. – 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() 
} 
관련 문제