2017-01-18 14 views
-1

アプリが動作しているときにいつでもインターネット接続をチェックするappdelegateの機能を実装したいと思います。私は、各クラスごとにインターネット接続をチェックしたいと思います。これは可能ですか?プロジェクトでAlamofireとSwiftyJsonも使用しています。アプリ全体のインターネット接続を確認する方法

+0

をあなたはこのためにAlamofireNetworkActivityIndi​​catorを使用することができ、【こちら】(のhttp:/ /stackoverflow.com/questions/41327325/how-to-check-internet-connection-in-alamofire/41327866#41327866)を回答してください。返信ありがとう。 –

答えて

0

SystemConfigurationフレームワーク(デバイスの到達可能性を判断する)を使用して、そうすることができます。次に、以下の例のような素早いファイルを作成して、物事を清潔に保ちます。これにより、すべてのケースが処理されます。これは、インターネット、携帯電話、無線LANをチェックしません。

Connection.swift

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

} 

あなたがそれを使用することができますそして、しかし、あなたが好き:ここではありません、インターネットかどうかを確認するためのサンプルです。

if currentReachabilityStatus == .notReachable { 
     // Internet is offline 
     // show alert or do something. 
    } 
+0

しかし、私はまだすべてのクラスのコードを実装する必要がありますか? –

+0

いいえ、プロジェクトに追加された迅速なファイルを作成してください。グローバルになります – Cliffordwh

+0

このコードの意味は次のとおりです。 currentReachabilityStatus == .notReachable { //インターネットがオフラインです //警告を表示するか何かを実行します。 } –

0

ウルプロジェクトでこのクラスを追加します。あなたが欲しい、これまで次のように

import SystemConfiguration 

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) { 
     $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) 
} 
} 

はどこにそれを使用します。

if (Reachability.isConnectedToNetwork() == true){ 
     // Do what you want... 
    } 
    else{ 
     //Show alert 
    } 
関連する問題