即使设备连接到 Wifi 或移动数据,也要检查互联网可用性 [重复]

Posted

技术标签:

【中文标题】即使设备连接到 Wifi 或移动数据,也要检查互联网可用性 [重复]【英文标题】:Check internet availability even if device is connected to Wifi or mobileData [duplicate] 【发布时间】:2019-07-23 10:27:18 【问题描述】:

如何检查互联网连接。?

下面的代码只显示了 wifi 或移动网络的连接,但无法检查当前的互联网连接。

class func isConnectedToNetwork() -> Bool 

    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 false
    

    var flags: SCNetworkReachabilityFlags = []
    if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) 
        return false
    

    let isReachable = flags.contains(.reachable)
    let needsConnection = flags.contains(.connectionRequired)

    return (isReachable && !needsConnection)

【问题讨论】:

使用响应性。它非常易于使用。 您在项目中使用 Alamofire 吗? 您好@TaimoorSuleman,请提供具体示例。 是的@FaysalAhmed 使用 alamofire。 那就用这个struct Connectivity static let sharedInstance = NetworkReachabilityManager()! static var isConnectedToInternet:Bool return self.sharedInstance.isReachable 【参考方案1】:

准确的答案在这里Reachability.swift。所有优秀的开发人员都使用这个解决方案。您也可以找到一个示例并尝试自己处理它(使用您的基本网址、您的行为设计等)。

【讨论】:

请让我提供代码示例@Agisight【参考方案2】:

创建一个类似的函数

public func isConnectedToNetwork() -> Bool 
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 false

var flags: SCNetworkReachabilityFlags = []
if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) 
    return false

if flags.isEmpty 
    return false


let isReachable = flags.contains(.reachable)
let needsConnection = flags.contains(.connectionRequired)
return (isReachable && !needsConnection)

然后将其用作布尔值

例如,如果 isConnectednetwork

希望这能解决你的问题。

【讨论】:

使用Reachability 不,它没有检查互联网的可用性。【参考方案3】:

这里是检查网络可达性的完整代码。

https://drive.google.com/drive/folders/1VzH_ysuOaXts7c6KKXzgGDLOHkV6_8QR?usp=sharing

希望!这对你有帮助...

【讨论】:

兄弟工作不正常。请检查并恢复。【参考方案4】:

使用Alamofire库检查设备是否连接到网络。

import Foundation
import Alamofire

class Connectivity 
    class func isConnectedToInternet() ->Bool 
        return NetworkReachabilityManager()!.isReachable
    

并将其添加到您的代码中

if Connectivity.isConnectedToInternet() 
        print("Yes! internet is available.")
        // do some tasks..
 

【讨论】:

【参考方案5】:

我使用 Reachability 框架来检查互联网连接,这是我的经理

import UIKit
import Reachability

