2017-06-07 3 views
1

Je suis assez nouveau dans Swift 3. Je veux obtenir l'adresse IP de mes NetServices que j'ai exploré avec bonjour pour les montrer à l'utilisateur, pas pour se connecter avec l'appareil. Je peux bien rechercher les appareils avec Bonjour et les obtenir énumérés dans un listView avec ce grand code d'accès: https://github.com/ecnepsnai/BonjourSwiftSwift 3 - Vous avez un tableau vide NetService.addresses après avoir exploré bonjour

ceci est ma fonction pour scanner les services de Bonjour et les mettre dans un tableau local de NetServices

// scanning for services, delete old bonjourServices Array and fill it with new discovered services 

var bonjourServices = [NetService]() 

private func putServicesToArray(){ 
    let browser: Bonjour = Bonjour() 

    _ = browser.findService(Bonjour.Services.Line_Printer_Daemon, domain: Bonjour.LocalDomain) { (services) in 

     self.bonjourServices.removeAll() 


     for service in browser.services { 

      if !(self.bonjourServices.contains(service)) { 

       self.bonjourServices.append(service) 
      } 
     } 
    } 
} 

J'utilise cette méthode pour obtenir l'adresse IP, de Swift 3 how to resolve NetService IP?

func netServiceDidResolveAddress(_ sender: NetService) { 

    print("netServiceDidResolveAddress get called with \(sender).") 

    var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) 

    guard let data = sender.addresses?.first else { 
     print("guard let data failed") 
     return 
     } 
    do { 
     try data.withUnsafeBytes { (pointer:UnsafePointer<sockaddr>) -> Void in 
      guard getnameinfo(pointer, socklen_t(data.count), &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 else { 
       throw NSError(domain: "domain", code: 0, userInfo: ["error":"unable to get ip address"]) 
      } 
     } 
    } catch { 
     print(error) 
     return 
    } 
    let address = String(cString:hostname) 
    print("Adress:", address) 
} 

et avec ce IBAction je veux juste imprimer l'adresse IP, mais mon ip est vide et mon bonjourServices[0].addresses est vide aussi le addresses.adress NSData Objets

@IBAction func detectNetwork(_ sender: UIButton) { 
    print("putServiceToArray: ") 

    putServicesToArray() 


    for service in bonjourServices { 
     print(service) 
    } 

    bonjourTableView.reloadData() 

    if !(bonjourServices.isEmpty){ 

     print(netServiceDidResolveAddress(bonjourServices[0])) 
     print(bonjourServices[0].addresses) 
    } 

} 

il y a ma sortie de la console:

netServiceDidResolveAddress get called with <NSNetService 0x61800003d6a0> local. _printer._tcp. Brother HL-3152CDW series. 

garde laissez les données ont échoué () en option ([])

il serait si gentil, si quelqu'un pouvait m'aider!

+0

quelqu'un? toujours à la recherche d'une solution. ce serait sympa d'avoir de l'aide – Melf11

Répondre

1

pourrait résoudre mon problème avec ce post: Bonjour Service Browser with Swift does not fetch serviceinfo

i a bien utilisé ce livre pour mon code de la page 299:

https://books.google.de/books?id=pNzSBQAAQBAJ&pg=PA299&lpg=PA299&dq=swift+implement+bonjour+discovery&source=bl&ots=6nhrmuDfEp&sig=eY9kPtzOl7nshavmwdwVYQlpNfM&hl=de&sa=X&ved=0ahUKEwjclvHGncLUAhXBKFAKHZeRByQ4ChDoAQgyMAI#v=onepage&q=swift%20implement%20bonjour%20discovery&f=false

et que je devais faire un appel comme celui-ci:

self.bonjourServices.removeAll() 
    self.browser = NetServiceBrowser() 
    self.browser.delegate = self 
    self.browser.searchForServices(ofType:"_raop._tcp", inDomain: "") 

maintenant il fonctionne très bien et je me suis toutes les données de mes services