swift - 使用 Swift 的 Bonjour 服务浏览器不获取服务信息

标签 swift swift3 bonjour nsnetservice nsnetservicebrowser

我要连接的服务是通过 Bonjour 发布的。
我可以使用 Bonjour 浏览器找到所有信息,但是如果我尝试以编程方式收集数据,我得到的唯一值是服务的名称。

设置了 NetService 委托(delegate)并调用了函数 netServiceWillPublish。 DidNotPublish 或 DidPublish 函数未执行。

函数 netServiceBrowser 获取所有已发布的网络服务,但所有属性都设置为数据类型的默认值。

import UIKit

class BMNSDelegate : NSObject, NetServiceDelegate {
    func netServiceWillPublish(_ sender: NetService) {
        print("netServiceWillPublish:\(sender)");  //This method is called
    }


    func netService(_ sender: NetService, didNotPublish errorDict: [String : NSNumber]){ 
        print("didNotPublish:\(sender)");
    }

    func netServiceDidPublish(_ sender: NetService) {
        print("netServiceDidPublish:\(sender)");
    }
    func netServiceWillResolve(_ sender: NetService) {
        print("netServiceWillResolve:\(sender)");
    }

    func netService(_ sender: NetService, didNotResolve errorDict: [String : NSNumber]) {
        print("netServiceDidNotResolve:\(sender)");
    }

    func netServiceDidResolveAddress(_ sender: NetService) {
        print("netServiceDidResolve:\(sender)");
    }

    func netService(_ sender: NetService, didUpdateTXTRecord data: Data) {
        print("netServiceDidUpdateTXTRecordData:\(sender)");
    }

    func netServiceDidStop(_ sender: NetService) {
        print("netServiceDidStopService:\(sender)");
    }

    func netService(_ sender: NetService,
                    didAcceptConnectionWith inputStream: InputStream,
                    outputStream stream: OutputStream) {
        print("netServiceDidAcceptConnection:\(sender)");
    }
}

class BMBrowserDelegate : NSObject, NetServiceBrowserDelegate, NetServiceDelegate {

    func netServiceBrowser(_ netServiceBrowser: NetServiceBrowser,
                           didFind netService: NetService,
                           moreComing moreServicesComing: Bool) {
        let nsnsdel = BMNSDelegate()
        netService.delegate = nsnsdel
        netService.resolve(withTimeout: 1)
        print(netService.domain) // local.
        print(netService.name) // This property is correct
        print(netService.type) // _http._tcp.
        print(netService.addresses) // Optional([])
        print(netService.hostName) // nil
        print(netService.port) // -1
        print(moreServicesComing) //false
    }

}


let SERVICE_TYPE = "_http._tcp."
let BM_DOMAIN = "local."
let browser = NetServiceBrowser()
let nsbdel = BMBrowserDelegate()
browser.delegate = nsbdel
browser.searchForServices(ofType: SERVICE_TYPE, inDomain:         BM_DOMAIN)
RunLoop.current.run()

最佳答案

错误是在 ServiceBrowserDelegate 函数中找到的服务没有保存在任何地方,因此在函数结束时被丢弃。

我在这里找到了一个工作示例:
https://github.com/mattneub/Programming-iOS-Book-Examples/blob/61f0c753a080040e4a74b912e6c18dd97fe8bcaa/bk2ch24p853bonjour/ch37p1101bonjour/ViewController.swift

class ViewController: UIViewController, NetServiceBrowserDelegate, NetServiceDelegate {
var nsb : NetServiceBrowser!
var services = [NetService]()

@IBAction func doButton (_ sender: Any!) {
    print("listening for services...")
    self.services.removeAll()
    self.nsb = NetServiceBrowser()
    self.nsb.delegate = self
    self.nsb.searchForServices(ofType:"_daap._tcp", inDomain: "")
}

func updateInterface () {
    for service in self.services {
        if service.port == -1 {
            print("service \(service.name) of type \(service.type)" +
                " not yet resolved")
            service.delegate = self
            service.resolve(withTimeout:10)
        } else {
            print("service \(service.name) of type \(service.type)," +
                "port \(service.port), addresses \(service.addresses)")
        }
    }
}

func netServiceDidResolveAddress(_ sender: NetService) {
    self.updateInterface()
}

func netServiceBrowser(_ aNetServiceBrowser: NetServiceBrowser, didFind aNetService: NetService, moreComing: Bool) {
    print("adding a service")
    self.services.append(aNetService)
    if !moreComing {
        self.updateInterface()
    }
}

func netServiceBrowser(_ aNetServiceBrowser: NetServiceBrowser, didRemove aNetService: NetService, moreComing: Bool) {
    if let ix = self.services.index(of:aNetService) {
        self.services.remove(at:ix)
        print("removing a service")
        if !moreComing {
            self.updateInterface()
        }
    }
  }
}

关于swift - 使用 Swift 的 Bonjour 服务浏览器不获取服务信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40589390/

相关文章:

ios - 如何为单个图像设置多个选择选项?

ios - 在 Swift 中继承自 UINavigationController

ios - 使用 Firebase 和 Swift 3 检查用户登录状态并加载基于它的 View Controller

windows - Bonjour DNS-SD 回调未被调用,我的代码中存在错误吗?

iphone - 如果我要发布 bonjour iOS 应用程序,是否需要向 IANA 注册我的服务名称?

iphone - 我可以使用 Bonjour 连接两台 iOS 设备,一台使用 3G 网络,一台使用 WiFi

ios - 为什么用户没有被保存在安装类中?

ios - 如何获取在 RxSwift 中点击了哪个按钮

ios - swift 3 : Expression implicitly coerced from 'UIView?' to Any

ios - 使用 Alamofire + SwiftyJSON 无法将数据加载到 UITableView