iPhone通知时,wifi网络的变化(iPhone notification when wifi

2019-07-19 21:44发布

这是一个好办法 ,这样的目标是越狱的设备,而不是应用程序商店。 我试图钩住在不同的方法SBWiFiManager但是当WiFi强度变化(这样连续地)或相当的延迟之后,网络已经改变之后,他们要么被调用。

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

我知道你可以得到当前的SSID与公共API现在,但我需要发生变化时被告知。

Answer 1:

要做到这一点的方法之一是监听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,和比较,当前的一个,每当这个事件的用武之地。



Answer 2:

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为例。 希望这能对别人有帮助)



文章来源: iPhone notification when wifi network changes