可达性类在iOS中不起作用

时间:2012-05-28 20:24:53

标签: objective-c ios reachability

我已经实施了Reachability Api 2.2。当网络从关闭状态进入开启状态时,它不会触发。

另外,我可以在app委托中实现它吗?如果是这样,我应该在哪里删除观察者?

这是我的代码(不调用dismiss模型viewController)

- (void)viewDidLoad
{
    // check for internet connection
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

     internetReachable = [[Reachability reachabilityForInternetConnection] retain] ;
    [internetReachable startNotifier];
    // check if a pathway to a random host exists
    hostReachable = [[Reachability reachabilityWithHostName: @"www.google.com"] retain];
    [hostReachable startNotifier];
 }

- (void) checkNetworkStatus:(NSNotification *)notice
{
    // called after network status changes

    NetworkStatus hoststatus=[hostReachable currentReachabilityStatus];

    NetworkStatus internetStatus=[internetReachable currentReachabilityStatus];

    for (NSString *msg  in messageArray) {
        [stringg appendString:[NSString stringWithFormat:@"%@",msg]]; 
    }

    if  (hoststatus==NotReachable||internetStatus==NotReachable) {
        [self.navigationController presentModalViewController:inter animated:YES];
    }
    else{
        [self dismissModalViewControllerAnimated:YES];
    }

    [inter release];
} 



- (void)viewDidUnload
{

    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super viewDidUnload];
}

2 个答案:

答案 0 :(得分:1)

您在哪里注册通知?

你需要这样的东西:

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

我使用作为参数传递的可达性对象,如下所示:

- (void) reachabilityChange: (NSNotification*) notification
{
    Reachability* curReach = [notification object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    BOOL isServerCurrentlyReachable = (NotReachable != [curReach currentReachabilityStatus]);
    BOOL wasServerPreviouslyReachable = self.isServerReachable;
    self.isServerReachable = isServerCurrentlyReachable;

    if (NO == wasServerPreviouslyReachable && YES == isServerCurrentlyReachable)
    {
        // Moving from non reachable to reachable state

    }
    else if (YES == wasServerPreviouslyReachable && NO == isServerCurrentlyReachable)
    {
        // Moving from a reachable to a non reachable state

    }
}

你似乎没有使用它。

此外,通知可以多次以相同的状态调用,因此您需要确保将其记录在内,就像在代码段中所做的那样。

如果你在app delegate中使用它,停止/删除applicationDidResignActive中的东西似乎是合适的地方。

答案 1 :(得分:0)

将开发者apple中的Reachability.h和Reachability.m文件包含到您的项目中。从SDK库到项目导入SystemConfiguration框架。然后将以下GlobalFunction.h和GlobalFunction.m文件添加到项目中

//GlobalFunction.h


#import <Foundation/Foundation.h>

@class Reachability;

@interface GlobalFunction  :  NSObject
{
Boolean internetActive;
Boolean hostActive;

Reachability * internetReachable;
Reachability * hostReachable;
Reachability * wifiReach;

}

@property (readwrite,assign) Boolean internetActive;
@property (readwrite,assign) Boolean hostActive;

 - (Boolean) checkNetworkStatus;
 - (BOOL)connectedToNetwork;
 @end


 //GlobalFunction.m

 #import "GlobalFunction.h"
 #import "Reachability.h"
 #include <netinet/in.h>
 #import <SystemConfiguration/SCNetworkReachability.h>

 @implementation GlobalFunction

  @synthesize  internetActive,hostActive;
  - (id)init
   {
 self = [super init];
  if (self) {
 // Initialization code here.
     }

 return self;
 }



 //  Checking Internet Connectivity
 - (Boolean) checkNetworkStatus//:(NSNotification *)notice
  {
 // called after network status changes
  internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [internetReachable startNotifier];

   // check if a pathway to a random host exists
  hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
     [hostReachable startNotifier];

   NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
  switch (internetStatus)
 {
case NotReachable:
{
    //NSLog(@"The internet is down.");
    //[self ShowMsg:@"The internet connection appears to be offline."];
    self.internetActive = NO;
    break;

}
case ReachableViaWiFi:
{
    //NSLog(@"The internet is working via WIFI.");
    self.internetActive = YES;

    break;

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

    break;

}
default :
    self.internetActive = YES;
    break;

 }

 NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
 switch (hostStatus)

  {
 case NotReachable:
 {
    //NSLog(@"A gateway to the host server is down.");
    self.hostActive = NO;

    break;

}
case ReachableViaWiFi:
{
    //NSLog(@"A gateway to the host server is working via WIFI.");
    self.hostActive = YES;

    break;

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

    break;

  }
 }

  [hostReachable release];
  [internetReachable release];

 return self.internetActive;
  }



  - (BOOL)connectedToNetwork
 {
  // Create zero addy
  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)
    {
//NSLog(@"Error. Could not recover network reachability flags");
return 0;
    }
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    //below suggested by Ariel
    BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
    NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
   //comment by friendlydeveloper: maybe use www.google.com
  NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
  //NSURLConnection *testConnection = [[NSURLConnection alloc]     initWithRequest:testRequest delegate:nil]; //suggested by Ariel
   NSURLConnection *testConnection = [[[NSURLConnection alloc] initWithRequest:testRequest delegate:nil] autorelease];
 //modified by friendlydeveloper
   return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;

  }

-(void)dealloc 
{
internetReachable=nil;
hostReachable=nil;
 wifiReach=nil;

[super dealloc];
}

@end




  ------>Just write the code for checking internet connection
 #import<GlobalFunction.m>

-(void)viewDidLoad
   {
   if([globalFunc checkNetworkStatus])
 {
[self ShowAlert:@"Internet Connection appears"];
  }
 else
 {
[self ShowAlert:@"The Internet connection appears to be offline.."];
 }
 }