我正在使用Reachability類來檢測WiFi可用性。ip地址更改通知
有些情況下,ipad將連接到一個wifi網絡,並且用戶將連接到另一個可用的wifi網絡。
在這些網絡轉換期間,不會生成可達 - >不可達 - >可達的通知。
此連接更改ipad的ip地址發生變化的地方是我試圖監聽的內容。
是否存在本地wifi連接更改通知,或者我將不得不定期輪詢我的IP?
我正在使用Reachability類來檢測WiFi可用性。ip地址更改通知
有些情況下,ipad將連接到一個wifi網絡,並且用戶將連接到另一個可用的wifi網絡。
在這些網絡轉換期間,不會生成可達 - >不可達 - >可達的通知。
此連接更改ipad的ip地址發生變化的地方是我試圖監聽的內容。
是否存在本地wifi連接更改通知,或者我將不得不定期輪詢我的IP?
我個人只是經常查詢知識產權,但經常找到合適的(每秒一次應該沒問題),使用發現的代碼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
}
感謝您的詳細示例。這與我的投票實施非常接近。我一直無法找到像我感興趣的系統通知,所以我想我會在此期間繼續這樣做。 – dubbeat
我不認爲有一個系統級別的事件不是私有的。蘋果公司可能有我們的產品,但是,無論如何,寫出自己的產品很容易。 – MZimmerman6
感謝您的+1並接受 – MZimmerman6