2013-08-22 193 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