Достижимость не работает должным образом

Скачанный Reachability от Apple, используя этот метод для проверки активного подключения:

-(BOOL)isReachable{

    Reachability *r = [Reachability reachabilityWithHostName:@"http://www.google.com"];

    if(NotReachable == [r currentReachabilityStatus]) {
        NSLog(@"Not Reachable");
        return NO;
    }

    NSLog(@"Reachable");
    return YES;  

}

Возвращает NO каждый раз, несмотря на то, что он подключен? Не могу понять, почему...

Есть идеи? Благодарю.

На стороне примечания, может ли кто-нибудь порекомендовать хороший чистый класс одноэлементного повышения?

Ответ 1

EDITED: вы должны удалить протокол, http из вашего запроса на reachabilityWithHostName, поэтому обновите его до

 Reachability *reachability = [Reachability reachabilityWithHostname:@"www.google.com"];
 NetworkStatus netStatus = [reachability currentReachabilityStatus];

Ответ 2

Используйте этот код, чтобы проверить, подключено ли устройство к Интернету или нет.

используйте этот код в viewDidLoad:

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

    hostReachable = [Reachability reachabilityWithHostName: @"www.apple.com"] ;
    [hostReachable startNotifier];

и добавьте эту функцию в свой код:

-(void) checkNetworkStatus:(NSNotification *)notice
{
    recheabilityBool=FALSE;
    nonrecheabilityBool=FALSE;
    // called after network status changes
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)
    {
        case NotReachable:
        {
            nonrecheabilityBool=TRUE;
            internetCon=0;
            //NSLog(@"The internet is down.");


            break;
        }
        case ReachableViaWiFi:
        {
            NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
            internetCon=404;
            [prefs setInteger:internetCon forKey:@"conKey"];

            //NSLog(@"The internet is working via WIFI.");
            break;

        }
        case ReachableViaWWAN:
        {
            //NSLog(@"The internet is working via WWAN.");

            break;
        }
    }

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)
    {
        case NotReachable:
        {
            internetCon=0;
            if( nonrecheabilityBool==FALSE)
            {
                //NSLog(@"A gateway to the host server is down.");
            }
            break;

        }
        case ReachableViaWiFi:
        {
            if(recheabilityBool==FALSE)
            {

                recheabilityBool=TRUE;

                NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
                internetCon=404;
                [prefs setInteger:internetCon forKey:@"conKey"];


                //NSLog(@"The internet is working via WIFI.");
                break;
            }


            //NSLog(@"A gateway to the host server is working via WIFI.");

            break;
        }
        case ReachableViaWWAN:
        {
            //NSLog(@"A gateway to the host server is working via WWAN.");
            break;
        }
    }
}


- (BOOL)connected
{
    Reachability *reachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus networkStatus = [reachability currentReachabilityStatus];
    return !(networkStatus == NotReachable);
}

Ответ 3

У меня такая же проблема с Tony Million Reachability: статус сети всегда был установлен NotReachable. Я исправляю это с добавлением Framework SystemConfiguration

Надеюсь, поможет

Ответ 4

Я использую KSReachability. Он работает с NSNotification, блоками, KVO и с ARC или без него.

KSReachability *reachability = [KSReachability reachabilityToHost:@"www.google.com"];
reachability.onReachabilityChanged = ^(KSReachability* reachability) {
    NSLog(@"Update: network is %@", reachability.reachable ? @"up." : @"down.");
};

Ответ 5

Если вы пытаетесь выяснить, может ли устройство подключиться к Интернету в целом, вы, вероятно, должны использовать доступность дляInternetConnection вместо достижимостиWithHostName :. Кроме того, для обоих этих вызовов потребуется немного времени для запуска (оно все равно будет в миллисекундах, но дольше, чем время, необходимое для достижения условия if на следующей строке.) Здесь приведен пример одноэлементного класса, который использует достижимость.

static NetworkManager* sharedInstance = nil;

@interface NetworkManager()
@property (nonatomic, strong) Reachability* reachability;
@end

@implementation NetworkManager
@synthesize reachability;

+ (NetworkManager*)sharedInstance
{
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [[NetworkManager alloc] init];
        }
    }
    return sharedInstance;
}

- (id)init
{
    reachability = [WYReachability reachabilityForInternetConnection];
}

- (BOOL)isNetworkReachable
{
    return ([self.reachability currentReachabilityStatus] != NotReachable);
}
@end

Чтобы проверить доступность сети в других классах, вы можете использовать.

[[NetworkManager sharedInstance] isNetworkReachable];

Ответ 6

Еще один полный ответ:

-(BOOL) isReachable:(NSString *)url
{
    //Retrieve the host name by given url address.
    NSString *hostName = [[NSURL URLWithString:url] host];
    Reachability *r = [Reachability reachabilityWithHostName:hostName];

    if(NotReachable == [r currentReachabilityStatus]) {
        NSLog(@"Not Reachable");
        return NO;
    }
    NSLog(@"Reachable");
    return YES;
}