2016-11-14 10 views
2

接続したいサービスはBonjour経由で公開されています。
私はBonjourブラウザですべての情報を見つけることができますが、データをプログラムで収集しようとすると、私が得る唯一の価値はサービスの名前です。Swiftを使用したBonjourサービスブラウザはserviceinfoを取得しません

NetServiceデリゲートが設定され、関数netServiceWillPublishが呼び出されます。 関数DidNotPublishまたはDidPublishは実行されません。

関数netServiceBrowserは公開されているすべてのnetServicesを取得しますが、すべてのプロパティはデータ型のデフォルト値に設定されています。

答えて

2
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() 
     } 
    } 
    } 
} 
+0

あなたのソリューションが正常に機能しているが、時にはそれがnetServiceBrowser didFindサービスを呼び出すdoesntの。 – SML

関連する問題