2017-08-30 6 views
0

Ceci est ma classe pour vérifier la connexion de mon application car elle nécessite l'utilisation de connexion Internet/mobile, mais mon application ne fonctionne pas si elle est connectée via une connexion cellulaire (3G/4G/LTE). Quelqu'un pourrait me donner un coup de main? MERCIAccessibilité ne peut pas se connecter par connexion cellulaire dans swift 3

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 
    let wWAN = flags == .isWWAN 

    return isReachable || wWAN && !needsConnection 

} 
} 

Répondre

1

J'ai utilisé cette méthode dans mon code pour trouver si l'appareil est connecté à Internet ou pas! J'ai trouvé le code sur StackOverFlow mais je ne me souviens pas du lien. Si quelqu'un connaît le lien s'il vous plaît commenter afin que je puisse mettre à jour le poste

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 
    } 

    /* Only Working for WIFI 
    let isReachable = flags == .reachable 
    let needsConnection = flags == .connectionRequired 

    return isReachable && !needsConnection 
    */ 

    // Working for Cellular and WIFI 
    let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0 
    let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0 
    let ret = (isReachable && !needsConnection) 

    return ret 

} 
+0

alors cela fonctionnera-t-il maintenant sur la connexion cellulaire? parce que je n'ai pas de périphérique physique pour exécuter le test en utilisant ce code. MERCI –

+0

Oui, le code fonctionne lorsque vous avez une connexion cellulaire. Je l'ai testé sur mon iPhone 6 physique et cela fonctionne parfaitement. :) Si la réponse à ma question vous a été utile, pouvez-vous la marquer comme réponse à votre question? @Fritz Gerald Moran – Siyavash

+0

déjà fait. BTW MERCI –