在iOS中捕获Wi-Fi网络更改事件

时间:2013-07-15 10:49:24

标签: ios objective-c ios5 ios6

当用户连接到iOS应用中的特定WiFi网络时,是否有任何方法可以捕获事件。即使可以使用任何不需要超级用户权限(越狱)的私有库来实现这一点也很好。我只想捕获连接的SSID的变化事件。

3 个答案:

答案 0 :(得分:6)

我建议只使用Larme发布的内容,并设置NSTimer来检查每一秒左右,当前网络的SSID是什么,如果您检测到更改,只需执行您需要做的任何事情。请记住,改变WiFi网络不是即时发生的事情,因此具有1秒的分辨率并不错

applicationDidFinishLoading

NSTimer *ssidTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fetchSSIDInfo) userInfo:nil repeats:YES];

在AppDelegate

- (id)fetchSSIDInfo {
     NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
     NSLog(@"Supported interfaces: %@", ifs);
     id info = nil;
     NSString *ifnam = @"";
     for (ifnam in ifs) {
         info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
         NSLog(@"%@ => %@", ifnam, info);
         if (info && [info count]) { break; }
     }
     if ([info count] >= 1 && [ifnam caseInsensitiveCompare:prevSSID] !=  NSOrderedSame) {
          // Trigger some event
          prevSSID = ifnam;
     }

     return info;
}

这样的事情。我无法检查代码是否没有拼写错误,因为我不在mac前面,但它不应该太差异

答案 1 :(得分:2)

您可以从wifi连接中获取详细信息:

- (NSDictionary *)getConnectionDetails
{
    NSDictionary *connectionDetails = [NSDictionary dictionary];
    CFArrayRef myArray = CNCopySupportedInterfaces();
    if (myArray) {
        CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));
        connectionDetails = (__bridge_transfer NSDictionary*)myDict;
    }
    return connectionDetails;
}

然后,如果检查[connectionDetails valueForKey:@"BSSID"],您将获得BSSID。

另请注意,您必须导入#import <SystemConfiguration/CaptiveNetwork.h>

答案 2 :(得分:1)

您需要SystemConfiguration,它具有查看各种网络更改通知的功能。