Итак, чтобы подвести итог, я наконец-то приступил к изучению API конфигурации системы.Как всегда, когда вы знаете, как это не так сложно.
@ 0xced - Спасибо, что указали мне в правильном направлении.Я бы одобрил ваш ответ, но у меня недостаточно репутации, чтобы сделать это.
Это мое решение для всех, кто интересуется или находится в такой же ситуации.Это связано с копанием в динамическом магазине.См. this для получения информации об API.Вы можете просмотреть информацию, которую хранит динамическое хранилище, используя утилиту командной строки scutil (см. X-man-page: // 8 / scutil).
Вот мои шаги.Во-первых, вам нужен сеанс:
SCDynamicStoreRef storeRef = SCDynamicStoreCreate(NULL, (CFStringRef)@"FindCurrentInterfaceIpMac", NULL, NULL);
Затем я пытаюсь получить основной интерфейс (например, en1):
CFPropertyListRef global = SCDynamicStoreCopyValue (storeRef,CFSTR("State:/Network/Global/IPv4"));
NSString *primaryInterface = [(__bridge NSDictionary *)global valueForKey:@"PrimaryInterface"];
Наконец, я строю строку, содержащую интерфейсчтобы иметь возможность запросить правильный ключ.Это должно выглядеть примерно так: State: / Network / Interface / en1 / IPv4, в зависимости от интерфейса, конечно.При этом я могу получить массив с IP и сетевой маской.На моем MacBook эти массивы содержат только один ip и маску соответственно.Я полагаю, что это может отличаться для других компьютеров Mac, я должен это проверить.Для моего теста я просто взял первый (и единственный) элемент в массиве, но там нужно было бы выполнить какую-то проверку размера.
NSString *interfaceState = [NSString stringWithFormat:@"State:/Network/Interface/%@/IPv4", primaryInterface];
CFPropertyListRef ipv4 = SCDynamicStoreCopyValue (storeRef, (CFStringRef)interfaceState);
CFRelease(storeRef);
NSString *ip = [(__bridge NSDictionary *)ipv4 valueForKey:@"Addresses"][0];
NSString *netmask = [(__bridge NSDictionary *)ipv4 valueForKey:@"SubnetMasks"][0];
CFRelease(ipv4);
Это только для тестирования, так что этонемного грубо по краям.Вам придется искать счетчики и тому подобное.Он был написан только для того, чтобы понять, как это можно сделать.