Swift 3 - 在探索bonjour后得到一个空的NetService.addresses数组

时间:2017-06-07 11:54:10

标签: ios swift3 ip-address nsnetservice

我在Swift 3中很新。 我想得到我的NetServices的ip,我用bonjour探讨了它向用户展示,而不是与设备连接。到目前为止,我可以搜索带有bonjour的设备,并使用这个很棒的访问代码将它们列在listView中: https://github.com/ecnepsnai/BonjourSwift

这是我扫描bonjour服务并将它们放入NetServices的本地数组

的功能
.rule

我使用此方法从Swift 3 how to resolve NetService IP?

获取IP地址
    // scanning for services, delete old bonjourServices Array and fill it with new discovered services

var bonjourServices = [NetService]()

private func putServicesToArray(){
    let browser: Bonjour = Bonjour()

    _ = browser.findService(Bonjour.Services.Line_Printer_Daemon, domain: Bonjour.LocalDomain) { (services) in

        self.bonjourServices.removeAll()


        for service in browser.services {

            if !(self.bonjourServices.contains(service)) {

                self.bonjourServices.append(service)
            }
        }
    }
}

并且使用这个IBAction我只想打印ip地址,但我的ip是空的,我的 func netServiceDidResolveAddress(_ sender: NetService) { print("netServiceDidResolveAddress get called with \(sender).") var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) guard let data = sender.addresses?.first else { print("guard let data failed") return } do { try data.withUnsafeBytes { (pointer:UnsafePointer<sockaddr>) -> Void in guard getnameinfo(pointer, socklen_t(data.count), &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 else { throw NSError(domain: "domain", code: 0, userInfo: ["error":"unable to get ip address"]) } } } catch { print(error) return } let address = String(cString:hostname) print("Adress:", address) } 也是空的address.adress NSData Objects

bonjourServices[0].addresses

我的控制台输出:

    @IBAction func detectNetwork(_ sender: UIButton) {
    print("putServiceToArray: ")

    putServicesToArray()


    for service in bonjourServices {
        print(service)
    }

    bonjourTableView.reloadData()

    if !(bonjourServices.isEmpty){

        print(netServiceDidResolveAddress(bonjourServices[0]))
        print(bonjourServices[0].addresses)
    }

}
保护让数据失败 () 可选([])

如果有人可以帮助我,那就太好了!

1 个答案:

答案 0 :(得分:1)

可以通过这篇文章解决我的问题:Bonjour Service Browser with Swift does not fetch serviceinfo

我确实将这本书用于第299页的代码:

https://books.google.de/books?id=pNzSBQAAQBAJ&pg=PA299&lpg=PA299&dq=swift+implement+bonjour+discovery&source=bl&ots=6nhrmuDfEp&sig=eY9kPtzOl7nshavmwdwVYQlpNfM&hl=de&sa=X&ved=0ahUKEwjclvHGncLUAhXBKFAKHZeRByQ4ChDoAQgyMAI#v=onepage&q=swift%20implement%20bonjour%20discovery&f=false

而且我不得不像这样打个电话:

    self.bonjourServices.removeAll()
    self.browser = NetServiceBrowser()
    self.browser.delegate = self
    self.browser.searchForServices(ofType:"_raop._tcp", inDomain: "")

现在它工作正常,我得到了我服务的所有数据