Je souhaite implémenter une fonctionnalité dans l'appdelegate qui vérifie la connexion Internet lorsque l'application est en cours d'exécution et affiche les alertes en conséquence.Je ne voudrais pas coder dans chaque classe en vérifiant la connectivité Internet . Est-ce possible? J'utilise aussi Alamofire et SwiftyJson dans le projet.Comment vérifier la connexion Internet dans toute l'application
Répondre
Vous pouvez utiliser l'infrastructure SystemConfiguration
(Déterminez l'accessibilité du périphérique) pour ce faire. Ensuite, faites un fichier rapide comme l'exemple ci-dessous pour garder les choses propres. Cela va gérer tous les cas. Cela permettra de vérifier pour internet, cellulaire et wifi.
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
}
}
}
Ensuite, vous pouvez l'utiliser comme bon vous semble: Voici un exemple pour vérifier si aucun Internet.
if currentReachabilityStatus == .notReachable {
// Internet is offline
// show alert or do something.
}
merci pour la réponse. Mais je dois encore implémenter le code dans toutes les classes, n'est-ce pas? –
Non, il suffit de créer un fichier rapide qui est ajouté à votre projet et il sera global – Cliffordwh
Je veux dire ce code: si currentReachabilityStatus == .notReachable { // Internet est en mode hors connexion // montrer l'alerte ou faire quelque chose. } –
Ajouter cette classe dans ur projet:
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)
}
}
Utilisez-le où vous voulez comme suit:
if (Reachability.isConnectedToNetwork() == true){
// Do what you want...
}
else{
//Show alert
}
vous pouvez utiliser AlamofireNetworkActivityIndicator pour cela, [ici] (http://stackoverflow.com/questions/41327325/how-to-check-internet-connection-in-alamofire/41327866#41327866) dans une réponse. –