Постоянное обнаружение подключения к интернету
Я хочу, чтобы мое приложение автоматически обнаруживало потерю подключения к интернету. Поэтому я использую следующий код.
- (void)applicationDidBecomeActive:(UIApplication *)application {
Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];
if (networkStatus == NotReachable) {
[Settings hideSpinner];
//Show no internet connectivity dialog.
} else {
}
}
Но проблема в том, что он не проверяет подключение к Интернету постоянно.
он проверяет только тогда, когда приложение стало активным. Как я могу постоянно проверять наличие подключения к интернету на протяжении всего жизненного цикла приложения и выдавать предупреждение, если интернет отключается автоматически?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; }