使用Swift的Bonjour服务浏览器无法获取serviceinfo

时间:2016-11-14 13:00:41

标签: swift swift3 bonjour nsnetservice nsnetservicebrowser

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

设置NetService委托并调用函数netServiceWillPublish。 函数DidNotPublish或DidPublish不会被执行。

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

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()

1 个答案:

答案 0 :(得分:2)

错误是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()
        }
    }
  }
}