それで、これをまとめるために、私はついにシステム構成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では、これらの配列はそれぞれ1つの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);
これはテスト用なので、端が少し荒いです。保持カウントなどを探す必要があります。それはそれがどのように行われることができるかについての考えを得るために書かれただけです。