Quel est l'avantage d'utiliser Reachability?

Quel est l'avantage de l'utilisation de Reachability sur le code ci-dessous? Je pense que Reachability a énormément de code, mais si c'est mieux, j'utiliserais ça à la place.

NSSsortingng *connectionSsortingng = [[NSSsortingng alloc] initWithContentsOfURL:[NSURL URLWithSsortingng:@"http://www.google.com"]]; if ([connectionSsortingng length] == 0) { //No connection } 

Maintenant accordé, si Google est jamais tombé alors cela ne fonctionnerait pas. Mais il n'y a littéralement aucune chance que cela se produise. Qu'est-ce que tu penses? Merci!

C'est en fait une bonne question – tellement bonne que je l'utilise dans les interviews de développeurs iOS lorsque mon entreprise recrute:

Pourquoi l'exemple d'accessibilité d'Apple dure-t-il des centaines de lignes, alors que vous ne pouvez utiliser qu'une seule ligne pour vérifier si une URL est réactive?

Premièrement, l'accessibilité du réseau est en réalité très, très compliquée . C'est beaucoup plus que de simplement tester une URL. Pensez aux exemples suivants:

  • L'user est sur la 3G, mais a utilisé leur allocation de données, de sorte que chaque request redirige vers le site du transporteur.

  • L'user est connecté à un réseau Wi-Fi public qui nécessite une authentification / connection, de sorte que la requête redirige vers une page de connection

Le dernier exemple est incroyablement commun – il arrive tout le time. Mais si vous initWithContentsOfURL votre application supposerait que vous initWithContentsOfURL la connectivité, alors que vous ne l'aviez pas: vous auriez simplement renvoyé le contenu de la page vers laquelle le réseau vous avait redirigé.

C'est une des raisons pour lesquelles le code d'Apple est plus complexe que vous ne le croyez au début. Vous ne devriez pas simplement requestr "puis-je atteindre cette URL" , mais "est-ce que datatables renvoyées à partir de cette URL sont celles que j'attends ".

Mais ce n'est vraiment que la pointe de l'iceberg. Accessibilité fait beaucoup plus à part cela – par exemple, je pourrais avoir une application qui a besoin de download beaucoup d'informations, disons 50 Mo de valeur. Ce serait une mauvaise idée de simplement download 50 Mo de données si l'user était sur une connection 3G sans son consentement – en particulier si elles sont en itinérance, ou sur un plan de données restreint. Donc, Reachability vous dira également quel type de connection l'user est sur: EDGE, 3G, WiFi, etc (* NB: voir la note ci-dessous, ce n'est probablement pas le meilleur conseil).

Le ReadMe.txt dans Reachability vous en dira un peu plus sur ce que le code peut et ne peut pas faire.

Malheureusement, il y a trop de gens en ligne qui ne réalisent pas qu'il y a beaucoup de scénarios quotidiens où initWithContentsOfURL renverra une réponse valide mais l'user n'aura pas de connectivité. [Les articles de blog comme celui-ci] [1] sont indexés dans Google, et les gens supposent que c'est un substitut acceptable: ce n'est pas le cas!

Une des raisons pour lesquelles je pose cette question quand je recrute est que le développeur ne pense pas à l'intérieur de la boîte – comme vous et beaucoup d'autres développeurs, ma première réaction quand j'ai vu le code d'accessibilité était "wow, cela semble trop compliqué pour quelque chose de très simple ". Mais j'espère que cette réponse vous aura aidé à vous convaincre du contraire.


Edit: Prends bien note des commentaires de Steven ci-dessous. Il soulève quelques points que ma réponse n'avait pas pris en count (c.-à-d. Les hotspots MiFi), et fait valoir que Reachability n'est pas nécessairement le sumt du code de encoding. Dans de nombreux cas, les développeurs vont modifier Reachability avec leurs propres améliorations et autres.

Le plus gros problème d'accessibilité n'est pas que ce soit du mauvais code, ou que ce soit du mauvais code à utiliser. C'est en fait assez joli code maintenant. Mais il est facile de mal interpréter le code et de l'utiliser à mauvais escient dans un but précis.

