2013-02-14 88 views
8

这是为调整,所以目标是越狱设备,而不是的应用程序商店。 我试过在SBWiFiManager上挂钩不同的方法,但是当wifi强度改变(如此连续)或者在网络改变后相当延迟之后它们被调用。iPhone通知当wifi网络变化

是否有任何其他方式获取通知(或其他方法来挂钩)去了WiFi网络的变化?

我知道你现在可以使用公共API获取当前的SSID,但是当它发生变化时我需要被告知。

+0

用于编写越狱调整的+1! – Anil 2013-02-15 09:03:35

回答

14

执行此操作的一种方法是侦听来自Core Foundation Darwin通知中心的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; 
    // 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); 
    } 
} 

参见如何使用圈养网络API来获取当前的SSID,例如my link to another answer

请注意,虽然我测试过的手机已经越狱(iOS 6.1),但我不认为这需要越狱才能正常工作。它当然不需要将应用程序安装在常规沙箱区域之外(/var/mobile/Applications/*)。

P.S.我没有足够详尽地测试这个事件是否给出误报(根据你对网络变化的定义)。但是,只要存储一些状态变量(等于最后一个网络的SSID)并将其与当前的状态变量进行比较就足够简单了,只要此事件进来即可。

+0

谢谢! (顺便说一下,我只是把越狱做的一点就是阻止人们说它会被AppStore拒绝)。出于好奇,你是如何找到通知的名称的? – 2013-02-15 11:12:08

+3

@Jonathan,你可以问一个新的问题,询问用于确定使用哪些通知的一般技术?我问,不仅仅是因为我想剔除更多的代表点,而是因为(a)我无法在评论中找到答案,并且(b)对于其他人更有用(和可搜索)问题被恰当地标题,标记和描述。评论不仅仅是简短的回应。你当然可以把这个问题作为一个特定的例子来链接到这个问题上。 – Nate 2013-02-15 19:26:28