2013-02-14 55 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