Mac OS X 10.10 Изменение порядка предпочтительных сетей

Каков наилучший способ программно изменить порядок "предпочтительных" сетей в OS X? Objective-C предпочтительнее...

Я могу использовать CoreWLAN, чтобы собрать список и даже добавить к нему, но в отношении повторного заказа я в растерянности. Я могу создать копию файла настроек, отредактировать его и изменить порядок приоритетов, а затем использовать сценарий bash для перезаписи существующей конфигурации, но это выглядит довольно грязно.

Мне известна команда networksetup -addpreferredwirelessnetworkatindex, но она не работает правильно в 10.10 (работает нормально для систем 10.9) - добавляет, но не устанавливает порядок должным образом.

Фреймворк SystemConfiguration? Что-то другое?

Спасибо!

1 ответ

Решение

Я искал способ сделать это после перехода пользователя из открытой беспроводной сети в сеть WPA2E с использованием EAP-TTLS. Поскольку пользователь сначала подключается к открытой сети, он остается выше в списке " Предпочитаемые сети".

Вот что я придумал:

CWInterface *interface = [CWInterface interfaceWithName:[
    [CWInterface interfaceNames] anyObject]
];
CWMutableConfiguration *config = [CWMutableConfiguration
    configurationWithConfiguration:interface.configuration
];
NSMutableArray *networks = [NSMutableArray arrayWithArray:
    [config.networkProfiles array]
];

//Remove URI_Open (if present) and
//move URI_Secure (if present) to index 0
for (CWNetworkProfile *profile in [networks copy]) {
    if ([[profile ssid] isEqualToString:@"URI_Secure"]) {
        [networks removeObject:profile];
    } else if ([[profile ssid] isEqualToString:@"URI_Open"]) {
        CWNetworkProfile *tmp = profile;
        [networks removeObject:tmp];
        [networks insertObject:tmp atIndex:0];
    }
}

config.networkProfiles = [NSOrderedSet orderedSetWithArray:networks];

SFAuthorization *auth = [SFAuthorization authorization];
BOOL authResult = [auth obtainWithRight:"system.preferences"
    flags:(
        kAuthorizationFlagExtendRights |
        kAuthorizationFlagInteractionAllowed |
        kAuthorizationFlagPreAuthorize
     ) error:nil
];

NSError *error = nil;
[interface commitConfiguration:config authorization:auth error:&error];

Некоторые примечания / отказ от ответственности:

  • Я не пользуюсь OS X регулярно. У меня есть один тестовый Mac в моем офисе. Установлено 10.7.5.
  • Это первое, что я написал в Objective-C. Это результат одного дня; как таковой он, вероятно, сломан и безобразен. YMMV.
  • Вопрос уточнен 10.10. Я использовал interfaceWithName и interfaceNames, которые устарели в 10.10. Я не уверен, что правильная замена, но я подозреваю, что CWWifiClient.
  • Мой подход был основан на этой рубиновой программе.
  • Я убрал обработку ошибок для краткости.
  • Я изучал использование networksetup или удаление открытой сети прямо в.mobileconfig, но ни один из них не работал должным образом.
  • Поскольку я просто вытаскиваю список сетевых профилей в изменяемый массив, его легко адаптировать к любой произвольной сортировке и т. Д.
Другие вопросы по тегам