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, но ни один из них не работал должным образом.
- Поскольку я просто вытаскиваю список сетевых профилей в изменяемый массив, его легко адаптировать к любой произвольной сортировке и т. Д.