Controle voor Internet Connectiviteit in Objective C

stemmen
15

Ik heb gewerkt door de Stanford iPhone Coding cursus en momenteel inhaken in de Twitter API. Wat ik zou willen doen is nauwkeurig hanteren twee foutcondities: een voor wanneer de gebruikersnaam ongeldig is, en een andere voor als het apparaat is momenteel niet verbonden met het internet. Helaas, zoals het nu is, het beste wat ik kan vermoeden is of de terugkeer van de API is nihil of niet - en dat is het geval voor beide voorwaarden.

Wat ik ben op zoek naar een of twee regels van de code die kan controleren of er een verbinding voordat u ophalen van remote data. Ik kon vinden in de Apple-documentatie, maar ik dacht: Waarom niet de vraag om jullie voor mijn voordeel en misschien is dat van anderen?

Aanvullende informatie: Het gebruik van Objective-C en de iPhone SDK in XCode.

De vraag is gesteld op 25/01/2009 om 16:53
bron van user
In andere talen...                            


8 antwoorden

stemmen
30

Neem een ​​kijkje op Apple's voorbeeldcode. Het Bereikbaarheid project laat zien hoe een verbinding te detecteren.

http://developer.apple.com/iphone/library/samplecode/Reachability/index.html

antwoordde op 25/01/2009 om 17:35
bron van user

stemmen
9

Deze code werkt, maar niet altijd het gewenste resultaat te creëren.

De manier waarop de TCP-stack op de iPhone werkt is heel anders dan wat mag worden verwacht. Met de "Bereikbaarheid" code, soms een netwerkverbinding zullen aanwezig zijn, maar zal niet betrouwbaar worden gedetecteerd. Echter, de lancering van MobileSafari vervolgens opnieuw probeert om de connectiviteit te controleren met "Bereikbaarheid" code zal leiden tot het juiste resultaat.

Zoals ik het meest effectieve wijze netwerkconnectiviteit hebben gevonden is een NSURLConnection controle uitgevoerd wanneer de toepassing wordt geladen in een afzonderlijke thread. Een oproep naar een URL die je weet dat iets terug als "Yes" (dwz HTML-bestand op uw server of zoiets). Kijk dan om er zeker van de geretourneerde resultaat is gelijk aan de statische tekst. Op die manier weet u dat de NSURLConnection stapel is te bereiken goed, in tegenstelling tot de "Bereikbaarheid" code die niet helemaal consequent werkt.

antwoordde op 10/05/2009 om 05:45
bron van user

stemmen
9

Je moet lezen in de foutcodes en reageren zo goed mogelijk. Ik heb enige ervaring met dit was grotendeels het kan afhangen van welke dienst die u interactie met, maar met delicious.com ik krijg fout -1012 voor slechte gebruiker / passwd die als je het op te zoeken is

NSURLErrorUserCancelledAuthentication =     -1012,

hoewel duidelijk dat formulering is misleidend, maar ik kan consistent repliceren zetten in slechte gebruikerservaring / passwd en het krijgen van die fout code. Technisch is de iPhone is nooit niet aangesloten op het internet, tenzij u zich in een of andere vreemde regio dat de problemen met dataverbinding heeft. Ik zie dat ook is er een foutcode

NSURLErrorNotConnectedToInternet =      -1009,

Ik zou gaan door NSURLError.h (en er zijn meer als dat)

NSURLErrorUnsupportedURL =          -1002,
NSURLErrorCannotFindHost =          -1003,
NSURLErrorCannotConnectToHost =         -1004,
NSURLErrorNetworkConnectionLost =       -1005,

enz...

alles wat je hoeft te doen is een verwijzing naar het NSError object dat u doorgegeven in en check it is foutcode zoals zo

//NSError *returnedError

if([returnedError code] == kERROR_CODE_BAD_USERNAME_OR_PASSWORD)

de constante is iets wat ik heb gedefinieerd in mijn eigen broncode die in wezen -1012

antwoordde op 25/01/2009 om 17:31
bron van user

stemmen
8

dit werkt voor mij en is afkomstig van appel seismische xml project:

- (BOOL)isDataSourceAvailable
{
    static BOOL checkNetwork = YES;
    if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once.
        checkNetwork = NO;

        Boolean success;    
        const char *host_name = "twitter.com"; // your data source host name

        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name);
        SCNetworkReachabilityFlags flags;
        success = SCNetworkReachabilityGetFlags(reachability, &flags);
        _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
    }
    return _isDataSourceAvailable;
}
antwoordde op 26/03/2009 om 16:18
bron van user

stemmen
3

bereikbaarheid is een aparte categorie, dankzij u toegang tot de code

   Reachability *curReach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus)
{
    case NotReachable:
    {
        UIAlertView *connectionAlert = [[UIAlertView alloc] init];
        [connectionAlert setTitle:@"Error"];
        [connectionAlert setMessage:@"Please check your network connection."];
        [connectionAlert setDelegate:self];
        [connectionAlert setTag:1];
        [connectionAlert addButtonWithTitle:@"Back"];
        [connectionAlert show];

        break;
    }
    case ReachableViaWWAN:
    {


    }
    case ReachableViaWiFi:
    {
    }
}
antwoordde op 20/08/2013 om 06:40
bron van user

stemmen
2
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
antwoordde op 14/08/2012 om 07:40
bron van user

stemmen
2

Bij het gebruik van Apple's Bereikbaarheid rekening mee dat u kunt vinden zelf via WWAN (ReachableViaWWAN) of WiFi (ReachableViaWiFi) is verbonden zonder verbinding met het internet, zelfs als u een aantal gastheer, zoals google.com of apple.com (misschien een caching bereiken kwestie). Uiteindelijk heb ik belt mijn eigen server en terug te krijgen een cijfer - de beste oplossing in mijn geval op zijn minst.

antwoordde op 18/05/2011 om 11:40
bron van user

stemmen
2

Wat is je huidige verbinding code eruit? Als u gebruik maakt NSURLConnection +sendSynchronousRequest:returningResponse:error:, dan hoeft u alleen maar om het adres van een NSError variabele passeren en controleer of daarna; met connectionWithRequest:delegate:, moet u bij de implementatie -connection:didFailWithError:in de gemachtigde.

antwoordde op 25/01/2009 om 16:59
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more