Je sais que cette question semblera être une dupe de beaucoup d'autres, cependant, je ne pense pas que le cas simple soit bien expliqué ici. Venant d'un arrière-plan Android et BlackBerry, les demandes HTTPUrlConnection
échouent instantanément s'il n'y a pas de connexion disponible. Cela semble être un comportement complètement sensé, et j'ai été surpris de constater que NSURLConnection
iOS ne l'avait pas émulé.
Je comprends qu'Apple (et d'autres qui l'ont étendu) fournissent une Reachability
classe pour aider à déterminer l'état du réseau. J'étais heureux de voir cela pour la première fois et je m'attendais vraiment à voir quelque chose comme bool isNetworkAvailable()
, mais à ma grande surprise, j'ai trouvé un système complexe nécessitant des enregistrements de notification et des rappels, et un tas de détails apparemment inutiles. Il doit y avoir un meilleur moyen.
Mon application gère déjà correctement les échecs de connexion, y compris l'absence de connectivité. L'utilisateur est informé de l'échec et l'application continue.
Ainsi, mes exigences sont simples: une fonction synchrone unique que je peux appeler avant toutes les requêtes HTTP pour déterminer si je devrais prendre la peine d'envoyer la requête ou non. Idéalement, il ne nécessite aucune configuration et renvoie simplement un booléen.
N'est-ce pas vraiment possible sur iOS?
la source
Réponses:
J'ai fait un peu plus de recherche et je mets à jour ma réponse avec une solution plus actuelle. Je ne sais pas si vous l'avez déjà regardé, mais il existe un bel exemple de code fourni par Apple.
Téléchargez l'exemple de code ici
Incluez les fichiers Reachability.h et Reachability.m dans votre projet. Jetez un œil à ReachabilityAppDelegate.m pour voir un exemple sur la façon de déterminer l'accessibilité de l'hôte, l'accessibilité par WiFi, par WWAN, etc. Pour une vérification très simple de l'accessibilité du réseau, vous pouvez faire quelque chose comme ceci
@ BenjaminPiette's: N'oubliez pas d'ajouter SystemConfiguration.framework à votre projet.
la source
Étant donné que ce fil est le meilleur résultat sur Google pour ce type de question, j'ai pensé que je fournirais la solution qui fonctionnait pour moi. J'utilisais déjà AFNetworking , mais la recherche n'a révélé comment accomplir cette tâche avec AFNetworking qu'au milieu de mon projet.
Ce que vous voulez, c'est l' AFNetworkingReachabilityManager .
Vous pouvez également utiliser les éléments suivants pour tester l'accessibilité de manière synchrone (une fois la surveillance démarrée):
la source
AFNetworkReachabilityManager
en lumière!AFNetworkReachabilityManager.reachable
N'effectue AUCUNE sorte de contrôle synchrone. Il renvoie un ou logique dereachableViaWWAN
etreachableViaWifi
.Désolé d'avoir répondu trop tard, mais j'espère que cette réponse pourra aider quelqu'un à l'avenir.
Voici un petit extrait de code C natif qui peut vérifier la connectivité Internet sans aucune classe supplémentaire.
Ajoutez les en-têtes suivants:
Code:
Swift 3
la source
J'utilise actuellement cette méthode synchrone simple qui ne nécessite aucun fichier supplémentaire dans vos projets ou délégués.
Importer:
Créez cette méthode:
Ensuite, si vous avez mis ceci dans un
MyNetworkClass
:Si vous testez dans le simulateur, activez et désactivez le wifi de votre Mac, car il semble que le simulateur ignorera les paramètres du téléphone.
Mettre à jour:
À la fin, j'ai utilisé un thread / callback asynchrone pour éviter de bloquer le thread principal; et re-tester régulièrement pour que je puisse utiliser un résultat mis en cache - bien que vous devriez éviter de garder les connexions de données ouvertes inutilement.
Comme @thunk l'a décrit, il existe de meilleures URL à utiliser, qu'Apple utilise lui-même. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network
la source
www.apple.com
est un grand site Web ... la meilleure option serawww.google.com
www.appleiphonecell.com
est censée être disponible strictement à cette fin et apparemment non bloquée en Chine.C'est possible et c'est vraiment simple si vous le regardez lorsque vous avez terminé l'implémentation, ce qui est encore une fois - très simple, car les seuls éléments dont vous avez besoin sont deux variables booléennes: l'accessibilité à Internet et l'accessibilité de l'hôte (vous avez souvent besoin de plus d'une de ces ). Une fois que vous avez assemblé votre classe d'assistance qui peut déterminer l'état des connexions, vous ne vous souciez vraiment plus de l'implémentation nécessaire pour connaître ces procédures.
Exemple:
Et le fichier .m:
la source
Quelqu'un a déjà résolu ce problème d'une manière simple et réutilisable.
DDGReachability
.EDIT: Ou
tonymillion/Reachability
.la source
J'ai extrait le code et mis en une seule méthode, j'espère que cela aiderait les autres.
...
la source
J'écris la version rapide de la réponse acceptée ici , au cas où si quelqu'un la trouve utile, le code est écrit swift 2,
Vous pouvez télécharger les fichiers requis à partir de SampleCode
Ajouter
Reachability.h
etReachability.m
déposer à votre projet,Maintenant, il faudra créer un
Bridging-Header.h
fichier s'il n'en existe pas pour votre projet,À l'intérieur de votre
Bridging-Header.h
fichier, ajoutez cette ligne:Maintenant, pour vérifier la connexion Internet
la source
Je pense que cela pourrait aider.
la source
Vous pouvez également essayer celui-ci si vous avez déjà configuré AFNetworking dans votre projet.
la source
Voici une bonne solution pour vérifier la connectivité à l'aide de Swift, sans utiliser l'accessibilité. Je l'ai trouvé sur ce blog .
Créez un nouveau fichier Swift dans votre projet appelé
Network.swift
(par exemple). Collez ce code dans ce fichier:Vous pouvez ensuite vérifier la connectivité n'importe où dans votre projet en utilisant:
la source
EDIT: Cela ne fonctionnera pas pour les URL réseau (voir les commentaires)
À partir d'iOS 5, il existe une nouvelle méthode d'instance NSURL:
Dirigez-le vers le site Web qui vous intéresse ou dirigez-le vers apple.com; Je pense que c'est le nouvel appel d'une ligne pour voir si Internet fonctionne sur votre appareil.
la source
Je n'étais pas non plus satisfait des options de vérification Internet disponibles (pourquoi n'est-ce pas une API native?!?!)
Mon propre problème était la perte de 100% des paquets - lorsqu'un appareil est connecté au routeur, mais que le routeur n'est pas connecté à Internet. L'accessibilité et d'autres seront suspendues pendant des siècles. J'ai créé une classe de singleton utilitaire pour gérer cela en ajoutant un délai d'attente asynchrone. Cela fonctionne bien dans mon application. J'espère que ça aide. Voici le lien sur github:
https://github.com/fareast555/TFInternetChecker
la source
Vérification de la disponibilité de la connexion Internet dans (iOS) Xcode 8.2, Swift 3.0
la source
Remplacement de l'accessibilité d'Apple réécrit en Swift avec fermetures , inspiré par tonymillion: https://github.com/ashleymills/Reachability.swift
Déposez le fichier
Reachability.swift
dans votre projet. Vous pouvez également utiliser CocoaPods ou Carthage - Voir la section Installation du fichier README du projet.Recevez des notifications sur la connectivité réseau:
et pour arrêter les notifications
la source
Alamofire
Si vous utilisez déjà Alamofire pour toutes les API RESTful, voici ce que vous pouvez en tirer.
Vous pouvez ajouter la classe suivante à votre application et appeler
MNNetworkUtils.main.isConnected()
pour obtenir un booléen indiquant si elle est connectée ou non.Ceci est une classe singleton. Chaque fois que l'utilisateur se connecte ou se déconnecte du réseau, il remplace
self.reachable
correctement true / false, car nous commençons à écouter l'NetworkReachabilityManager
initialisation sur singleton.Aussi, afin de surveiller l'accessibilité, vous devez fournir un hôte, actuellement j'utilise,
google.com
n'hésitez pas à changer pour tout autre hôte ou l'un des vôtres si nécessaire.la source