2017-02-16 88 views
1

我試圖在Swift3中實現Bonjour NetServiceBrowser以發現我的網絡上的主機。Bonjour服務發現找不到主機

當我使用以下命令在終端中手動搜索時,我會找到主機。但是,當我嘗試在Swift中使用NetServiceBrowser(請參閱下面的代碼)時,它將只打印「開始搜索..」。我按照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

該代碼應該工作。但是,如果您在遊樂場中運行它,則由於異步行爲,您需要啓用'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() 
}