IP地址更改通知

时间:2013-08-22 10:52:50

标签: ios6 reachability

我正在使用Reachability类来检测wifi可用性。

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

在这些网络转换期间,无法生成可访问的>无法访问 - >可访问的通知。

这个连接改变了ipad的ip地址改变的地方,我试图听。

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

1 个答案:

答案 0 :(得分:5)

我个人只会轮询IP,但是经常你会找到合适的(每秒一次应该没问题),使用找到的代码here,然后只存储先前出现的结果,看看它是否有变化。

我真正建议的是设置一个简单的委托类来为您执行此操作,并将自定义事件发送到可能需要这些更新的任何类。这应该是非常直接的,特别是考虑到你似乎有一些经验。

<强>更新

我在下面发布了一些代码,它会创建一个委托,一旦检测到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
}