Lorsque j'essaie de vérifier une connexion Internet sur mon iPhone, je reçois un tas d'erreurs. Quelqu'un peut-il m'aider à résoudre ce problème?
Le code:
import Foundation
import SystemConfiguration
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
var flags: SCNetworkReachabilityFlags = 0
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
return false
}
let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return (isReachable && !needsConnection) ? true : false
}
}
Les erreurs avec le code:
S'il est illisible, l'erreur 1 indique:
'Int' n'est pas convertible en 'SCNetworkReachabilityFlags'
Erreurs 2 et 3:
Impossible de trouver une surcharge pour 'init' qui accepte les arguments fournis
ios
swift
xcode
reachability
b3rge
la source
la source
Réponses:
Pour résoudre le problème 4G mentionné dans les commentaires, j'ai utilisé l'implémentation d'accessibilité @AshleyMills comme référence et réécrit Reachability pour Swift 3.1:
mis à jour: Xcode 10.1 • Swift 4 ou version ultérieure
Fichier Reachability.swift
Usage
Initialisez-le dans votre méthode AppDelegate.swift didFinishLaunchingWithOptions et gérez toutes les erreurs qui pourraient survenir:
Et un exemple de contrôleur de vue:
Exemple de projet
la source
if SCNetworkReachabilityGetFlags(…)
xCode retourne un Bool dans sa dernière version.Pour Swift 3, Swift 4 (fonctionnant avec le cellulaire et le Wi-Fi):
Usage:
la source
Créez un nouveau fichier Swift dans votre projet, nommez-le
Reachability.swift
. Coupez et collez le code suivant pour créer votre classe.Vous pouvez vérifier la connexion Internet n'importe où dans votre projet en utilisant ce code:
Si l'utilisateur n'est pas connecté à Internet, vous souhaiterez peut-être lui montrer une boîte de dialogue d'alerte pour le notifier.
Explication:
Nous créons une classe publique réutilisable et une méthode qui peut être utilisée n'importe où dans le projet pour vérifier la connectivité Internet. Nous avons besoin d'ajouter des cadres de configuration de base et de configuration système.
Dans la classe publique Reachability, la méthode
isConnectedToNetwork() -> Bool { }
renvoie une valeur booléenne sur la connectivité Internet. Nous utilisons une boucle if pour effectuer les actions requises sur le cas. J'espère que cela suffit. À votre santé!la source
Si quelqu'un utilise déjà Alamofire, alors -
Usage:
la source
J'ai vérifié l'implémentation de la classe d'accessibilité d'Ashley Mill sans Cocoa Pods / Dependancy Manager. L'idée est de libérer la dépendance d'accessibilité dans le projet.
Xcode 7.2 - Swift 2.1
1) https://github.com/ashleymills/Reachability.swift . Téléchargez ajoutez la classe d'accessibilité au projet.
Remarque: Lors de l'ajout, assurez-vous que `` copier les éléments si nécessaire '' est coché.
2) Créez une classe AppManager.swift. Cette classe servira de classe de modèle public où des méthodes et des données publiques seront ajoutées et pourront être utilisées dans n'importe quel VC.
3) Créez une classe de délégués. J'utilise la méthode déléguée pour notifier l'état de la connectivité.
4) Créez la classe Parent de UIViewController (méthode d'héritage). La classe parente a des méthodes accessibles à tous les VC enfants.
5) Démarrez la surveillance de la connectivité Internet en temps réel dans AppDelegate.
6) J'ai ajouté une référence de nom de fichier Swift pour stocker des valeurs d'énumération constantes.
7) Sur ViewController (ex. Vous souhaitez appeler une API uniquement si le réseau est disponible)
L'échantillon peut être téléchargé sur https://github.com/alvinreuben/Reachability-Sample
Mise à niveau vers Swift 3.1 - https://github.com/alvinvgeorge/Reachability-UpgradedToSwift3
la source
Apple a introduit Network Framework dans iOS12.
la source
pathUpdateHandler
va introduire une référence forte avecself
, ajouter[weak self]
pour le résoudre :)Utilisez ceci pour Swift-5 +
Usage:
Ou utilisez simplement ceci
framework
pour plusUtilities
: Lienla source
Je viens de comprendre cela par moi-même.
Xcode: 7.3.1, iOS 9.3.3
En utilisant ashleymills / Reachability.swift comme Reachability.swift dans mon projet, j'ai créé la fonction suivante:
Appelez simplement
hasConnectivity()
où vous voulez pour vérifier une connexion. Cela fonctionne aussi bien pour le Wifi que pour le cellulaire.Ajout de Reachability.swift d'Ashleymills pour que les gens n'aient pas à se déplacer entre les sites:
la source
let reachability: Reachability = try Reachability.reachabilityForInternetConnection()
enlet reachability: Reachability = try Reachability()!
Bien qu'il ne réponde pas directement à votre question, je voudrais mentionner qu'Apple a récemment eu cette conversation:
https://developer.apple.com/videos/play/wwdc2018/714/
Vers 09h55, il parle de faire ce que vous demandez:
Cependant, cela présente quelques pièges:
Les points suivants sont quelques bonnes pratiques selon Apple:
waitsForConnectivity
sur true ( https://developer.apple.com/documentation/foundation/urlsessionconfiguration/2908812-waitsforconnectivity )taskIsWaitingForConnectivity
( https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate/2908819-urlsession ). Il s'agit de la méthode recommandée par Apple pour vérifier la connectivité, comme indiqué dans la vidéo à 33:25.Selon l'exposé, il ne devrait pas y avoir de raison de pré-vérifier si vous avez une connexion Internet ou non, car elle peut ne pas être exacte au moment où vous envoyez votre demande au serveur .
la source
J'ai créé ma propre solution en utilisant NSTimer et Alamofire:
Le NSTimer est utilisé comme délai d'expiration et a été utilisé en raison de résultats peu fiables en utilisant le délai d'expiration d'Alamofire. La demande doit être adressée à une URL de confiance pour être fiable, comme votre propre serveur ou le serveur qui héberge les services dont vous dépendez.
Lorsque le temporisateur expire, la demande est annulée et les résultats sont renvoyés à l'aide d'un gestionnaire d'achèvement.
Usage:
la source
requestTimeout()
serait appelé après le délai spécifié a été atteintSi vous utilisez Alamofire, vous pouvez faire quelque chose comme ceci:
la source
Swift 5
Dans n'importe quelle méthode, utilisez la condition ci-dessous
la source
ici ma solution pour swift 2.3 avec la lib ( Reachability.swift )
Allez dans votre
Podfile
et ajoutez:Puis dans votre
terminal
:Créez ensuite un nouveau fichier
ReachabilityManager
et ajoutez le code ci-dessous:Comment l'utiliser:
allez dans votre
AppDelegate.swift
et ajoutez le code ci-dessous:Ensuite, lorsque vous souhaitez vérifier si l'appareil est connecté à Internet, procédez comme suit:
la source
Bien qu'il ne puisse pas déterminer directement si le téléphone est connecté à un réseau, la solution la plus simple (, la plus propre?) Serait de «cingler» Google ou un autre serveur (ce qui n'est possible que si le téléphone est connecté à un réseau ):
Si vous craignez que le serveur soit en panne ou bloque votre adresse IP, vous pouvez toujours envoyer une requête ping à plusieurs serveurs de la même manière et indiquer si l'un d'eux est accessible. Ou demandez à quelqu'un de configurer un serveur dédié uniquement à cette fin.
la source
Avec l'aide du code ci-dessous, vous pouvez vérifier la connexion Internet pour le réseau cellulaire ainsi que pour le wifi. langue - Swift 3.0
la source
Pour swift 3, je ne pouvais pas utiliser simplement l'accessibilité des solutions RAJAMOHAN-S car il renvoie "vrai" s'il y a du WiFi mais pas d'Internet. Ainsi, j'ai implémenté une deuxième validation via la classe URLSession et le gestionnaire d'achèvement.
Voici toute la classe.
Et vous appelez cela comme ceci, par exemple:
la source
Ceci est ma version. Essentiellement, cela n'apporte rien de nouveau. Je l'ai lié à UIDevice.
la source
Maintenant appelez ça
la source