ネットワーク上のホストを検出するために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")
}
}
私はコードが変更されましたが、サービス配列が割り当てられていますか? – ystack
コードが動作するはずです。しかし、プレイグランドで実行する場合は、非同期動作のために 'PlaygroundSupport'の' needsIndefiniteExecution'を有効にする必要があります。 – vadian
@ystackはいそれは宣言と同じ行に割り当てられます – TmKVU