com.apple.system.config.network_change
これを行う1つの方法は、CoreFoundationDarwin通知センターからイベントをリッスンすることです。
イベントに登録する:
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;
// 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);
}
}
たとえば、Captive Network APIを使用して現在のSSIDを取得する方法については、別の回答へのリンクを参照してください。
私がこれをテストした電話はジェイルブレイクされていますが(iOS 6.1)、これが正しく機能するためにジェイルブレイクが必要だとは思わないことに注意してください。確かに、通常のサンドボックス領域の外にアプリをインストールする必要はありません(/var/mobile/Applications/*
)。
PS私はこれを徹底的にテストしていないので、このイベントが誤検知を引き起こすかどうかを知ることができません(ネットワーク変更の定義に基づく)。ただし、このイベントが発生するたびに、最後のネットワークのSSIDに等しい状態変数を格納し、それを現在のSSIDと比較するだけで十分に簡単です。