2017-05-13 9 views
1

J'utilise actuellement la classe ci-dessous pour vérifier la connexion à Internet, mais il ne retourne pas vrai lorsque l'utilisateur disposent d'une connexion de données cellulairestest joignabilité pour les données cellulaires

import Foundation 
    import SystemConfiguration 

public class Reachability { 

    class func isConnectedToNetwork() -> Bool { 

     var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) 
     zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) 
     zeroAddress.sin_family = sa_family_t(AF_INET) 

     let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { 
      $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in 
       SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) 
      } 
     } 

     var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0) 
     if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false { 
      return false 
     } 

     let isReachable = flags == .reachable 
     let needsConnection = flags == .connectionRequired 

     return isReachable && !needsConnection 

    } 
} 

Je dois changer cela afin qu'il puisse revenir vrai pour cellulaire aussi, j'ai vu des gens utiliser la classe Reachability de git mais je l'ai utilisé via mon application, donc je dois changer cette classe mais je ne sais pas comment faire

et l'utilisation est comme ci-dessous: `

if Reachability.isConnectedToNetwork() == true { 
    print("Internet connection OK") 

JSONParseFunction() 

} else { 
     print("Internet connection FAILED") 
     let alert = UIAlertView(title: "You are not connected to internet ", message: "make sure you are connected to internet ", delegate: nil, cancelButtonTitle: "چشم") 
     alert.show() 
    } 
    ` 

Répondre

1

Swift 3: Le code fourni par vous ne fonctionne que si le wifi est disponible, il ne fonctionnera pas dans le cas de données cellulaires.

Il suffit de changer ci-dessous les lignes mentionnées de code-à-dire

// Only Working for WIFI 

let isReachable = flags == .reachable 
let needsConnection = flags == .connectionRequired 
return isReachable && !needsConnection 

avec Mentionnés ci-dessous le code-à-dire

// Working for both WIFI and Cellular 

//kSCNetworkFlagsReachable: The specified node name or address can be reached using the current network configuration. 

let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0 
let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0 
let retVal = (isReachable && !needsConnection) 
return retVal 
+0

Merci plus tôt que votre post, je l'ai utilisé la classe joignabilité de Git par la façon dont cela est plus facile que je l'utiliser dans les projets futurs – UncleJunior

+0

Bienvenue. BTW Reachability est également un bon. Je l'ai personnellement utilisé dans mes différents projets. – Maddy