一个方法是监听来自核心基础达尔文通知中心的com.apple.system.config.network_change
事件。
注册该事件:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
NULL, // observer
onNotifyCallback, // callback
CFSTR("com.apple.system.config.network_change"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
这是一个示例回调函数:
static void onNotifyCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
NSString* notifyName = (NSString*)name;
if ([notifyName isEqualToString:@"com.apple.system.config.network_change"]) {
} else {
NSLog(@"intercepted %@", notifyName);
}
}
请参见我的另一个答案的链接,了解如何使用Captive Network API获取当前SSID。
请注意,尽管我测试的手机已越狱(iOS 6.1),但我认为这不需要越狱即可正常工作。它当然不需要在正常沙盒区域之外安装应用程序(/var/mobile/Applications/*
)。
附言:我没有进行充分的测试,无法确定此事件是否会出现任何误报(基于您对网络更改的定义)。不过,只需存储一些状态变量,等于上一个网络的SSID,并在接收到此事件时将其与当前SSID进行比较即可。