【问题标题】:iPhone notification when wifi network changeswifi网络更改时的iPhone通知
【发布时间】:2013-01-30 08:49:06
【问题描述】:

这是为了调整,所以目标是越狱设备,不是应用商店。 我尝试在SBWiFiManager 中挂接不同的方法,但它们要么在 wifi 强度变化(如此连续)时被调用,要么在网络变化后相当延迟后被调用。

有没有其他方法来获得通知(或其他方法来挂钩)wifi 网络发生变化?

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

【问题讨论】:

  • +1 用于编写越狱调整!

标签: iphone ios wifi jailbreak


【解决方案1】:

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)
}

在 init 上注册观察者并在 deinit 上删除。 不幸的是,没有关于具体更改内容的其他信息,但我们有机会测试当前的 SSID。 希望这对某人有帮助)

【讨论】:

  • 在我的情况下,当网络断开或连接时,通知会被多次调用。您是否也遇到过同样的问题?
  • @Dinesh,我也遇到了同样的“通知被多次调用”的问题。你找到解决方案了吗?是否可以可靠地限制在网络更改时仅调用一次通知?
  • @ShivaReddy 从未找到解决此问题的方法,现在不再对此进行调查。
  • 作为对代码的一点改进:您可以直接使用 中定义的 kNotifySCNetworkChange 常量,而不是直接使用“com.apple.system.config.network_change”。
【解决方案2】:

一种方法是监听来自 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);
    }
}

例如,请参阅my link to another answer,了解如何使用 Captive Network API 获取当前 SSID。

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

附:我没有对此进行足够详尽的测试,无法知道此事件是否会产生任何误报(基于您对网络更改的定义)。然而,只要存储一些状态变量就足够简单了,等于最后一个网络的 SSID,并在此事件发生时将其与当前的比较。

【讨论】:

  • 谢谢!!! (顺便说一句,我刚刚提到越狱是为了阻止人们说它会被 AppStore 拒绝)。出于好奇,您是如何找到通知名称的?
  • @Jonathan,您能否提出一个新问题,询问用于确定使用哪些通知的一般技术?我问,不仅仅是因为我想挤出更多的代表点,而是因为(a)我无法在评论中给出答案,并且(b)如果问题有适当的标题、标记和描述。评论不仅仅适用于简短的回复。您当然可以链接到这个问题,作为使用这些技术的原因之一的具体示例。
  • "com.apple.system.config.network_change" 经常通知四次。为什么?你有什么想法来检查或合并一个吗?谢谢。
  • 是的,看起来我们可以保存一些像 bssid 这样的状态。但是,当每次都发生重复通知时,我们总是得到 null bssid。奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多