Захват события изменения сети Wi-Fi в iOS

Есть ли способ захвата события, когда пользователь подключается к определенной сети WiFi в приложении iOS. Это прекрасно, даже если это может быть достигнуто с использованием любой частной библиотеки, которая не требует привилегий суперпользователя (перерыв в тюрьме). Я просто хочу захватить событие изменения подключенного SSID.

Ответ 1

Я бы рекомендовал просто использовать то, что опубликовал Larme, и настроить NSTimer для проверки каждую секунду или около того, что SSID вашей текущей сети, если вы обнаружите изменение, просто делайте все, что вам нужно. Имейте в виду, что изменение сетей Wi-Fi не является чем-то, что происходит мгновенно, поэтому с 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;
}

Что-то вроде этого. Я не могу проверить, свободен ли код, поскольку у меня нет макроса, но он не должен быть слишком разным

Ответ 2

Вы можете получить информацию из своего Wi-Fi соединения:

- (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>

Ответ 3

Вы хотите SystemConfiguration, которая имеет средства для просмотра уведомлений о всех видах сетевых изменений. В частности, вы захотите использовать SCDynamicStoreSetNotificationKeys для прослушивания изменений в устройствах и SCNetworkConfiguration для получения информации о доступных интерфейсах.