2013-08-22 37 views
3

我正在使用Reachability类来检测WiFi可用性。ip地址更改通知

有些情况下,ipad将连接到一个wifi网络,并且用户将连接到另一个可用的wifi网络。

在这些网络转换期间,不会生成可达 - >不可达 - >可达的通知。

此连接更改ipad的ip地址发生变化的地方是我试图监听的内容。

是否存在本地wifi连接更改通知,或者我将不得不定期轮询我的IP?

回答

5

我个人只是经常查询知识产权,但经常找到合适的(每秒一次应该没问题),使用发现的代码here,并且只保存以前发生的结果,看看它是否发生了变化。

我真正推荐的是设置一个简单的委托类,为您做这个,并将自定义事件发送到任何可能需要这些更新的类。它应该是相当直接的,特别是考虑到你似乎有一些经验。

UPDATE

我已张贴下面是一些代码将创建一个委托,将回调到什么类,一旦检测到IP的任何变化。请注意,可能存在一些错误/拼写错误,因为我目前不在XCode的计算机前,但您应该了解一般想法。

IPChangeNotifier.h

#import <UIKit/UIKit.h> 

@protocol IPChangeNotifierDelegate; 

@interface IPChangeNotifier : NSObject { 
    NSString *prevIP; 
    NSTimer *changeTimer; 
    id changeDelegate; 
} 
-(id) initWithTimer:(float)time andDelegate:(id)del; 
-(NSString*)getIPAddress; 
-(void) checkForChange; 
@end 

@protocol IPChangeNotifierDelegate <NSObject> 
@optional 
-(void) IPChangeDetected:(NSString*)newIP previousIP:(NSString*)oldIP; 
@end 

IPChangeNotifier.m

#import IPChangeNotifier.h 
#import <ifaddrs.h> 
#import <arpa/inet.h> 
@implementation IPChangeNotifier 

-(id) initWithTimer:(float)time andDelegate:(id)del { 
    changeTimer = [NSTimer scheduleTimerWithTimeInterval:time target:self selector:@selector(checkForChange) userInfo:nil repeats:YES]; 
    prevIP = @""; 
    changeDelegate = del; 
} 

-(void) checkForChange { 
    NSString *currentIP = [self getIPAddress]; 
    if (![currentIP isEqualToString:prevIP]) { 
     if ([changeDelegate respondsToSelector:@selector(IPChangeDetected:)]){ 
      [changeDelegate IPChangeDetected:currentIP previousIP:prevIP];  
     } 
     prevIP = currentIP; 
    } 
} 

- (NSString *)getIPAddress {  
    struct ifaddrs *interfaces = NULL; 
    struct ifaddrs *temp_addr = NULL; 
    NSString *wifiAddress = nil; 
    NSString *cellAddress = nil; 

    // retrieve the current interfaces - returns 0 on success 
    if(!getifaddrs(&interfaces)) { 
     // Loop through linked list of interfaces 
     temp_addr = interfaces; 
     while(temp_addr != NULL) { 
      sa_family_t sa_type = temp_addr->ifa_addr->sa_family; 
      if(sa_type == AF_INET || sa_type == AF_INET6) { 
       NSString *name = [NSString stringWithUTF8String:temp_addr->ifa_name]; 
       NSString *addr = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; // pdp_ip0  
       NSLog(@"NAME: \"%@\" addr: %@", name, addr); // see for yourself 

       if([name isEqualToString:@"en0"]) { 
        // Interface is the wifi connection on the iPhone 
        wifiAddress = addr;  
       } else 
       if([name isEqualToString:@"pdp_ip0"]) { 
        // Interface is the cell connection on the iPhone 
        cellAddress = addr;  
       } 
      } 
      temp_addr = temp_addr->ifa_next; 
     } 
     // Free memory 
     freeifaddrs(interfaces); 
    } 
    NSString *addr = wifiAddress ? wifiAddress : cellAddress; 
    return addr ? addr : @"0.0.0.0"; 
} 
@end 

然后,您可以简单地让你想委托任何类加入<IPChangeNotifierDelegate>到您的接口文件,然后初始化通过做一些简单的事情,如下所示。

IPChangeNotifier *ipChecker = [[IPChangeNotifier alloc] initWithTimer:1.0 andDelegate:self] 

另外,还要确保你已经包括下面的方法,以确保你可以得到改变的事件,做任何你需要的。

-(void) IPChangeDetected:(NSString*)newIP previousIP:(NSString*)oldIP { 
    // Do what you need 
} 
+0

感谢您的详细示例。这与我的投票实施非常接近。我一直无法找到像我感兴趣的系统通知,所以我想我会在此期间继续这样做。 – dubbeat

+0

我不认为有一个系统级别的事件不是私有的。苹果公司可能有我们的产品,但是,无论如何,写出自己的产品很容易。 – MZimmerman6

+0

感谢您的+1并接受 – MZimmerman6