使用Network.framework的NWBrowser时TXT Records为何返回nil?
解决Network.framework中Bonjour服务TXT记录返回nil的问题
问题原因
直接访问result.endpoint.txtRecord无法获取到TXT记录,因为NWEndpoint本身不会自动触发Bonjour服务TXT记录的解析流程。只有通过NWBonjourService对象,才能获取到完整的服务元数据(包括TXT记录)。
解决方法
在浏览结果回调中,将NWEndpoint转换为NWBonjourService类型,再访问其txtRecord属性。如果转换成功,就能拿到对应的TXT记录;如果转换失败,说明该端点不是Bonjour服务类型。
修改后的代码示例
let parameters = NWParameters.tcp parameters.includePeerToPeer = true parameters.allowLocalEndpointReuse = true let browser = NWBrowser(for: .bonjour(type: "_tictactoe._tcp", domain: nil), using: parameters) browser.browseResultsChangedHandler = { results, changes in for result in results { // 将端点转换为Bonjour服务对象 guard let bonjourService = result.endpoint.bonjourService else { print("该端点不是Bonjour服务") continue } // 访问TXT记录 print("Browser result. txtRecords: \(bonjourService.txtRecord)") // 若需要解析TXT记录的键值对,可使用以下方式 if let txtData = bonjourService.txtRecord { let txtDictionary = NWBonjourService.txtRecord(from: txtData) print("解析后的TXT键值对: \(txtDictionary)") } } } // 别忘了启动浏览器 browser.start(queue: DispatchQueue.global())
额外说明
- 确保Bonjour服务端正确设置并发布了TXT记录,否则即使客户端逻辑正确,也会拿到nil。
- 如果需要实时监听TXT记录的变化,可以通过重新解析服务来实现。
内容的提问来源于stack exchange,提问作者Charlie Fish
相关产品推荐
相关产品推荐

