即使设备连接到 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?