2015-11-23 22 views
5

Vorrei chiamare un metodo quando si avvia la mia app per iOS, ma voglio solo chiamare questo metodo quando c'è una connessione. Ho trovato che in Objective-C è possibile utilizzare Reachable, ma si scopre che questo metodo non fa parte di Swift.Swift: Come posso avere un listener che segnala quando la connessione viene persa e quando ritorna?

ho trovato un pod chiamato Reachability.swift, e sto utilizzando l'esempio che è stato fornito:

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") 
    } 
} 

Tuttavia, questo non è correttamente funzionante. Funziono solo quando inserisco quel ViewController, ma non quando accendo e spengo il WiFi.

risposta

11

devo risolvere questo problema dichiarando reachability come variabile del ViewController esempio:

var reachability: Reachability! 

Quindi questa variabile deve essere rimosso dal metodo 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 (fornito da 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") 
    } 
} 

Questo funzionava bene :).

+1

Ehi Ho provato a utilizzarlo per il mio progetto, ma sembra che in swift 3 .reachabilityForInternetConnection() non venga riconosciuto: puoi aiutarmi a risolverlo? – Dakata

+1

La tua soluzione ha funzionato anche per me ... grazie! :) –