【问题标题】:Bonjour service discovery not finding hostsBonjour 服务发现未找到主机
【发布时间】:2017-02-16 11:12:31
【问题描述】:

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

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

dns-sd -B

但是,当我尝试在 Swift 中使用 NetServiceBrowser(参见下面的代码)时,它只会打印“开始搜索..”。我按照Bonjour documentation实现了这个类。

我不明白出了什么问题。 Bonjour 对 Swift 的工作方式是否不同?我在网上找不到工作示例。我尝试了domain 的几个变体(“local”、“local.”、“”)或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")
    }
}

【问题讨论】:

  • 看起来很蹩脚,但服务数组是否已分配?
  • 该代码应该可以工作。但是,如果您在 Playground 中运行它,由于异步行为,您需要启用 needsIndefiniteExecutionPlaygroundSupport
  • @ystack 是的,它与声明在同一行分配
  • @vadian 不,它不在操场上
  • 我刚刚将代码复制到了一个游乐场,它按预期工作。

标签: ios swift swift3 bonjour


【解决方案1】:

我发现它为什么不适合我。我试图从主循环执行代码,而它显然应该从不同的线程调用。因此,我将startSearch 中的代码更改为

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

【讨论】:

  • 大家好帮帮我。我的代码在 netServiceBrowserWillSearch 处停止,我不知道该怎么做...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 2022-01-20
  • 2014-09-20
  • 2014-08-04
相关资源
最近更新 更多