我在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)
}
}
保护让数据失败
()
可选([])
如果有人可以帮助我,那就太好了!
答案 0 :(得分:1)
可以通过这篇文章解决我的问题:Bonjour Service Browser with Swift does not fetch serviceinfo
我确实将这本书用于第299页的代码:
而且我不得不像这样打个电话:
self.bonjourServices.removeAll()
self.browser = NetServiceBrowser()
self.browser.delegate = self
self.browser.searchForServices(ofType:"_raop._tcp", inDomain: "")
现在它工作正常,我得到了我服务的所有数据