我已经实施了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];
}
答案 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.."];
}
}