这是一个好办法 ,这样的目标是越狱的设备,而不是应用程序商店。 我试图钩住在不同的方法SBWiFiManager
但是当WiFi强度变化(这样连续地)或相当的延迟之后,网络已经改变之后,他们要么被调用。
是否有任何其他方式来获得通知(或挂钩另一种方法)去了WiFi网络的变化?
我知道你可以得到当前的SSID与公共API现在,但我需要发生变化时被告知。
这是一个好办法 ,这样的目标是越狱的设备,而不是应用程序商店。 我试图钩住在不同的方法SBWiFiManager
但是当WiFi强度变化(这样连续地)或相当的延迟之后,网络已经改变之后,他们要么被调用。
是否有任何其他方式来获得通知(或挂钩另一种方法)去了WiFi网络的变化?
我知道你可以得到当前的SSID与公共API现在,但我需要发生变化时被告知。
要做到这一点的方法之一是监听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,例如。
需要注意的是,虽然我测试这对手机是越狱(的iOS 6.1),我不认为这需要越狱才能正常工作。 这当然并不需要正常的沙箱区域(外面正在安装的应用程序/var/mobile/Applications/*
)。
PS我没有测试过这种详尽足以知道这个事件是否提供任何误报 (根据您的网络改变中的定义)。 然而,这是很简单只是存储一些状态变量,等于最后一个网络的SSID,和比较,当前的一个,每当这个事件的用武之地。
SWIFT 4.1版本
我已经延长我的可达性类此功能:
let notificationName = "com.apple.system.config.network_change"
func onNetworkChange(_ name : String) {
if (name == notificationName) {
// Do your stuff
print("Network was changed")
}
}
func registerObserver() {
let observer = UnsafeRawPointer(Unmanaged.passUnretained(self).toOpaque())
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), observer,
{ (nc, observer, name, _, _) -> Swift.Void in
if let observer = observer, let name = name {
let instance = Unmanaged<Reachability>.fromOpaque(observer).takeUnretainedValue()
instance.onNetworkChange(name.rawValue as String)
} },
notificationName as CFString, nil, .deliverImmediately)
}
func removeObserver() {
let observer = UnsafeRawPointer(Unmanaged.passUnretained(self).toOpaque())
CFNotificationCenterRemoveObserver(CFNotificationCenterGetDarwinNotifyCenter(), observer, nil, nil)
}
在初始化注册观察者和删除DEINIT。 不幸的是,关于究竟是什么改变没有额外的信息,但我们需要一个机会来测试当前的SSID为例。 希望这能对别人有帮助)