Вот как я это сделал:
- Получите Readability.h / m из примеров проектов Apple и поместите его в свой проект
- Установите NetworkObserver.h / m ниже
- Когда приложение запускается в ["AppDelegate" didFinishLaunchingWithOptions], запускается NetworkObserver с [ [NetworkObserver currentObserver] start]
- Когда приложение переходит в фоновый режим (applicationDidEnterBackground), останавливайте его, а когда оно выходит на передний план (applicationWillEnterForeground), затем запускайте его снова
- Если вам нужно проверить это, используйте этот код:
Код о том, как его использовать:
NetworkObserver *observer = [NetworkObserver currentNetworkObserver];
if( observer.internetActive && observer.hostActive ) {
// Do whatever you need to do with the Network
} else {
if( !observer.internetActive ) {
if( anError ) {
*anError = [NSError errorWithDomain:NetworkErrorDomain code:1212 userInfo:[NSDictionary dictionaryWithObject:@"Internet is not active at the moment" forKey:NSLocalizedDescriptionKey]];
}
} else {
if( anError ) {
*anError = [NSError errorWithDomain:NetworkErrorDomain code:1221 userInfo:[NSDictionary dictionaryWithObject:@"Host is cannot be reached" forKey:NSLocalizedDescriptionKey]];
}
}
}
Сначала вот код для NetworkObserver.h
#import <Foundation/Foundation.h>
@class Reachability;
@interface NetworkObserver : NSObject {
@private
BOOL internetActive;
BOOL hostActive;
Reachability* internetReachable;
Reachability* hostReachable;
}
@property (nonatomic) BOOL internetActive;
@property (nonatomic) BOOL hostActive;
@property (nonatomic, retain) Reachability* internetReachable;
@property (nonatomic, retain) Reachability* hostReachable;
// Checks the current Network Status
- (void) checkNetworkStatus:(NSNotification *)notice;
- (void) start;
- (void) stop;
+ (NetworkObserver *) currentNetworkObserver;
@end
Наконец код для NetworkObserver.m:
#import "NetworkObserver.h"
#import "Reachability.h"
#import "Constants.h"
static NetworkObserver *networkObserver;
@implementation NetworkObserver
@synthesize internetReachable, hostReachable;
@synthesize internetActive, hostActive;
+(void) initialize {
if( !networkObserver ) {
networkObserver = [[NetworkObserver alloc] init];
}
}
+ (NetworkObserver *) currentNetworkObserver {
return networkObserver;
}
- (id) init {
self = [super init];
if( self ) {
self.internetReachable = [[Reachability reachabilityForInternetConnection] retain];
// check if a pathway to a random host exists
DLog( @"NO.init(), host name: %@", kServerHostName );
self.hostReachable = [[Reachability reachabilityWithHostName:kServerHostName] retain];
}
return self;
}
- (void) start {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];
[internetReachable startNotifier];
[hostReachable startNotifier];
[self checkNetworkStatus:nil];
}
- (void) stop {
[internetReachable stopNotifier];
[hostReachable stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void) checkNetworkStatus:(NSNotification *)notice
{
// called after network status changes
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
case NotReachable:
{
DLog(@"The internet is down.");
self.internetActive = NO;
break;
}
case ReachableViaWiFi:
{
DLog(@"The internet is working via WIFI.");
self.internetActive = YES;
break;
}
case ReachableViaWWAN:
{
DLog(@"The internet is working via WWAN.");
self.internetActive = YES;
break;
}
}
if( notice ) {
NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
switch (hostStatus)
{
case NotReachable:
{
DLog(@"A gateway to the host server is down.");
self.hostActive = NO;
break;
}
case ReachableViaWiFi:
{
DLog(@"A gateway to the host server is working via WIFI.");
self.hostActive = YES;
break;
}
case ReachableViaWWAN:
{
DLog(@"A gateway to the host server is working via WWAN.");
self.hostActive = YES;
break;
}
}
} else {
DLog(@"No notice received yet so assume it works");
self.hostActive = YES;
}
}
@end
Кстати, просто замените DLog на NSLog, чтобы он работал (я использую эту инструкцию препроцессора, чтобы вывести NSLog, когда я выпускаю приложение).
С другой стороны, на Stack OverFlow есть много других других постов, посвященных этой проблеме, например .
Также обратите внимание, что NetworkObserver требуется немного времени, чтобы получить правильные значения, поэтому вы не сможете использовать его при запуске.