52 votes

Vérifiez la connexion Internet (iOS 10)

Pour iOS 9, j'utilisais la classe publique Reachability pour vérifier si l'appareil est connecté à Internet ou non. J'ai converti mon code Swift 2 en Swift 3, et la classe Reachability ne fonctionne plus. Quelqu'un peut-il me dire comment vérifier la connexion internet sous iOS 10 ? Merci ! Voici l'extrait de code :

open 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) {
            SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
        }
        var flags = SCNetworkReachabilityFlags()
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
            return false
        }
        let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
        let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
        return (isReachable && !needsConnection)
    }
}

1 votes

2 votes

Veuillez noter que stackoverflow.com/questions/25623272/ a été mis à jour pour Swift 3.

0 votes

Je pense que cela vous aidera à répondre à votre question : stackoverflow.com/a/39783037/4301118

111voto

Adnan Thathiya Points 1066
import Foundation
import SystemConfiguration

func isInternetAvailable() -> 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)
    }

Cela fonctionne dans iOS 10

2 votes

Cette réponse est bonne mais pas suffisante. Si vous voulez utiliser cette fonction, vous devez importer SystemConfiguration.

6 votes

Si vous êtes connecté à un wi-fi mais que vous ne pouvez pas vous connecter à l'internet (ouvrir une page google), il renvoie quand même true pour reachable. Ce n'est pas le cas.

4 votes

Cela renvoie "vrai" lorsque l'on est connecté au WiFi sans Internet, ce qui est un problème dans mon cas.

63voto

Jad Points 1269

SWIFT 3.0 : Voici un moyen très simple de le faire :

import SystemConfiguration

protocol Utilities {
}

extension NSObject:Utilities{

    enum ReachabilityStatus {
        case notReachable
        case reachableViaWWAN
        case reachableViaWiFi
    }

    var currentReachabilityStatus: ReachabilityStatus {

        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
        zeroAddress.sin_family = sa_family_t(AF_INET)

        guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
                SCNetworkReachabilityCreateWithAddress(nil, $0)
            }
        }) else {
            return .notReachable
        }

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

        if flags.contains(.reachable) == false {
            // The target host is not reachable.
            return .notReachable
        }
        else if flags.contains(.isWWAN) == true {
            // WWAN connections are OK if the calling application is using the CFNetwork APIs.
            return .reachableViaWWAN
        }
        else if flags.contains(.connectionRequired) == false {
            // If the target host is reachable and no connection is required then we'll assume that you're on Wi-Fi...
            return .reachableViaWiFi
        }
        else if (flags.contains(.connectionOnDemand) == true || flags.contains(.connectionOnTraffic) == true) && flags.contains(.interventionRequired) == false {
            // The connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs and no [user] intervention is needed
            return .reachableViaWiFi
        } 
        else {
            return .notReachable
        }
    }

}

et ensuite vous pouvez simplement l'utiliser n'importe où dans votre projet par exemple :

  func viewDidLoad(){
      print(currentReachabilityStatus != .notReachable) //true connected
    }

0 votes

Merci, cela m'a aidé pour swift3.

3 votes

Celui-ci est la meilleure solution. Il est également très astucieux.

3 votes

Si vous êtes connecté à un wi-fi mais que vous ne pouvez pas vous connecter à l'internet (ouvrir une page Google), il renvoie quand même true pour reachable. Ce n'est pas le cas.

11voto

Patel Jigar Points 1358

Essayez ceci, ça marche pour moi premièrement import le site Configuration du système à votre classe.

import SystemConfiguration

Et maintenant, implémentez la fonction suivante.

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()
    if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
        return false
    }
    let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0

    return (isReachable && !needsConnection)

}

0 votes

Il semble qu'il y ait une faille dans ce code. La vérification des drapeaux avec == ne fonctionne pas correctement.

0 votes

Ce code fonctionne correctement pour moi, j'espère que vous utilisez swift 3.0, et si vous trouvez une meilleure solution, alors vous pouvez la mettre ici, s'il vous plaît ne pas downmarker la réponse.

1 votes

Vous pouvez le réparer avec flags.contains(.reachable) y flags.contains(.connectionRequired) . Oui, j'utilise Swift 3.

8voto

Krutagn Patel Points 69

étape 1 : créer un fichier swift dans votre projet. J'ai créé "ConnectionCheck.swift".

étape 2 : ajouter ce code dans votre fichier "ConnectionCheck.swift" et le fichier "import SystemConfiguration" à votre "ConnectionCheck.swift" et "ViewController.swift".

import Foundation
import SystemConfiguration
public class ConnectionCheck {

class func isConnectedToNetwork() -> Bool {

    var zeroAddress = sockaddr_in()
    zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
    zeroAddress.sin_family = sa_family_t(AF_INET)

    guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
            SCNetworkReachabilityCreateWithAddress(nil, $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)
}

}

étape 3 : Maintenant, dans "ViewController.swift", utilisez ce code pour vérifier l'accessibilité du réseau.

if ConnectionCheck.isConnectedToNetwork() {
        print("Connected")
    }
    else{
        print("disConnected")
    }

0 votes

Si je soumets mon application à Apple, dois-je modifier un code quelconque pour passer la vérification d'Apple ?

1 votes

@LOLXDXPLOL oui, on voit... Mais SO travaille avec des réponses multiples pour que les autres puissent voir des versions différentes et peut-être, juste peut-être, une meilleure solution apparaît... J'essaie de rester poli.

0 votes

@ByronCoetsee désolé, je ne voulais pas paraître impoli, je ne l'avais pas envisagé de cette façon. Merci de votre compréhension.

3voto

Pavle Mijatovic Points 472

Voici la solution Swift 3 via la fonction callback, isConnectedToNetwork() est tiré de la solution de Yasin Ugurlu ci-dessus.

class func isInternetAvailable(webSiteToPing: String?, completionHandler: @escaping (Bool) -> Void) {

    // 1. Check the WiFi Connection
    guard isConnectedToNetwork() else {
      completionHandler(false)
      return
    }

    // 2. Check the Internet Connection
    var webAddress = "https://www.google.com" // Default Web Site
    if let _ = webSiteToPing {
      webAddress = webSiteToPing!
    }

    guard let url = URL(string: webAddress) else {
      completionHandler(false)
      print("could not create url from: \(webAddress)")
      return
    }

    let urlRequest = URLRequest(url: url)
    let session = URLSession.shared
    let task = session.dataTask(with: urlRequest, completionHandler: { (data, response, error) in
      if error != nil || response == nil {
        completionHandler(false)
      } else {
        completionHandler(true)
      }
    })

    task.resume()
  }

0 votes

Votre réponse semble bonne et votre commentaire ci-dessus sur la réponse acceptée qui se connecte au wifi mais pas à l'internet est correct. Comment appelez-vous votre fonction et l'utilisez-vous à l'intérieur d'un contrôleur de vue ? Veuillez montrer un exemple

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X