3

我要连接的服务是通过 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()
4

1 回答 1

5

错误是在 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()
        }
    }
  }
}
于 2016-11-23T12:54:12.163 回答