gpt4 book ai didi

ios - Swift:如果我的 iphone 没有连接到我的笔记本电脑,我就看不到所有 bonjour 服务列表

转载 作者:搜寻专家 更新时间:2023-10-31 23:08:30 24 4
gpt4 key购买 nike

我有一个扫描器类来扫描所有可用的 bonjour 服务的列表,用户可以选择搜索某个 bonjour 服务名称中的所有设备。

一切正常!除了当我从电缆上取下我的 iphone 时,我无法看到所有的 bonjour 服务。

有什么想法吗?

注意:我的 iphone 和我的笔记本电脑都通过同一网络中的 wifi 连接。但是 iphone 似乎通过我的笔记本电脑检测到 bonjour 服务。

这是我的类(class),但我确定它与我的类(class)实现无关。

class ScannerViewController: UIViewController {

@IBOutlet weak var serviceTextField: UITextField!
@IBOutlet weak var transportLayerTextField: UITextField!
@IBOutlet weak var domainTextField: UITextField!

@IBOutlet weak var tableView: UITableView!

@IBOutlet weak var allBonjourBtn: UIButton!
@IBOutlet weak var searchBtn: UIButton!

let searchForAllString = "_services._dns-sd._udp."

var services = [NetService](){
didSet{
self.tableView.reloadData()
}
}

private lazy var serviceBrowser = NetServiceBrowser()

override func viewDidLoad() {
super.viewDidLoad()

self.tableView.estimatedRowHeight = 150
self.tableView.rowHeight = UITableViewAutomaticDimension

self.serviceBrowser.delegate = self
self.searchBtn.makeCircularEdges()
self.allBonjourBtn.makeCircularEdges()
}

@IBAction func allBonjourPressed(_ sender: UIButton) {
self.startBrowsing(all: true)
}

@IBAction func searchPressed(_ sender: UIButton) {
self.startBrowsing(all: false)
}

func setBrowserObj() -> (serviceName: String, transportLayer: String, domain: String){

let sName = (self.serviceTextField?.text ?? "").trim
let tl = (self.transportLayerTextField?.text ?? "").trim

let text = (self.domainTextField?.text ?? "").trim
let domain = (text == "" ? text: "\(text).")
print("\(sName).\(tl).", domain)
return (serviceName: "_\(sName)", transportLayer: "_\(tl)", domain: "\(domain)")
}

func startBrowsing(all: Bool){
self.hideKeyboard()
self.serviceBrowser.stop()
self.services = []
let result = self.setBrowserObj()
self.serviceBrowser.delegate = self
if all {
self.serviceBrowser.searchForServices(ofType: searchForAllString, inDomain: "\(result.domain)")
}else{
self.serviceBrowser.searchForServices(ofType: "\(result.serviceName).\(result.transportLayer).", inDomain: "\(result.domain)")
}
}
}

extension ScannerViewController: UITableViewDelegate, UITableViewDataSource {

func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.services.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") else{
return UITableViewCell()
}

guard self.services.count > 0 else{
return cell
}
let service = self.services[indexPath.row]
cell.textLabel?.text = "Name: \(service.name)\nDomain: \(service.domain)\nPort: \(service.port)"
return cell
}
}

extension ScannerViewController: UITextFieldDelegate {

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
let nextTag = textField.tag + 1
if let nextTextField = textField.superview?.viewWithTag(nextTag) {
nextTextField.becomeFirstResponder()
}else{
self.hideKeyboard()
}
return false
}

func hideKeyboard() {
self.serviceTextField?.resignFirstResponder()
self.transportLayerTextField?.resignFirstResponder()
self.domainTextField?.resignFirstResponder()
}
}

extension ScannerViewController: NetServiceBrowserDelegate, NetServiceDelegate {

func netServiceBrowser(_ browser: NetServiceBrowser, didNotSearch errorDict: [String : NSNumber]) {
print("Error serching for service")
print("Errors: \(errorDict.keys)\n")
}

func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) {
service.delegate = self
self.services.append(service)
}

func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool) {
service.delegate = nil
self.removeServiceFromList(serviceObj: service)
}

///Removes the service from the current list.
func removeServiceFromList(serviceObj: NetService){
for (index, sev) in self.services.enumerated() {
if sev == serviceObj {
self.services.remove(at: index)
}
}
}

}

enter image description here

更新:

我正在使用命令行检查可用的 bonjour 服务,我注意到:

  1. 运行 dns-sd -B _services._dns-sd._udp local. 将列出一些我认为仅从我的机器广播的服务。

  2. 运行 dns-sd -B _ipp._tcp local.dns-sd -B _http._tcp local. 将列出所有使用 ipp/http 服务。

真正的问题是为什么当我使用命令 dns-sd -B _services._dns-sd._udp 时 ipphttp 服务类型没有出现本地。 ???根据我所有的在线阅读,每个人都说这个命令应该列出网络上所有可用和事件的 bonjour 服务!但这不是发生在我身上的事情。

注意:我通过 wifi 连接到网络,但由于没有适配器,我无法使用电缆。

附上结果快照。

enter image description here


更新 2

我终于明白了。我想问题出在工作中的 wifi 网络阻止了服务列表。因为当我在家尝试时,我能够毫无问题地看到所有 bonjour 服务。

最佳答案

我终于弄明白了,是我工作中的 wifi 网络阻止了它。当我在家里尝试时,一切都按预期工作。

感谢大家帮我解决了这个问题

关于ios - Swift:如果我的 iphone 没有连接到我的笔记本电脑,我就看不到所有 bonjour 服务列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47292802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com