Connaitre l'état du réseau

CeetixCeetix Membre
16:19 modifié dans API UIKit #1
Hello !


Voilà  je dev une app qui a besoin de retirer un xml sur le net. Des le lancement de l'app, je vais le chercher.
Si l'iphone de l'user ne capte pas l'appli plante. J'aimerai donc pouvoir connaitre l'état du réseau de l'user et dans le AppDelegate si il ne capte pas lui faire savoir par notification et fermer l'app proprement.


Existe-t-il donc un moyen de faire ça?
Merci :)

Réponses

  • GreensourceGreensource Membre
    16:19 modifié #2
    Bas normalement NSURLConnection va te renvoyer une erreur, déjà  tu peux te servir de ça. Mais sinon des appli affichent l'état du réseaux donc ouais ça dois être possible...mais je sais pas comment  :P
  • Eddy58Eddy58 Membre
    16:19 modifié #4
    Voilà  une méthode dont je me sers, simple et efficace, qui retourne un flag si le réseau est présent ou non :

    <br />// Retourne si une connection Internet est présente<br />-(BOOL)checkConnection:(const char*)host_name <br />{<br />&nbsp; &nbsp; BOOL _isDataSourceAvailable=NO;<br />&nbsp; &nbsp; Boolean success;&nbsp; &nbsp; <br />	<br />&nbsp; &nbsp; //Creates a reachability reference to the specified <br />&nbsp; &nbsp; //network host or node name.<br />&nbsp; &nbsp; SCNetworkReachabilityRef reachability=SCNetworkReachabilityCreateWithName(NULL,host_name);<br />	<br />&nbsp; &nbsp; //Determines if the specified network target is reachable <br />&nbsp; &nbsp; //using the current network configuration.<br />&nbsp; &nbsp; SCNetworkReachabilityFlags flags;<br />&nbsp; &nbsp; success=SCNetworkReachabilityGetFlags(reachability,&amp;flags);<br />&nbsp; &nbsp; _isDataSourceAvailable=success &amp;&amp; (flags &amp; kSCNetworkFlagsReachable) &amp;&amp; !(flags &amp; kSCNetworkFlagsConnectionRequired);<br />	<br />&nbsp; &nbsp; CFRelease(reachability);<br />	<br />&nbsp; &nbsp; return _isDataSourceAvailable;<br />}<br /><br />
    


    Appel de la méthode :

    <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ([self checkConnection:(const char *)(&quot;www.google.com&quot;)]) <br />		{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;Connection OK&quot;);<br />		}<br />		else <br />		{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  NSLog(@&quot;Pas de Connection&quot;);<br />		}<br /><br />
    




  • AliGatorAliGator Membre, Modérateur
    16:19 modifié #5
    Sympa je vais le garder au chaud ce bout de code. J'avais déjà  pour ma part regardé l'exemple Reachability d'Apple (je pensais le citer si zoc m'avais pas devancé ^^) mais comme ça brut de fonderie quand on regarde le code c'est pas forcément simple à  décoder... Et puis ça reste une API C, z'auraient pu faire un wrapper :p

    Tiens d'ailleurs par contre, quitte à  faire une méthode Objective-C (et pas une fonction C pour checkConnection, pourquoi ne pas lui passer une NSString, plus facile et commun à  manipuler ? Et laisser checkConnection récupérer le "const char*" équivalent à  partir de cette NSString, quoi.
  • muqaddarmuqaddar Administrateur
    16:19 modifié #6
    Voilà  ma classe (inspirée de 1 ou 2 exemples)  qui check le network et le host :

    //<br />//&nbsp; CANetworkController.h<br />//&nbsp; iVinophile<br />//<br />//&nbsp; Created by Alexandre Bournier on 28/10/09.<br />//&nbsp; Copyright 2009 Physalia. All rights reserved.<br />//<br /><br />@interface CANetworkController : NSObject <br />{	<br />	BOOL _isCellular;<br />}<br /><br />@property(nonatomic) BOOL _isCellular;<br /><br />- (BOOL)checkNetworkStatus;<br />- (NSString*)getIPAddressForHost:(NSString*)anHost;<br />- (BOOL)hostAvailable:(NSString*)theHost;<br />- (BOOL)addressFromString:(NSString*)IPAddress address:(struct sockaddr_in *)address;<br /><br />@end
    


    //<br />//&nbsp; CANetworkController.m<br />//&nbsp; iVinophile<br />//<br />//&nbsp; Created by Alexandre Bournier on 28/10/09.<br />//&nbsp; Copyright 2009 Physalia. All rights reserved.<br />//<br /><br />#import &quot;CANetworkController.h&quot;<br /><br />#import &lt;SystemConfiguration/SystemConfiguration.h&gt;<br />#import &lt;netinet/in.h&gt;<br /><br />#include &lt;netdb.h&gt;<br />#include &lt;arpa/inet.h&gt;<br /><br />@implementation CANetworkController<br /><br />#pragma mark -<br />#pragma mark accessors<br /><br />@synthesize _isCellular;<br /><br />#pragma mark -<br />#pragma mark memory<br /><br />- (void)dealloc<br />{<br />	[super dealloc];<br />}<br /><br />#pragma mark -<br />#pragma mark checkNetworkStatus<br /><br />- (BOOL)checkNetworkStatus<br />{<br />	// create Internet socket addr of zero<br />	struct sockaddr_in zeroAddr;<br />	bzero(&amp;zeroAddr, sizeof(zeroAddr));<br />	zeroAddr.sin_len = sizeof(zeroAddr);<br />	zeroAddr.sin_family = AF_INET;<br />	<br />	// create target in format need by SCNetwork<br />	SCNetworkReachabilityRef target = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *) &amp;zeroAddr);<br />	<br />	// get the flags<br />	SCNetworkReachabilityFlags flags;<br />	BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(target, &amp;flags);<br />	CFRelease(target);<br />	<br />	// first possible error<br />	if (didRetrieveFlags == NO)<br />	{<br />		NSLog(@&quot;Error. Could not recover network reachability flags&quot;);<br />		return NO;<br />	}<br />	<br />	// create output<br />	BOOL isReachable = flags &amp; kSCNetworkFlagsReachable;<br />	BOOL needsConnection = flags &amp; kSCNetworkFlagsConnectionRequired;<br />	_isCellular = flags &amp; kSCNetworkReachabilityFlagsIsWWAN;<br />	<br />	return (isReachable &amp;&amp; !needsConnection) ? YES : NO;<br />}<br /><br />#pragma mark -<br />#pragma mark checkSiteAvailability<br /><br />- (NSString*)getIPAddressForHost:(NSString*)theHost<br />{<br />	// get host entry info for given host<br />	struct hostent *remoteHostEnt = gethostbyname([theHost UTF8String]);<br />	<br />	if (remoteHostEnt == NULL)<br />	{<br />		herror(&quot;resolv&quot;);<br />		return NULL;<br />	}<br />	<br />	// get address info from host entry<br />	struct in_addr *remoteInAddr = (struct in_addr *) remoteHostEnt-&gt;h_addr_list[0];<br />	<br />	// convert numeric addr to&nbsp; string<br />	char *sRemoteInAddr = inet_ntoa(*remoteInAddr);<br />	<br />	// return an NSString<br />	return [NSString stringWithFormat:@&quot;%s&quot;, sRemoteInAddr];<br />}<br /><br />- (BOOL)hostAvailable:(NSString*)theHost<br />{<br />	NSString *addressString = [self getIPAddressForHost:theHost];<br />	if (!addressString)<br />	{<br />		NSLog(@&quot;Error recovering IP address from host name&quot;);<br />		return NO;<br />	}<br />	<br />	struct sockaddr_in address;<br />	BOOL gotAddress = [self addressFromString:addressString address:&amp;address];<br />	<br />	if (!gotAddress)<br />	{<br />		NSLog(@&quot;Error recovering sockaddr address from %s&quot;, [addressString UTF8String]);<br />		return NO;<br />	}<br />	<br />	SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *) &amp;address);<br />	SCNetworkReachabilityFlags flags;<br />	<br />	BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &amp;flags);<br />	CFRelease(defaultRouteReachability);<br />	<br />	if (!didRetrieveFlags)<br />	{<br />		NSLog(@&quot;Error. Could not recover network reachability flags.&quot;);<br />		return NO;<br />	}<br />	<br />	BOOL isReachable = flags &amp; kSCNetworkFlagsReachable;<br />	return isReachable ? YES : NO;<br />}<br /><br />- (BOOL)addressFromString:(NSString*)IPAddress address:(struct sockaddr_in *)address<br />{<br />	if (!IPAddress || ![IPAddress length]) {<br />		return NO;<br />	}<br />	<br />	memset((char*) address, sizeof(struct sockaddr_in), 0);<br />	address -&gt; sin_family = AF_INET;<br />	address -&gt; sin_len = sizeof(struct sockaddr_in);<br />	<br />	int conversionResult = inet_aton([IPAddress UTF8String], &amp;address -&gt; sin_addr);<br />	if (conversionResult == 0) {<br />		NSAssert1(conversionResult != 1, @&quot;Failed to convert the IP address string into a sockaddr_in : %@&quot;, IPAddress);<br />		return NO;<br />	}<br />	<br />	return YES;<br />}<br /><br />@end
    
  • CeetixCeetix Membre
    16:19 modifié #7
    Oui j'ai regardé l'app d'apple, c'est un peu dur à  déchiffrer je trouve. Celle d'Eddy à  l'air pas mal . Je vais regarder la tienne aussi muqaddar ^^
    Merci !
Connectez-vous ou Inscrivez-vous pour répondre.