2017-02-16 21 views
1

ネットワーク上のホストを検出するためにSwift3でBonjour NetServiceBrowserを実装しようとしています。Bonjourサービスディスカバリでホストが見つかりません

次のコマンドを使用して端末で手動で検索すると、ホストが見つかります。しかし

dns-sd -B 

、私はスウィフトで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() 
} 
関連する問題