11

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

4

3 回答 3

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 前,但应该不会有太大不同

于 2013-07-16T12:06:15.323 回答
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>

于 2015-04-10T18:49:22.890 回答
1

您需要SystemConfiguration,它具有查看各种网络更改通知的功能。特别是,您需要使用SCDynamicStoreSetNotificationKeys来侦听设备的更改,并使用SCNetworkConfiguration来获取有关可用接口的信息。

于 2013-12-11T01:46:01.933 回答