Jednym ze sposobów jest wysłuchanie zdarzenia com.apple.system.config.network_change
z centrum informacyjnego Core Foundation Darwin.
Rejestracja na wydarzenie:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
NULL, // observer
onNotifyCallback, // callback
CFSTR("com.apple.system.config.network_change"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
Oto próbka zwrotna:
static void onNotifyCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
NSString* notifyName = (NSString*)name;
// this check should really only be necessary if you reuse this one callback method
// for multiple Darwin notification events
if ([notifyName isEqualToString:@"com.apple.system.config.network_change"]) {
// use the Captive Network API to get more information at this point
// https://stackoverflow.com/a/4714842/119114
} else {
NSLog(@"intercepted %@", notifyName);
}
}
Zobacz my link to another answer na temat korzystania z interfejsu API Captive sieciowego, aby uzyskać aktualny identyfikator SSID, na przykład.
Należy pamiętać, że chociaż telefon, który przetestowałem to jest jailbreak (iOS 6.1), nie sądzę, że wymaga to jailbreaking do prawidłowego działania. Z pewnością nie wymaga instalacji aplikacji poza normalnym obszarem piaskownicy (/var/mobile/Applications/*
).
P.S. Nie przetestowałem tego wystarczająco szczegółowo, aby wiedzieć, czy to zdarzenie daje jakieś fałszywe alarmy (w oparciu o twoją definicję zmiany sieci). Jest to jednak dość proste, aby zapisać pewną zmienną stanu, równą identyfikatorowi SSID ostatniej sieci i porównać ją z bieżącą, kiedy tylko to zdarzenie nastąpi.
+1 za napisanie poprawki jailbreak! – Anil