2017-02-10 4 views
1

J'utilise NSNetServiceBrowser et est capable de trouver la liste de services publiée par AVAHI dans "didFindService" qui ressemble à: Le service est apparu: local. _https._tcp. TEMP-Mobileyes5-1C497B9ED382 -1 Le service est apparu: local. _https._tcp. TEMP-Mobileyes5-1C497B8E3916 -1 Le service est apparu: local. _https._tcp. TEMP-Mobileyes5-1C497B9ED380 -1Comment obtenir IP et PORT d'un service publié par AVAHI dans iOS swift?

Mais impossible de trouver l'adresse IP et le numéro de port du même service. J'ai trouvé que le code n'atteint pas dans « netServiceDidResolveAddress » Mon code est:

class ServiceDiscovery : NSObject, NSNetServiceBrowserDelegate,NSNetServiceDelegate { 

    var _browser:NSNetServiceBrowser! 
    var _service: NSNetService! 
    var services = [NSNetService]() 
    override init() { 
     _browser = NSNetServiceBrowser() 
     super.init() 
     _browser.delegate = self 
     _browser.includesPeerToPeer = true 
     _browser.searchForServicesOfType("_https._tcp.", inDomain: "local.") 
     _browser.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 

    } 


    func netServiceBrowser(browser: NSNetServiceBrowser, didFindDomain domainString: String, moreComing: Bool) { 
     print(domainString) 
    } 

    func netServiceBrowser(aNetServiceBrowser: NSNetServiceBrowser, didFindService aNetService: NSNetService, moreComing: Bool) { 
     print("Service appeared: \(aNetService)") 
     services.append(aNetService) 
     aNetService.delegate = self 
     aNetService.resolveWithTimeout(5.0) 
    } 


    func netServiceBrowser(browser: NSNetServiceBrowser, didNotSearch errorDict: [String : NSNumber]) { 
     print(errorDict) 
    } 

    func netServiceBrowser(browser: NSNetServiceBrowser, didRemoveService service: NSNetService, moreComing: Bool) { 
     print("Service removed: \(service)") 

    } 

    func netService(sender: NSNetService, didNotResolve errorDict: [String : NSNumber]) { 
     print(errorDict) 
    } 

    func netServiceDidResolveAddress(sender: NSNetService) { 
     print(sender.addresses![0]) 
    } 


} 

Répondre

1

La raison possible pour votre problème pourrait être que vous appelez le

aNetService.resolveWithTimeout(5.0) 

dans une autre fonction, de façon bientôt comme

didFindService 

finitions, la variable locale aNetService est détruit (comme il est une variable locale pour fu didFindService nction)

SOLUTION

Je vois que vous avez déjà défini une variable au sommet, avec classe à l'échelle étendue nommée "_service" Par conséquent, l'utilisation qu'en utilisant

_service = aNetService 
_service.resolveWithTimeout(5.0) 

à l'intérieur de votre didFindService cela devrait résoudre votre problème. Et, netServiceDidResolveAddress devrait être appelé maintenant.

+0

Merci pour la bonne solution Aishwary, mais malheureusement je n'obtenais pas la bonne adresse avec votre solution, j'ai donc fait quelques changements dans mon code et maintenant ça marche. –

+0

encore problème est didFind méthode ne pas être appelé à chaque fois dans l'iPhone, mais dans l'iPad et les simulateurs, il est appelé à chaque fois. Je ne sais pas pourquoi –

+0

'func netServiceBrowser (_ navigateur: NetServiceBrowser, didRemove service: NetService, moreComing: Bool) { print (" didRemoveService ") si let ix = self.services.index (de: service) { self. services.remove (à: ix)! print ("la suppression d'un service") si moreComing { self.updateInterface() }} } ' –

0
import Foundation 
class ServiceDiscovery : NSObject, NetServiceBrowserDelegate,NetServiceDelegate { 

    var _browser:NetServiceBrowser! 
    var _service: NetService! 
    var services = [NetService]() 


    func searchServices(){ 
     self.services.removeAll() 
     _browser = NetServiceBrowser() 
     _browser.delegate = self 
     _browser.includesPeerToPeer = true 
     _browser.searchForServices(ofType: "_https._tcp.", inDomain: "local.") 
     _browser.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 
    } 


    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: 0.0) 
      } else { 

       let deviceLanController = DeviceLanController() 
       let dict = NetService.dictionary(fromTXTRecord: service.txtRecordData()!) 
       let id = self.copyStringFromTXTDict(dict as [AnyHashable: Any]?, which: "id") 
       var ipAdd = "" 
       if let address = service.addresses{ 
       if let addressOfFirstDevice = address.first{ 
        let theAddress = addressOfFirstDevice as Data 
        var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) 
        if getnameinfo((theAddress as NSData).bytes.bindMemory(to: sockaddr.self, capacity: theAddress.count), socklen_t(theAddress.count), 
            &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 { 
         if let numAddress = String(validatingUTF8: hostname) { 
          ipAdd = numAddress 
         } 
        } 

        if let serviceId = id{ 
         deviceLanController.setDeviceAvailable(serviceId, host: ipAdd, port: "\(service.port)") 
        } 
       } 
       } 
      } 
     } 
    } 


    fileprivate func copyStringFromTXTDict(_ dict: [AnyHashable: Any]?, which: String) -> String? { 
     // Helper for getting information from the TXT data 
     var resultString: String? = nil 
     if let data = dict?[which as NSObject] as! Data? { 
      resultString = String(data: data, encoding: String.Encoding.utf8)! 

     } 
     return resultString 
    } 



    func netServiceBrowser(_ browser: NetServiceBrowser, didFindDomain domainString: String, moreComing: Bool) { 
     print("didFindDomain") 
     print(domainString) 
    } 

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

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

    func netServiceBrowser(_ browser: NetServiceBrowser, didNotSearch errorDict: [String : NSNumber]) { 
     print("didNotSearch") 
     print(errorDict) 
    } 



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

    } 

    func netServiceWillResolve(_ sender: NetService) { 
     print("netServiceWillResolve",sender) 
    } 
    func netServiceDidResolveAddress(_ sender: NetService) { 
     print("netServiceDidResolveAddress",sender) 
     self.updateInterface() 
    } 

} 

Cette réponse a résolu mon problème. Je suis en train de résoudre et enregistrer chaque adresse dans ma coredata afin que je puisse utiliser cette adresse pour connecter les services locaux.