2015-11-23 2 views
5

iOSアプリケーションの起動時にメソッドを呼びたいのですが、接続があるときにこのメソッドを呼び出すだけです。私はObjective-CでReachableを使うことができますが、このメソッドはSwiftの一部ではないことがわかりました。Swift:接続が失われたときや戻ってきたときにリスナーに報告するにはどうすればよいですか?

私はReachability.swiftと呼ばれるポッドを発見した、と私は提供された例を使用しています:

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

しかし、これは正常に動作していません。私はそのViewControllerに入ったときにのみ動作しますが、WiFiをオンにして電源を切ると動作しません。

答えて

11

私はViewControllerをのインスタンス変数としてreachabilityを宣言することでこの問題を解決しています

var reachability: Reachability! 

ので、この変数は、メソッドviewWillAppearから削除する必要があります。 (Burningによって提供される)

スイフト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") 
    } 
} 

スウィフト3

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

これは正しく働いた:)。

+1

ちょっと私のプロジェクトでこれを使用しようとしましたが、速やかに3 .reachabilityForInternetConnection()が認識されないようです。修正方法を教えてください。 – Dakata

+1

あなたのソリューションも私のために働いた...ありがとう! :) –

関連する問題