【问题标题】:How can i check mobile data or wifi is on or off. ios swift如何检查移动数据或 wifi 是否打开或关闭。 ios迅捷
【发布时间】:2020-01-09 19:32:45
【问题描述】:

在我的应用程序中,我正在检查移动数据是否关闭,它会显示弹出窗口,例如检查您的数据连接。为此我写了这段代码

 import Foundation
import SystemConfiguration

public class Reachability {

    class 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(sizeofValue(zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)

        let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
            SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, UnsafePointer($0))
        }

        var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
        if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
            return false
        }

        let isReachable = flags == .Reachable
        let needsConnection = flags == .ConnectionRequired

        return isReachable && !needsConnection

    }
}

但通过此代码,它仅检查 wifi 是否已连接。但如果我尝试使用 3g 移动数据,它总是向我显示您的移动数据未连接。那我该如何解决呢?

【问题讨论】:

  • 这对我有用:link
  • 这是有效的。当我通过 wifi 连接时。但是当我通过移动数据连接时它不起作用@DadoZolic

标签: ios swift internet-connection


【解决方案1】:

试试下面的代码:

创建可达性类的对象,例如,

    var internetReachability = Reachability()

现在在 viewDidLoad() 中编写以下代码,

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:", name: kReachabilityChangedNotification, object: nil)
    self.internetReachability = Reachability.reachabilityForInternetConnection()
    self.internetReachability.startNotifier()
    self.updateInterfaceWithReachability(self.internetReachability)

现在创建函数来检查wifi的可达性以及数据包,

func updateInterfaceWithReachability(reachability: Reachability)
{
    let netStatus : NetworkStatus = reachability.currentReachabilityStatus()
    switch (netStatus.rawValue)
    {
    case NotReachable.rawValue:
        print("offline")
        break
    case ReachableViaWWAN.rawValue:
        print("online")
        break
    case ReachableViaWiFi.rawValue:
        print("online")
        break
    default :
        print("offline")
        break
    }
}

// Rechability update status
func reachabilityChanged(sender : NSNotification!)
{
    let curReach : Reachability = sender.object as! Reachability
    self.updateInterfaceWithReachability(curReach)
}

希望这会对你有所帮助。

【讨论】:

  • 我应该使用相同的 Reachability() 类吗?
  • 是的。你有那个图书馆吗?
  • 不,我是通过公开课来使用它
  • 好的,但您也可以像这样在线下载该库:github.com/tonymillion/Reachability
【解决方案2】:

如果您的应用程序中有任何超类,请使用以下代码

override func viewWillAppear(animated: Bool)
    {
        super.viewWillAppear(animated)


        NSNotificationCenter.defaultCenter().addObserver(self, selector: "ShowNetConnectivity", name: SHOW_NO_INTERNET_CONNECTION, object: nil)

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "DisssmissConnectivity", name: DISMISS_INTERNET_CONNECTION, object: nil)


        let reachability = SCNetworkReachabilityCreateWithName(nil, host)!
        SCNetworkReachabilitySetCallback(reachability, { (_, flags, _) in
            print(flags.rawValue)

            if (flags.rawValue == NotReachable.rawValue && flags.rawValue != ReachableViaWiFi.rawValue && flags.rawValue != ReachableViaWWAN.rawValue)
            {
                if(isConnectionAvailable == true)
                {
                    let nc = NSNotificationCenter.defaultCenter()
                    nc.postNotificationName(SHOW_NO_INTERNET_CONNECTION, object: nil)
                }
            }else
            {
                if(isConnectionAvailable == false)
                {
                    let nc = NSNotificationCenter.defaultCenter()
                    nc.postNotificationName(DISMISS_INTERNET_CONNECTION, object: nil)
                }
            }

            }, &context)

        SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes)
    }

    override func viewWillDisappear(animated: Bool)
    {
        super.viewWillDisappear(animated)
        NSNotificationCenter.defaultCenter().removeObserver(self, name: SHOW_NO_INTERNET_CONNECTION, object: nil)
        NSNotificationCenter.defaultCenter().removeObserver(self, name: DISMISS_INTERNET_CONNECTION, object: nil)
    }

【讨论】:

    【解决方案3】:

    这就是我的做法,它对我有用。 在我看来DidLoad:

    do {
            reachability = try Reachability.reachabilityForInternetConnection()
        } catch {
            print("Unable to create Reachability")
            return
        }
    
        NSNotificationCenter.defaultCenter().addObserver(self,
                                                         selector: #selector(MainViewController.reachabilityChanged(_:)),
                                                         name: ReachabilityChangedNotification,
                                                         object: reachability)
    
        do {
            try reachability.startNotifier()
        } catch {
            print("This is not working.")
            return
        }
    

    还有 reachabilityChanged

    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 {
            showNoConnectionAlert()
            print("Not reachable")
        }
    }
    

    使用这个Reachability

    【讨论】:

      【解决方案4】:

      不需要“可达性”窗格

      Swift 4+ 和 Xcode 11+

          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 {
          // Network Unavailable
       } else {
          // Network Available
       }
      

      【讨论】:

        【解决方案5】:

        我使用this pod repo 不仅可以实现wifi 或移动数据。你可以用它做更多事情,你可以在 ObjC 或 Swift 中使用它。

        最好的问候。

        【讨论】:

        • 如果可以使用内置工具实现目标,为什么还要使用 pod 并将代码绑定到外部依赖项?)
        • @rommex 如果其他人已经为您编写过代码,为什么还要重新编写轮子?
        • @RonLugge 为什么要依赖某人的代码(以及它的界面、隐藏的错误、受限的逻辑),如果它很容易在本地用餐?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多