所以,总结一下,我终于开始研究系统配置 API。与往常一样,一旦你知道这并不难。
@0xced - 感谢您为我指明正确的方向。我会赞成您的回答,但我没有足够的声誉这样做。
这是我的解决方案,适用于任何好奇或处于相同情况的人。它涉及挖掘动态存储。有关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);
这只是为了测试,所以边缘有点粗糙。您将不得不寻找保留计数等。它只是为了了解如何完成而编写的。