這是爲調整,所以目標是越獄設備,而不是的應用程序商店。 我試過在SBWiFiManager
上掛鉤不同的方法,但是當wifi強度改變(如此連續)或者在網絡改變後相當延遲之後它們被調用。iPhone通知當wifi網絡變化
是否有任何其他方式獲取通知(或其他方法來掛鉤)去了WiFi網絡的變化?
我知道你現在可以使用公共API獲取當前的SSID,但是當它發生變化時我需要被告知。
這是爲調整,所以目標是越獄設備,而不是的應用程序商店。 我試過在SBWiFiManager
上掛鉤不同的方法,但是當wifi強度改變(如此連續)或者在網絡改變後相當延遲之後它們被調用。iPhone通知當wifi網絡變化
是否有任何其他方式獲取通知(或其他方法來掛鉤)去了WiFi網絡的變化?
我知道你現在可以使用公共API獲取當前的SSID,但是當它發生變化時我需要被告知。
執行此操作的一種方法是偵聽來自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)並將其與當前的狀態變量進行比較就足夠簡單了,只要此事件進來即可。
謝謝! (順便說一下,我只是把越獄做的一點就是阻止人們說它會被AppStore拒絕)。出於好奇,你是如何找到通知的名稱的? – 2013-02-15 11:12:08
@Jonathan,你可以問一個新的問題,詢問用於確定使用哪些通知的一般技術?我問,不僅僅是因爲我想剔除更多的代表點,而是因爲(a)我無法在評論中找到答案,並且(b)對於其他人更有用(和可搜索)問題被恰當地標題,標記和描述。評論不僅僅是簡短的迴應。你當然可以把這個問題作爲一個特定的例子來鏈接到這個問題上。 – Nate 2013-02-15 19:26:28
用於編寫越獄調整的+1! – Anil 2013-02-15 09:03:35