3

我已经实现了可达性 API 2.2。当网络从关闭状态变为开启状态时,它不会触发。

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

这是我的代码(不调用解除模型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];
}
4

2 回答 2

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

    }
}

你似乎没有使用它。

此外,通知可能会以相同的状态被多次调用,因此您需要确保考虑到这一点,就像在代码段中所做的那样。

如果您在应用程序委托中使用它,则停止/删除 applicationDidResignActive 中的内容似乎是合适的地方。

于 2012-05-28T22:27:08.550 回答
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.."];
 }
 }
于 2013-01-22T08:57:29.650 回答