class ReachabilityManager: NSObject 

    static let shared = ReachabilityManager()
    var reachabilityStatus: Reachability.Connection = .none
    let reachability = Reachability()

    var isNetworkAvailable: Bool 
        return reachabilityStatus != .none
    

    @objc func reachabilityChanged(notification: Notification) 
        guard let reachability = notification.object as? Reachability
            else 
                return
        
        reachabilityStatus = reachability.connection
        switch reachability.connection 
        case .none:
            NoInternetView.show()
            NotificationCenter.default.post(name: .reachable, object: nil, userInfo: ["connected": false])
        case .wifi, .cellular:
            NoInternetView.hide()
            NotificationCenter.default.post(name: .reachable, object: nil, userInfo: ["connected": true])
        
    

    func startMonitoring() 
        NotificationCenter.default.addObserver(self, selector: #selector(self.reachabilityChanged), name: Notification.Name.reachabilityChanged, object: reachability)
        do 
            try reachability?.startNotifier()
         catch 
            debugPrint("Could not start reachability notifier")
        
    

    func stopMonitoring() 
        reachability?.stopNotifier()
        NotificationCenter.default.removeObserver(self, name: Notification.Name.reachabilityChanged, object: reachability)
    


AppDelegate 打电话给ReachabilityManager.shared.startMonitoring()

【讨论】:

请提供完整代码 用 cocoapods 安装 ReachabilitySwift,这个类将通过 NotificationCenter 通知所有订阅 .reachable(自定义通知名称)的控制器的连接更改 做到了但没用。如果您在此处或链接中提供完整代码,那就太棒了。 是完整代码,去掉不需要的部分,使用有什么问题? 请提供 ReachabilitySwift 的链接【参考方案6】:

在您的 swift 项目中添加 Reachability.h 和 Reachability.m 文件。

创建 Bridging_Header

#ifndef xxx_Bridging_Header_h
#define xxx_Bridging_Header_h

#import "Reachability.h"

#endif /* xxx_Bridging_Header_h */

AppDelegate.swift

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate 

    var window: UIWindow?
    var isReachable: Reachability!

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 

        self.isReachable = Reachability.forInternetConnection()
        NotificationCenter.default.addObserver(self, selector: #selector(self.reachabilityChanged(_:)), name: NSNotification.Name.reachabilityChanged,
                                               object: nil)
        self.isReachable!.startNotifier()
        return true
    

    //Reachbality Notification Response
    @objc func reachabilityChanged(_ notification: Notification) 

        if self.isReachable.isReachableViaWiFi() || self.isReachable.isReachableViaWWAN() 
            print("Service avalaible!!!")
         else 
            print("No service avalaible!!!")
        
    

常量.swift

import Foundation
import UIKit

class Constants: NSObject 

    struct ReferenecVariables 
        static let appDelegate = UIApplication.shared.delegate as! AppDelegate
    

Viewcontroller.swift

...

@IBAction func loginButtonClicked() 
   if Constants.ReferenecVariables.appDelegate.isReachable.isReachable() 
      //network available
   else 
      //network not available.
  

...


或另一个答案


添加 SystemConfiguration.framework

import UIKit
import SystemConfiguration
....
....
@IBAction func signInButtonTapped(sender:AnyObject)
    let status:Bool = self.checkInternet()
    if status == false 
       //Network not available
    else
       // Network available
    

func checkInternet() -> Bool
    //CHECK INTERNET CONNECTION
    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 false
    
    var flags: SCNetworkReachabilityFlags = []
    if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) 
        return false
    
    let isReachable = flags.contains(.reachable)
    let needsConnection = flags.contains(.connectionRequired)

    return isReachable && !(needsConnection)

【讨论】:

您的代码仅检查与 wifi 的连接,而不是检查 Internet 可用性。 我已经整合了您提供的内容,只需检查一下。 抱歉,@Ramprasath Selvam 现在可以正常工作了。它只是检查与 wifi 或移动数据的连接。不检查它是否有互联网连接?【参考方案7】:

我检查了他们中的许多人用图书馆完成的答案,没有图书馆并不难,我的答案是为那些想要在不使用图书馆的情况下检查他们的状态的人。

首先定义这个函数:

let monitor = NWPathMonitor()

  func checkConnetionStatus() -> Bool 
        var status  = Bool()
        monitor.pathUpdateHandler =  pathUpdateHandler in
            if pathUpdateHandler.status == .satisfied 
                print("Internet connection is on.")
                status = true
             else 
                let alert = UIAlertController(title: "Connection problem", message: "check your connection please", preferredStyle: UIAlertController.Style.alert)
                alert.addAction(UIAlertAction(title: "Close", style: .cancel, handler: nil))
                alert.popoverPresentationController?.sourceView = self.appDelegate.window.self
                alert.popoverPresentationController?.sourceRect = CGRect(x: (self.appDelegate.window?.center.x)!, y: (self.appDelegate.window?.center.y)!, width: 0, height: 0)
                alert.popoverPresentationController?.permittedArrowDirections = []
                self.appDelegate.window?.rootViewController!.present(alert, animated: true, completion: nil)
                print("There's no internet connection.")
                status = false
            
        
        monitor.start(queue: queue)
        return status
    

然后在你提出请求的地方或你想要的任何地方调用它:

  func datarequest() 
          if checkConnetionStatus() == true 
            // do your job here
        
    

【讨论】:

这里的监视器是什么?请提供完美的例子。 很抱歉添加了它的内容:) ios 12以下我们也需要照顾

以上是关于即使设备连接到 Wifi 或移动数据,也要检查互联网可用性 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检测用户何时在android中连接到wifi或移动互联网

是否有任何API可以检查WiFi是否已连接到Internet?

如何检测系统是不是连接到 ad hoc 或基础设施 wifi?

Swift:检查iOS是不是在没有互联网的情况下连接到wifi

8266wifi模块是啥

在检查互联网连接期间 iOS 应用程序冻结