2016-11-14 3 views
2

Le service auquel je souhaite me connecter est publié via Bonjour.
Je peux trouver toutes les informations avec le navigateur Bonjour, cependant si j'essaye de rassembler les données par programmation, la seule valeur que j'obtiens est le nom du service.Le navigateur de services Bonjour avec Swift ne récupère pas serviceinfo

Le délégué NetService est défini et la fonction netServiceWillPublish est appelée. Les fonctions DidNotPublish ou DidPublish ne sont pas exécutées.

La fonction netServiceBrowser obtient tous les netServices publiés, mais toutes les propriétés sont définies sur la valeur par défaut du type de données.

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

Répondre

2

L'erreur est que les services qui se trouvent dans la fonction ServiceBrowserDelegate ne sont pas enregistrées nulle part et sont donc mis au rebut à la fin de la fonction.

Je trouve un exemple de travail ici:
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

votre solution fonctionne correctement, mais parfois il ne marche pas appeler netServiceBrowser service didFind. – SML