2015-11-23 1 views
5

Je voudrais appeler une méthode lorsque mon application iOS démarre, mais je veux juste appeler cette méthode quand il y a une connexion. J'ai trouvé que dans Objective-C vous pouvez utiliser Reachable, mais il s'avère que cette méthode ne fait pas partie de Swift.Swift: Comment puis-je avoir un écouteur qui signale quand la connexion est perdue et quand elle revient?

J'ai trouvé un pod appelé Reachability.swift, et je suis en utilisant l'exemple qui a été fourni:

override func viewWillAppear(animated: Bool) { 
    let reachability: Reachability 
    do { 
     reachability = try Reachability.reachabilityForInternetConnection() 
    } catch { 
     print("Unable to create Reachability") 
     return 
    } 
    NSNotificationCenter.defaultCenter().addObserver(self, 
     selector: "reachabilityChanged:", 
     name: ReachabilityChangedNotification, 
     object: reachability) 

    do { 
     try reachability.startNotifier() 
    } catch { 
     print("This is not working.") 
      return 
    } 
} 

func reachabilityChanged(note: NSNotification) { 

    let reachability = note.object as! Reachability 

    if reachability.isReachable() { 
     if reachability.isReachableViaWiFi() { 
      print("Reachable via WiFi") 
     } else { 
      print("Reachable via Cellular") 
     } 
    } else { 
     print("Not reachable") 
    } 
} 

Cependant, cela ne fonctionne correctement. Je ne travaille que lorsque j'entre dans ce ViewController, mais pas quand j'allume et éteint le WiFi.

Répondre

11

J'ai résoudre ce problème en déclarant reachability comme une variable d'instance du ViewController:

var reachability: Reachability! 

donc cette variable devrait être retirée de la méthode viewWillAppear.

Swift 2

override func viewWillAppear(animated: Bool) { 
    do { 
     reachability = try Reachability.reachabilityForInternetConnection() 
    } catch { 
     print("Unable to create Reachability") 
     return 
    } 

    NSNotificationCenter.defaultCenter().addObserver(self, 
     selector: "reachabilityChanged:", 
     name: ReachabilityChangedNotification, 
     object: reachability) 

    do { 
     try reachability.startNotifier() 
    } catch { 
     print("This is not working.") 
     return 
    } 

} 

func reachabilityChanged(note: NSNotification) { 

    let reachability = note.object as! Reachability 

    if reachability.isReachable() { 
     if reachability.isReachableViaWiFi() { 
      print("Reachable via WiFi") 
     } else { 
      print("Reachable via Cellular") 
     } 
    } else { 
     print("Not reachable") 
    } 
} 

Swift 3 (fourni par Burning)

var reachability: Reachability! 
override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    reachability = Reachability() 
    NotificationCenter.default.addObserver(self, selector: #selector(self.reachabilityChanged(_:)), name: Notification.Name.reachabilityChanged, object: reachability) 

    do { 
     try reachability?.startNotifier() 
    } catch { 
     print("This is not working.") 
     return 
    } 

} 

func reachabilityChanged(_ note: NSNotification) { 

    let reachability = note.object as! Reachability 

    if reachability.connection != .none { 
     if reachability.connection == .wifi { 
      print("Reachable via WiFi") 
     } else { 
      print("Reachable via Cellular") 
     } 
    } else { 
     print("Not reachable") 
    } 
} 

Cela a fonctionné correctement :).

+1

Hey j'ai essayé d'utiliser ceci pour mon projet, mais il semble que dans swift 3 .reachabilityForInternetConnection() n'est pas reconnu: pouvez-vous m'aider à résoudre ce problème? – Dakata

+1

Votre solution a fonctionné pour moi aussi ... merci! :) –