Hoe bereik ik iOS Reachability

Ik ontwikkel een iPhone-app die gebruikmaakt van het netwerk. De iPhone communiceert met mijn server via HTTP-aanvraag en zou moeten werken op WiFi en 3G.
Ik gebruik momenteel NSURLConnection initWithRequest om asynchrone verzoeken naar mijn server te verzenden en reacties te ontvangen (maar ik zal binnenkort gaan werken met de bibliotheek ASIHTTPRequest )

Ik begreep dat ik met dit soort apps (apps die een internetverbinding nodig hebben) (moet?) Reachability gebruiken.

Na het zoeken op het web en het bekijken van Apple's Reachability voorbeeldcode begrijp ik nog steeds geen enkele basis dingen:

Wat zijn de belangrijkste doelen van bereikbaarheid?

In Apple's voorbeeld detecteren ze netwerkproblemen met de host, WiFi en 3G en presenteren ze de gebruiker een passend bericht.
Is dit het hoofddoel van bereikbaarheid om de gebruiker een bericht te tonen? Of moet ik het gebruiken voor andere, meer praktische scenario's? Als het verzoek NSURLConnaction is mislukt, moet ik Reachability dan op de een of andere manier gebruiken om het verzoek opnieuw te verzenden?

Wat is geschikt gebruik van bereikbaarheid?

Is het gebruikelijk om alleen een één -instantie te gebruiken wanneer de app wordt gestart en vervolgens te luisteren naar netwerkwijzigingen? Of moet ik mezelf de bereikbaarheidsstatus controleren vóór elk netwerkverzoek?
Is het voldoende om reachabilityWithHostName te gebruiken of heb ik ook bereikbaarheidsniveauForLocalWiFi en reachabilityForInternetConnection nodig?

One more thing, I understood apple can reject apps that use the network and don't use Reachability.
What are the "must" do methods I should implement?
Will it be enough to just notify the user that currently there is no internet?

32

3 antwoord

Reachability is a network helper utility class, its used to get various informations about the connection status

Wat zijn de belangrijkste doelen van bereikbaarheid?

  • Bereikbaarheid wordt gebruikt om de netwerkstatus te doorzoeken
  • en om uw luisteraars te registreren om geïnformeerd te worden wanneer de connectiviteit verandert

Is dit het belangrijkste doel van bereikbaarheid om de gebruiker een bericht te laten zien?

Nee natuurlijk, het belangrijkste gebruik is om te testen of er een internetverbinding is, of om een ​​melding te krijgen als de connectiviteit verandert

Als het verzoek NSURLConnaction bijvoorbeeld is mislukt, moet ik dit gebruiken   Bereikbaarheid om op de een of andere manier het verzoek opnieuw te verzenden?

Ja, je zou het kunnen gebruiken, bijvoorbeeld wat ik normaal doe in mijn project is om alle verzoeken die zijn gedaan aan een externe server op te slaan, laten we zeggen dat ik 10 bestanden wil downloaden,

Wanneer een bestand mislukt vanwege het ontbreken van een internetverbinding, sla ik ze op in een reeks mislukte downloads,

Wanneer de bereikbaarheid me meldt dat de internetverbinding is hersteld, voer ik deze array door en start ik het downloadproces opnieuw

Wat is geschikt gebruik van bereikbaarheid?

Het hangt ervan af, op uw patronen en behoeften.

Is het gebruikelijk om slechts één instantie te gebruiken wanneer de app wordt gestart en vervolgens te luisteren   om wijzigingen op het netwerk aan te brengen?

Ja, dat is wat ik doe, in mijn projecten heb ik maar 1 exemplaar van een downloadmanagerklasse, en deze klasse heeft het enige levende exemplaar van Reachability

Of moet ik voor elk netwerk de bereikbaarheidstatus controleren   aanvragen?

Je kunt dat doen zonder meerdere instantie van Reachability-klassen te hebben, wat ik normaal doe, is om een ​​methode in mijn downloadmanager te hebben die me vertelt dat ik Reachability gebruik als er verbinding is of niet.

Is het voldoende om reachabilityWithHostName te gebruiken of heb ik dit ook nodig   bereikbaarheid ForLocalWiFi en bereikbaarheidVoorInternetConnection?

Ben hier niet zeker van, maar wat ik normaal doe is de connectiviteit testen op alle mogelijke manieren, ik maak geen onderscheid tussen 3g of wifi, maar er zijn enkele implementaties die deze info (wifi of 3g) nuttig kunnen maken

