it-swarm.com.de

Wie wird die Erreichbarkeitsklasse verwendet, um eine gültige Internetverbindung zu erkennen?

Ich bin neu in der iOS-Entwicklung und habe Mühe, die Klasse "reachability.h" zum Laufen zu bringen. Hier ist mein Code für den View Controller:

- (void)viewWillAppear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter]
     addObserver:self 
     selector:@selector(checkNetworkStatus:) 
     name:kReachabilityChangedNotification 
     object:nil];

    internetReachable = [Reachability reachabilityForInternetConnection];
    [internetReachable startNotifier];
}

- (void)checkNetworkStatus:(NSNotification *)notice {
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    NSLog(@"Network status: %i", internetStatus);
}

Es sieht in Ordnung aus, aber in der Xcode-Konsole wird nichts angezeigt, wenn die App ausgeführt und zu dieser Ansicht gewechselt wird.

Ich verwende Reachability 2.2 und iOS 4.2.

Gibt es etwas offensichtliches, was ich falsch mache?

15
Camsoft

EDITED: Wenn Sie die Erreichbarkeit vor einer Code-Ausführung überprüfen möchten, sollten Sie nur verwenden

Reachability *reachability = [Reachability reachabilityForInternetConnection];    
NetworkStatus internetStatus = [reachability currentReachabilityStatus];
if (internetStatus != NotReachable) {
    //my web-dependent code
}
else {
    //there-is-no-connection warning
}

Sie können auch irgendwo einen Erreichbarkeitsbeobachter hinzufügen (z. B. in viewDidLoad):

Reachability *reachabilityInfo;
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(myReachabilityDidChangedMethod)
                                             name:kReachabilityChangedNotification
                                           object:reachabilityInfo];

Vergessen Sie nicht, [[NSNotificationCenter defaultCenter] removeObserver:self]; aufzurufen, wenn Sie die Erreichbarkeitserkennung nicht mehr benötigen (d. H. In der Methode dealloc).

55
knuku

So mache ich es. Ich habe eine Instanzvariable, die ich in meiner init-Methode festgelegt habe:

_reachability = [[APReachability reachabilityForInternetConnection] retain];

und wenn ich den Netzwerkstatus abfragen muss, mache ich Folgendes:

NetworkStatus networkStatus = [_reachability currentReachabilityStatus];
if (networkStatus != NotReachable) {
    // Network related code
}
else {
    // No network code
}

Wenn Sie sich für WLAN usw. interessieren, kann der Netzwerkstatus sein:

    NotReachable // No network
    ReachableViaWiFi // Reachable via Wifi
    ReachableViaWWAN // Reachable via cellular
6
codecaffeine

Update: 4. November 2013

Verwenden der Reachability 3.0-Version unter iOS7

Aufbauend auf den Antworten von @ NR4TR und @ codecaffeine:

Es gibt 5 Möglichkeiten, dies zu tun (nicht kompiliert :)

#include <ifaddrs.h>
#include <arpa/inet.h>

//1 - Is www.Apple.com reachable?
Reachability *rHostName = [Reachability reachabilityWithHostName:@"www.Apple.com"];
NetworkStatus s1 = [rHostName currentReachabilityStatus];

//2 - Is local wifi router or access point reachable?
Reachability *rLocalWiFi = [Reachability reachabilityForLocalWiFi];
NetworkStatus s2 = [rLocalWiFi currentReachabilityStatus];

//3 - Is my access point connected to a router and the router connected to the internet?
Reachability *rConnection = [Reachability reachabilityForInternetConnection];
NetworkStatus s3 = [rConnection currentReachabilityStatus];

//4  IPv4 standard addresses checking instead of Host to avoid dns lookup step
struct sockaddr_in saIPv4;
inet_pton(AF_INET, "74.125.239.51", &(saIPv4.sin_addr));
saIPv4.sin_len = sizeof(saIPv4);
saIPv4.sin_family = AF_INET;
Reachability *rIPv4 = [Reachability reachabilityWithAddress:&saIPv4];
NetworkStatus s4 = [rIPv4 currentReachabilityStatus];

