Ios 你好服务发现找不到主机

Ios 你好服务发现找不到主机,ios,swift,swift3,bonjour,Ios,Swift,Swift3,Bonjour,我正试图在Swift3中实现Bonjour NetServiceBrowser,以便在我的网络上发现主机 当我使用以下命令在终端中手动搜索时,我将找到主机 dns-sd -B 但是,当我尝试在Swift中使用NetServiceBrowser时(请参见下面的代码),它只会打印“开始搜索…”。我通过以下方法实现了这个类 我不明白出了什么问题。“你好”对斯威夫特的作用不同吗?我在网上找不到一个有效的例子。我在域(“local”、“local.”、“”)上尝试了几种变体,或者在名称上尝试了几种变体

我正试图在Swift3中实现Bonjour NetServiceBrowser,以便在我的网络上发现主机

当我使用以下命令在终端中手动搜索时,我将找到主机

dns-sd -B
但是,当我尝试在Swift中使用NetServiceBrowser时(请参见下面的代码),它只会打印“开始搜索…”。我通过以下方法实现了这个类

我不明白出了什么问题。“你好”对斯威夫特的作用不同吗?我在网上找不到一个有效的例子。我在
(“local”、“local.”、“”)上尝试了几种变体,或者在
名称
上尝试了几种变体

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")
    }
}

我发现了为什么它对我不起作用。我试图从主循环执行代码,而它显然应该从另一个线程调用。因此,我将
startSearch
中的代码更改为

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

看起来很蹩脚,但是否分配了服务数组?代码应该可以工作。但是,如果您在操场上运行它,您需要启用
needsIndefiniteExecution
PlaygroundSupport
,因为它具有异步行为。@ystack yes它与它的declaration@vadian不,它不在操场上。我只是把代码复制到操场上,它按预期工作。嘿,伙计们,帮帮我。我的代码在netServiceBrowserWillSearch停止,我不知道该怎么做。。。