gpt4 book ai didi

ios6 - IP地址变更通知

转载 作者:行者123 更新时间:2023-12-02 07:59:44 25 4
gpt4 key购买 nike

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

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

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

我试图监听的是 ipad 的 IP 地址发生变化的连接变化。

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

最佳答案

我个人会使用发现的代码 here 来轮询 IP,无论您认为合适的频率如何(一秒钟一次就可以了)。 ,然后存储之前出现的结果,看看它是否发生变化。

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

更新

我在下面发布了一些代码,这些代码将创建一个委托(delegate),一旦检测到 IP 发生任何变化,该委托(delegate)就会回调到任何类。请注意,由于我当前不在使用 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> 来简单地创建您想要委托(delegate)的任何类。添加到您的界面文件,然后通过执行如下简单操作来初始化通知程序。

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

还要确保您包含以下方法,以确保您可以获得更改事件并执行您需要的任何操作。

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

关于ios6 - IP地址变更通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18378441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com