Mac OS X 10.10 重新排序首选网络

Mac OS X 10.10 Reorder preferred networks

以编程方式更改 OS X 中 "preferred" 网络顺序的最佳方法是什么? Objective-C 首选...

我可以使用 CoreWLAN 来收集列表,甚至可以添加到列表中,但就重新排序而言,我不知所措。我可以创建首选项文件的副本,编辑它并更改优先顺序,然后使用 bash 脚本覆盖现有配置,但这看起来很乱。

我知道 networksetup -addpreferredwirelessnetworkatindex 命令,但它在 10.10 中不能正常工作(在 10.9 系统中工作正常)- 它添加了但没有正确设置顺序。

系统配置框架?还有别的吗?

谢谢!

在使用 EAP-TTLS 将用户从开放无线网络转换到 WPA2E 网络后,我一直在寻找一种方法来实现这一点。由于用户首先连接到开放网络,因此它在 首选网络 列表中保持较高位置。

这是我想出的:

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];

一些notes/disclaimers:

  • 我不经常使用 OS X。我的办公室有一项测试 Mac。它已安装 10.7.5。
  • 这是我在Objective-C写的第一篇文章。这是一个下午的结果;因此它可能破损且丑陋。 YMMV.
  • 指定问题 10.10。我用了 interfaceWithName and interfaceNames, which are deprecated in 10.10. I am not sure what the proper replacement is, but I suspect CWWifiClient.
  • 我的方法大致基于 this ruby program
  • 为简洁起见,我删除了错误处理。
  • 我确实考虑过使用 networksetup 或删除 .mobileconfig 中的开放网络,但似乎都不太合适。
  • 因为我只是将网络配置文件列表拉出到一个可变数组中,所以这很容易适应任何任意排序等。