Voici quelques instructions pour utiliser Reachability:

  • Oui, utilisez Reachability. Peut-être le point le plus évident: l'accessibilité peut être un atout énorme pour rendre votre application plus naturelle.
  • N'utilisez jamais Reachability comme contrôle de contrôle en amont. Tout simplement parce que l'accessibilité n'est pas disponible actuellement, cela ne signifie pas qu'elle ne sera pas disponible si vous essayez de l'utiliser . Cette request de réseau que vous n'envoyez pas pourrait être la chose même qui réveille la mise en réseau d'iOS.
    • Edit: En fait, je devrais probablement adoucir un peu. Il peut être judicieux de reporter une opération non demandée pendant une courte période. Tout le rest étant égal, il est préférable de faire tous vos réseaux en continu plutôt que d'allumer et éteindre le matériel à plusieurs resockets. Soyez éclater si possible! Mais vous ne devriez jamais empêcher l'user de faire quelque chose basé sur l'accessibilité.
  • Utilisez Reachability pour aider à diagnostiquer pourquoi quelque chose a échoué. Après avoir essayé de faire du networking, Reachability vous dira que la mise en réseau n'est pas disponible. C'est une information précieuse que vous pouvez utiliser pour build un bon message d'erreur, et elle est probablement plus importante que le code d'erreur exact que l'API a renvoyé.
  • Autoriser l'user à réessayer manuellement. L'user peut savoir que le réseau devrait fonctionner à partir de cet endroit. Ne countz pas sur iOS en remarquant que le réseau est maintenant disponible et que l'accessibilité vous informe. Encore une fois, la tentative pourrait être la chose qui le rend disponible.
  • Utilisez la notification d'accessibilité pour réessayer automatiquement. Quand Reachability vous indique que le réseau est disponible, c'est parce qu'il était disponible. Il peut redescendre avant que vous puissiez terminer votre tentative, et il peut s'agir d'un réseau captif, mais c'est un bon moment pour réessayer votre request.

Vous pouvez voir ce comportement dans Mobile Safari. Si une page ne parvient pas à charger, vous pouvez réessayer, que l'iPhone pense que vous avez une connection. Si la mise en réseau devient disponible et que Mobile Safari les signale, elle réessayera automatiquement. C'est vraiment naturel.

Rappelez-vous ces directives:

  1. Le networking mobile n'est pas simple.
  2. Le seul moyen sûr de déterminer si une connection réseau réussira est de l'essayer et de voir si elle a réussi.
  3. Déterminer si une connection réseau a effectivement réussi n'est pas toujours sortingvial, que ce soit.

Il y a plusieurs sessions WWDC 2011 sur les réseaux mobiles qui méritent d'être regardées. (Il y en a plusieurs en 2010 qui traitaient de cela, et je suis sûr qu'il y en aura plusieurs dans WWDC 2012. Ce n'est pas un problème simple, et ça ne va pas disparaître.)

En outre: initWithContentsOfURL est synchrone. N'utilisez pas de réseau synchrone sur iOS. Si cela prend un time inattendu, votre application sera quittée par le chien de garde iOS.

Un avantage de Reachability est qu'il peut vous envoyer une notification lorsque l'état de la connection change. De cette façon, vous pouvez informer votre user que certaines fonctionnalités peuvent être restreintes.

Tous les bons points. Je vais append: envisager d'utiliser NSURLConnection. Il a un protocole de délégué qui vous informe de tous les events / incidents pertinents qui se produisent lors de l'établissement d'une connection. Il vous donne beaucoup plus de contrôle qu'une simple méthode initWithCintentsOfURL, et permet un traitement asynchronous. Mais si vous l'utilisez à partir de plusieurs classs, il peut être fastidieux d'implémenter toutes les methods de délégué plusieurs fois. Je l'ai enveloppé dans une class personnalisée avec seulement deux methods déléguées: didFail et didFinish , et réutiliser cette class dans tout mon code.

Une autre bonne raison d'utiliser Reachibility, en plus de la bonne réponse de @ lxt, est que si vous ne faites pas preuve de diligence raisonnable dans votre application pour tenir count des scénarios de connectivité, votre application sera rejetée. Apple testera votre application avec et sans connectivité, et si l'un de ces scénarios échoue, votre application ne sera même pas examinée.

Je suis entièrement d'accord avec la réponse de lxt. Il vous donne beaucoup plus de détails dans votre connectivité que juste "puis-je me connecter à un site Web". Bonne question