//5  IPv6 addresses checking instead of Host to avoid dns lookup step
struct sockaddr_in saIPv6;
inet_pton(AF_INET, "2607:f8b0:4010:801::1014", &(saIPv6.sin_addr));
saIPv6.sin_len = sizeof(saIPv6);
saIPv6.sin_family = AF_INET;
Reachability *rIPv6 = [Reachability reachabilityWithAddress:&saIPv6];
NetworkStatus s5 = [rIPv6 currentReachabilityStatus];

Bearbeitungsstatus ist gleich

if (ReachableViaWiFi == s1)
    return @"WiFi"; //@"WLAN"

if (ReachableViaWWAN == s1)
    return @"Cellular"; //@"WWAN"

return @"None";
4
Dickey Singh

Folgen Sie diesem Link, es hat sehr nützlichen Quellcode und Schritte https://github.com/tonymillion/Reachability . Hier finden Sie Informationen darüber, wie Sie verschiedene Methoden in Reachability verwenden können, um herumzuspielen.

Fügen Sie system.configuration.framewok hinzu und fügen Sie Ihrem Projekt außerdem die Dateien Reachability.m und Reachability.h hinzu. Es gibt nach Gebrauch Methoden wie

+(instancetype)reachabilityWithHostName:(NSString*)hostname;
+(instancetype)reachabilityForInternetConnection;
+(instancetype)reachabilityWithAddress:(void *)hostAddress;
+(instancetype)reachabilityForLocalWiFi;

Beispiel-Snippet:

- (void)CheckConnection
{


    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(reachabilityChanged:) 
                                                 name:kReachabilityChangedNotification 
                                               object:nil];


    Reachability * reach = [Reachability reachabilityWithHostname:@"www.google.com"];

    reach.reachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            _blockLabel.stringValue = @"Block Says Reachable";
        });
    };

    reach.unreachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            _blockLabel.stringValue = @"Block Says Unreachable";
        });
    };

    [reach startNotifier];
}

Hoffe das hilft

3

Die einfachste Methode (sobald Sie Erreichbarkeit zu Ihrem Projekt hinzugefügt haben):

Reachability *reachability = [Reachability reachabilityForInternetConnection];
if (reachability.isReachable) {
    NSLog(@"We have internet!");
} else {
    NSLog(@"No internet!");
}
0
Inti

Beachten Sie den folgenden Code, um den Internet Connectivity zu überprüfen:

struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr*)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags) {
    return 0;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;

BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
NSURL *testURL = [NSURL URLWithString:@"http://www.google.com/"];
NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];

NSURLResponse *response = nil;
NSError *error = nil;

NSData *connectiondata = [NSURLConnection sendSynchronousRequest:testRequest
returningResponse:&response

BOOL connection=NO;

if ([connectiondata length] > 0 &&
error == nil){
    NSLog(@"Connection present” );
    connection=YES;
} else {
    NSLog(@"No Connection" );
    connection=NO;
}

return ((isReachable && !needsConnection) || nonWiFi) ? (connection ? YES : NO) : NO;
0
Kiran K

importieren Sie einfach die Erreichbarkeitsklassen und danach

-(BOOL) connectedToNetwork
 {
const char *Host_name = "www.google.com";
  BOOL _isDataSourceAvailable = NO;
Boolean success;
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,Host_name);
SCNetworkReachabilityFlags flags;
success = SCNetworkReachabilityGetFlags(reachability, &flags);
_isDataSourceAvailable = success &&
(flags & kSCNetworkFlagsReachable) &&
!(flags & kSCNetworkFlagsConnectionRequired);

CFRelease(reachability);

return _isDataSourceAvailable;
}
0
mahesh chowdary