iOS

2013-06-10, ios

自機のIPアドレスを取得する

簡単そうで意外とややこしいです。以下、Stackoverflowから転記したそのままです。ifaddrs.hとarpa/inet.hというCのライブラリをインクルードして、ifaddrsという構造体とgetifaddrsという関数を使用して全てのネットワークインタフェースを取得し、その中からen0というインタフェースを抽出します。さらにsockaddr_inという構造体とinet_ntoaという関数を使用してIPアドレスをNSString型で取得しています。

#import <ifaddrs.h>
#import <arpa/inet.h>

- (NSString *)getIPAddress {
    NSString *address = @"";
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    success = getifaddrs(&interfaces);
    if (success == 0) {
        temp_addr = interfaces;
        while(temp_addr != NULL) {
            if(temp_addr->ifa_addr->sa_family == AF_INET) {
                if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                }
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    freeifaddrs(interfaces);
    return address;
}

iOSデバイスのネットワークインタフェースは、普通のPCのように無数のバリエーションがある訳ではないので、もっとシンプルなAPIが用意されていても良さそうなものですが、Appleのライブラリに存在しないのでしょうか。もはやIPアドレスなんて、普通のソフトウェアデベロッパが気にする必要もない下層のレイヤだということなのでしょうか…。

参考URL

この記事は役に立ちましたか?