2016-09-24 1 views
3

J'ai ce code pour vérifier la connexion internet, ça fonctionnait très bien jusqu'à ce que je mette à jour vers Xcode 8 et swift 3. Maintenant, il retourne faux pour le réseau cellulaire et vrai pour le réseau WiFi, je ne sais pas pourquoi.Reachability renvoie Faux pour le réseau cellulaire dans iOS - Swift

Voici le code:

open 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 

    } 
} 

Maintenant, comment faire ce retour de la fonction véritable pour les deux wifi et connexion cellulaire?

+0

Veuillez noter que http://stackoverflow.com/a/25623647/1187415 a été mis à jour pour Swift 3 il y a un certain temps. –

Répondre

5

J'utilise le code suivant et cela fonctionne parfaitement.

Pour swift3

import Foundation 
import SystemConfiguration 

public class Reachability { 

    class func isConnectedToNetwork() -> Bool { 

     var zeroAddress = sockaddr_in() 
     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 = [] 
     if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) { 
      return false 
     } 

     let isReachable = flags.contains(.reachable) 
     let needsConnection = flags.contains(.connectionRequired) 
     return (isReachable && !needsConnection) 
    } 

} 

Appelé par:

if Reachability.isConnectedToNetwork() == true { 
    xy 
} else { 
    yz 
} 

Swift 2 (pour les spectateurs supplémentaires)

import Foundation 
import SystemConfiguration 

public class Reachability { 

    class func isConnectedToNetwork() -> Bool { 

     var zeroAddress = sockaddr_in() 
     zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress)) 
     zeroAddress.sin_family = sa_family_t(AF_INET) 

     guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, { 
      SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)) 
     }) else { 
      return false 
     } 

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

     let isReachable = flags.contains(.Reachable) 
     let needsConnection = flags.contains(.ConnectionRequired) 
     return (isReachable && !needsConnection) 
    } 
} 

appel Identique à Swift 3.

+1

utilisez-vous 3 rapide? Je l'ai obtenu à partir de votre code 'UnsafePointer ($ 0)': 'init' n'est pas disponible: utilisez 'withMemoryRebound (to: capacity: _)' pour afficher temporairement la mémoire comme un autre type compatible avec la mise en page. – Zizoo

+0

swift 2.3 ... Je suis désolé mon mauvais ... devinez ce problème nous ennuiera les prochaines semaines ... Je suis en train de le traduire maintenant ... –

+0

Merci pour votre réponse de toute façon – Zizoo

5

Il s'agit d'une implémentation rapide du framework d'accessibilité d'Apple. Pensez à l'utiliser, cela pourrait résoudre votre problème. Reachability

Pour vérifier si l'utilisateur est connecté à un Internet

let reachability = Reachability() 
if reachability.isReachable{ 
//Network is reachable 
}else{ 
//Not reachable 
} 

Il a également whenReachable, whenUnreachable fermetures et notification ReachabilityChangedNotification que vous pouvez utiliser pour vérifier si la connexion Internet est disponible et quand il est disponible si vous pouvez gérer ces événements en conséquence

+0

Merci, dois-je appeler cette fonction 'isReachable'? il y a beaucoup de code, ce que je veux est de vérifier si l'utilisateur connecté à un réseau rien de spécifique, pouvez-vous dire que dois-je appeler? – Zizoo

+0

Mis à jour ma réponse. Espérons que cela aide –