2017-01-08 1 views
1

J'ai ce code pour trouver des services sur un réseau local. Si j'installe l'application sur mon iPad ou que j'utilise le simulateur, cela fonctionnera bien, mais si j'utilise TestFlight, je ne trouve aucun des services. Merci pour toute aideSwift - NetServiceBrowser ne fonctionne pas dans TestFlight

import Foundation 

class FindServices:NSObject,NetServiceDelegate,NetServiceBrowserDelegate { 

    let browser = NetServiceBrowser() 
    var arrayService = [NetService]() 
    var arrayHosts = [HostStructure]() 


    init(netService: String, domain: String) { 
     super.init() 
     browser.delegate = self 
     browser.searchForServices(ofType: netService, inDomain: domain) 
     //var arrayHosts = hostStuct.arrayHosts 
    } 

    func stopService(){ 
     browser.stop() 
     browser.delegate = nil 
    } 

    //MARK: Delegates 

    func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) { 
     service.delegate = self 
     service.resolve(withTimeout: 0.0) 
     arrayService.append(service) 
    } 

    func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool) { 
    } 

    func netServiceBrowserWillSearch(_ browser: NetServiceBrowser) { 
     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "FindInstancesWillSearch"), object: nil) 
    } 

    func netServiceBrowser(_ browser: NetServiceBrowser, didNotSearch errorDict: [String : NSNumber]) { 
     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "FindInstancesStopSearch"), object: nil) 
    } 

    func netServiceDidResolveAddress(_ sender: NetService) { 
     if let addresses = sender.addresses, addresses.count > 0 { 
      for address in addresses { 
       let data = address as NSData 
       let inetAddress: sockaddr_in = data.castToCPointer() 
       if inetAddress.sin_family == __uint8_t(AF_INET) { 
        if let ip = String(cString: inet_ntoa(inetAddress.sin_addr), encoding: .ascii) { 
         // IPv4 
         print(ip) 
         let port = String(UInt16(inetAddress.sin_port).byteSwapped) 
         addToArrayHost(name: sender.name, ip: ip, port: port) 
        } 


       } else if inetAddress.sin_family == __uint8_t(AF_INET6) { 
        let inetAddress6: sockaddr_in6 = data.castToCPointer() 
        let ipStringBuffer = UnsafeMutablePointer<Int8>.allocate(capacity: Int(INET6_ADDRSTRLEN)) 
        var addr = inetAddress6.sin6_addr 

        if let ipString = inet_ntop(Int32(inetAddress6.sin6_family), &addr, ipStringBuffer, __uint32_t(INET6_ADDRSTRLEN)) { 
         if let ip = String(cString: ipString, encoding: .ascii) { 
          // IPv6 
          print(ip) 
         } 
        } 

        ipStringBuffer.deallocate(capacity: Int(INET6_ADDRSTRLEN)) 
       } 
      } 
     } 
    } 


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

    func getAddress(data: NSData){ 
    } 

    //MARK ARRAY CONTROL AND NOTIFICATION 

    func addToArrayHost(name: String, ip: String, port: String){ 
     arrayHosts.append(HostStructure(name: name, ip: ip, port: port, username: "", password: "")) 
     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "FindInstancesNewService"), object: nil) 
    } 

    func getHosts()->[HostStructure]{ 
     return arrayHosts 
    } 
} 


extension NSData { 
    func castToCPointer<T>() -> T { 
     let mem = UnsafeMutablePointer<T>.allocate(capacity: MemoryLayout<T.Type>.size) 
     self.getBytes(mem, length: MemoryLayout<T.Type>.size) 
     return mem.move() 
    } 
} 

Répondre

0

Essayez d'utiliser ce code pour saisir l'adresse:

for address in sender.addresses { 
    do { 
     var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) 
     try address.withUnsafeBytes { (pointer:UnsafePointer<sockaddr>) -> Void in 
      guard getnameinfo(pointer, socklen_t(address.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"]) 
      } 
     } 
     let ipAddress = String(cString: hostname) 
     // heres your IP! 
    } catch { 
     print(error)  
    } 
} 
return parsedAddresses