45
toegevoegd
Bedankt voor uw antwoord. Kunt u alstublieft het 'nog een ding' aanvinken dat ik aan de vraag heb toegevoegd
toegevoegd de auteur Eyal, de bron
Ben me daar helemaal niet van bewust, ik heb 5+ apps in de appstore, ze gebruiken allemaal Reachability, ik gebruikte bereikbaarheid zoals ik hierboven beschreven heb in het antwoord, dus ik weet niet wat geïmplementeerd moet worden, ik implementeer normaal wat ik nodig heb
toegevoegd de auteur Omar Abdelhafith, de bron
Je zei dat een van de belangrijkste doelen van bereikbaarheid is "om je luisteraars te registreren om geïnformeerd te worden wanneer de connectiviteit verandert", maar het geeft niet elke keer terugbellen (probeer om van router te veranderen en controleer).
toegevoegd de auteur Khushbu Shah, de bron

Reachability is an example project that Apple has made. People use this as an API over the SystemConfiguration framework. As you already have seen there are methods to check if a host is reachable and so on.

De manier waarop ik het Reachabilty-project gebruik, is dat ik een klasse heb gemaakt met een klassemethode die een boolean retourneert als de host waar ik om vraag data beschikbaar is. Als dit het geval is, retourneert de methode JA en als dit niet het geval is, wordt NEE geretourneerd (uiteraard).

Nu, in de applicatie waar ik gebruik maak van verbindingen, moet je/moeten controleren of het mogelijk is om een ​​verbinding te starten zoals de documentatie van Apple aangeeft. Ik heb een eenvoudige if en laat vervolgens een passend waarschuwingsbericht zien dat het verzoek op dit moment niet kon worden voltooid.

Er zijn geen vereisten die u automatisch opnieuw zou moeten proberen als het verzoek niet de eerste keer kon worden uitgevoerd. Het belangrijkste doel hiervan is om ervoor te zorgen dat uw applicatie niet crasht en tegelijkertijd de gebruiker een bericht geeft dat dit niet mogelijk is.

Ik gebruik de meldingen zelf niet, maar dat komt omdat ik niet geïnteresseerd ben in het controleren of verbinding al dan niet kan worden uitgevoerd. Dit is iets dat u moet beslissen aan de hand van uw applicatie-eisen.

U bent niet verplicht om alle methoden in de klasse Reachablitiy te gebruiken, het is voldoende om er een te gebruiken. Het is gedocumenteerd wat de verschillende methoden bieden en wanneer ze moeten worden gebruikt in het headerbestand.

Vergeet niet het systeemconfiguratie -kader op te nemen.

12
toegevoegd
Bedankt voor uw antwoord, als u wilt controleren of de host beschikbaar is vóór elk netwerkverzoek, voegt dit dan een overhead toe aan elk verzoek?
toegevoegd de auteur Eyal, de bron
Dus vertel me als ik het goed begrijp, om hetzelfde resultaat te krijgen, maar met meldingen, ik zal een aantal globale booleaanse "HostIsAvailable" behouden, deze booleaanse zal worden bijgewerkt wanneer ik de Reachability-meldingen ontvang, dan zal ik voor elk netwerkverzoek controleren als het JA is, zo niet, laat ik de gebruiker een waarschuwingsbericht zien.
toegevoegd de auteur Eyal, de bron
Ja, maar dat zou minimaal moeten zijn. Ik heb er geen noemenswaardige overhead van gemerkt. Op de vragen die je hebt toegevoegd, heb ik het al beantwoord, denk ik. Aarzel niet om te vragen of iets nog onduidelijk is :)
toegevoegd de auteur Andreas, de bron
Ja, dat is een mogelijke oplossing. U registreert uw app-gedelegeerde als de ontvanger van die meldingen en werkt de variabele (n) bij wanneer een van de meldingen wordt ontvangen. In uw visie controllers kunt u dit doen MyAppDelegate * myAppDelegate = (MyAppDelegate *) [[UIApplication sharedApplication] delegate] om toegang te krijgen tot uw variabelen.
toegevoegd de auteur Andreas, de bron

Bereikbaarheid maakt een beste schatting of het internet bereikbaar is of niet. Het geeft aan of u toegang hebt via wifi of dat u alleen toegang hebt via mobiele gegevens. Er is geen garantie dat dit correct is. Als er staat dat je een wifi-verbinding hebt, kan die verbinding een seconde later verloren gaan. De enige manier om te bepalen of het openen van een URL wel of niet werkt, is om die toegang te krijgen en te zien wat er gebeurt. Er zijn situaties waarin de toegang werkt wanneer Bereikbaarheid zegt dat niet en vice versa.

Hier is wat ik gebruik Bereikbaarheid voor: Nadat downloads mislukten omdat er geen internetverbinding was, zal ik opnieuw proberen wanneer Reachability een wijziging detecteert (eigenlijk een paar seconden later, URL-toegang mislukt vaak onmiddellijk nadat Reachability zegt dat WiFi terugkomt). Nadat downloads zijn mislukt waar mobiele gegevens niet zijn toegestaan, controleer je of mobiele gegevens beschikbaar zijn en vraag je de gebruiker om het gebruik van mobiele gegevens toe te staan.

0
toegevoegd