ऐसा करने का एक तरीका कोर फाउंडेशन डार्विन अधिसूचना केंद्र से com.apple.system.config.network_change
ईवेंट सुनना है। घटना के लिए
रजिस्टर:
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);
}
}
कैसे कैप्टिव नेटवर्क एपीआई का उपयोग करने उदाहरण के लिए, वर्तमान SSID पाने के लिए पर my link to another answer देखें:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
NULL, // observer
onNotifyCallback, // callback
CFSTR("com.apple.system.config.network_change"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
यहां नमूने कॉलबैक है।
ध्यान दें कि यद्यपि मैंने जिस फोन पर इसका परीक्षण किया है वह जेलब्रोकन (आईओएस 6.1) है, मुझे नहीं लगता कि इसे सही तरीके से काम करने के लिए जेलब्रैकिंग की आवश्यकता है। यह निश्चित रूप से सामान्य सैंडबॉक्स क्षेत्र (/var/mobile/Applications/*
) के बाहर स्थापित होने की आवश्यकता नहीं है।
पीएस मैंने यह जानने के लिए पर्याप्त रूप से पर्याप्त परीक्षण नहीं किया है कि यह घटना झूठी सकारात्मक (नेटवर्क परिवर्तन की आपकी परिभाषा के आधार पर) देती है या नहीं। हालांकि, यह केवल कुछ राज्य वैरिएबल को स्टोर करने के लिए पर्याप्त है, जो पिछले नेटवर्क के एसएसआईडी के बराबर है, और जब भी यह घटना आती है, तो वर्तमान की तुलना करें।
+1 एक जेल्रैक ट्विक लिखने के लिए +1! – Anil