Постоянное обнаружение подключения к интернету


Я хочу, чтобы мое приложение автоматически обнаруживало потерю подключения к интернету. Поэтому я использую следующий код.

- (void)applicationDidBecomeActive:(UIApplication *)application {

    Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];
    if (networkStatus == NotReachable) {
        [Settings hideSpinner];
         //Show no internet connectivity dialog.
    } else {
    }
}
Но проблема в том, что он не проверяет подключение к Интернету постоянно. он проверяет только тогда, когда приложение стало активным. Как я могу постоянно проверять наличие подключения к интернету на протяжении всего жизненного цикла приложения и выдавать предупреждение, если интернет отключается автоматически?
6 3

6 ответов:

Добавьте obeserver, как это в методе достижимости.

1) [[NSNotificationCenter defaultCenter] addObserver: self selector:@selector (reachabilityChanged:) имя: kReachabilityChangedNotification объект: nil];

Он вызовет автоматически, когда ваше приложение открыто / в фоновом режиме, и вызовет reachabilityChanged.

2) [[NSNotificationCenter defaultCenter] postNotificationName:@ " ChangeInternetConnection" объект: ноль];

ChangeInternetConnection Вы должны добавить observer к вашему ViewController, чтобы получить статус при изменении состояния интернета.

 - (void) checkInternetConnetion {

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

        //NSString *remoteHostName = @"www.apple.com";


    self.internetReachability = [Reachability reachabilityForInternetConnection];
        [self.internetReachability startNotifier];
        [self updateInterfaceWithReachability:self.internetReachability];
    }


    #pragma mark - Reachability Methods

    - (void)updateInterfaceWithReachability:(Reachability *)reachability {
     if (reachability == self.internetReachability) {
            [self checkStatus:reachability];
        }

        if (reachability == self.wifiReachability) {
            [self checkStatus:reachability];
        }
    }


    -(void)checkStatus :(Reachability *)reachability {

        NetworkStatus netStatus = [reachability currentReachabilityStatus];
        BOOL connectionRequired = [reachability connectionRequired];
        NSString* statusString = @"";

        switch (netStatus) {

            case NotReachable: {

               self.isInternetOn = FALSE;

                break;
            }

            case ReachableViaWWAN: {
                self.isInternetOn = TRUE;

                break;
            }
            case ReachableViaWiFi: {
                self.isInternetOn = TRUE;

                break;
            }
        }



        [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeInternetConnection" object:nil];

      }

    - (void) reachabilityChanged:(NSNotification *)note {

        Reachability* curReach = [note object];
        NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
        [self updateInterfaceWithReachability:curReach];
    }

После запуска приложения вы можете запустить NSTimer, чтобы сделать то же самое:

- (void)applicationDidBecomeActive:(UIApplication *)application {
   NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                              target:self
                                            selector:@selector(checkForConnectivity)
                                            userInfo:nil
                                             repeats:YES];
}

-(void)checkForConnectivity {
       Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
       NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];
       if (networkStatus == NotReachable) {
              //No internet connectivity - perform required action
       }
       else {
              //Internet connectivity is valid
      }
}

Спасибо!

Таймер не является эффективным способом сделать это, но вы также можете использовать таймер тоже.

- (void)applicationDidBecomeActive:(UIApplication *)application 
{
       NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                                  target:self
                                                selector:@selector(handleConnectivity)
                                                userInfo:nil
                                                 repeats:YES];
}
-(void)handleConnectivity
{
    Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];
    if (networkStatus == NotReachable)
    {
        //No internet connectivity - perform required action
    }
    else
    {
        //Internet connectivity is valid
    }
}

Лучший способ-использовать код достижимости. проверьте здесь пример кода apple. , который имеет много удобных методов для проверки доступности интернета, проверки подключения Wi-Fi / WAN и т. д..

Например::-

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

reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];

- (void)networkChanged:(NSNotification *)notification
{

  NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

  if(remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
  else if (remoteHostStatus == ReachableViaWiFiNetwork) { NSLog(@"wifi"); }
  else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { NSLog(@"carrier"); }
}

Вы можете проверить это только в фоновом режиме

*аудио-приложение воспроизводит звуковой контент для пользователя в фоновом режиме. (Это содержание включает потоковое аудио или видеоконтент использование AirPlay.)

*местоположение-приложение держит пользователей в курсе их местоположения, даже когда оно работает в фоновом режиме.

*voip-приложение предоставляет пользователю возможность совершать телефонные звонки, используя подключение к интернету.

[2]}*newsstand-content-приложение представляет собой приложение для газетного киоска, которое загружает и обрабатывает содержимое журналов или газет в фоновом режиме.

*внешний-аксессуар-приложение работает с аппаратным обеспечением аксессуар, который должен доставлять обновления по регулярному расписанию через внешний Вспомогательный каркас.

*bluetooth-central-приложение работает с аксессуаром Bluetooth, который должен регулярно доставлять обновления через ядро Bluetooth. рамки.

*bluetooth-peripheral-приложение поддерживает связь Bluetooth в периферийном режиме через ядро Bluetooth framework.

Сначала импортируйте в свой класс: #import "Reachability.h"

Тогда сделайте так:

Добавить наблюдателя для уведомления об изменении достижимости

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


-(BOOL)reachabilityChanged:(NSNotification*)note
{
    BOOL status =YES;

    NSLog(@"reachabilityChanged");

    Reachability * reach = [note object];

    if([reach isReachable])
    {
        status = YES;

        NSLog(@"your network is Available");
    }

    else

    {
        status = NO;

//Do something here

    }
    return status;
}

Добавить наблюдателя.

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

-(BOOL)reachabilityChanged:(NSNotification*)note
{
    BOOL status =YES;
    NSLog(@"reachability is changed");

    Reachability * reach = [note object];

    if([reach isReachable])
    {
        status = YES;
        NSLog(@"NetWork is Available. Please go ahead");
    }
    else
    {
        status = NO;
        NSLog(@"NetWork is not Available. Please check your connection.");
    }
    return status;
}

Вы можете использовать Reachability framework из iOS и объединить его с NSTimer.