2013-03-28 44 views
3

我喜欢在我的应用程序中显示IP地址,我已经知道如何显示WiFi IP地址,但是当我在蜂窝电话时它将显示错误,那么是否有方法显示iPhone上的蜂窝IP地址?如何在iOS应用程序中获取蜂窝IP地址

这里是我使用的无线IP地址代码:

NSString *address = @"error"; 
    struct ifaddrs *interfaces = NULL; 
    struct ifaddrs *temp_addr = NULL; 
    int success = 0; 

    // retrieve the current interfaces - returns 0 on success 
    success = getifaddrs(&interfaces); 
    if (success == 0) { 
     // Loop through linked list of interfaces 
     temp_addr = interfaces; 
     while (temp_addr != NULL) { 
      if(temp_addr->ifa_addr->sa_family == AF_INET) { 
       // Check if interface is en0 which is the wifi connection on the iPhone 
       if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) { 
        // Get NSString from C String 
        address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; 
       } 
      } 

      temp_addr = temp_addr->ifa_next; 
     } 
    } 

    // Free memory 
    freeifaddrs(interfaces); 

    NSLog(address); 
+0

什么错误信息,你得到什么?蜂窝网络的接口名称可能不是“en0”?您的代码仅适用于IPv4地址。有关枚举所有本地IPv4和IPv6接口地址的代码,请参阅(例如)http://stackoverflow.com/a/14084031/1187415,这可能会有所帮助。 –

+0

@Martin R我没有得到任何错误,IP地址的字符串只是(错误) –

+0

蜂窝网络的接口可能有不同的名称(不是“en0”)。尝试枚举* all *接口,也许您可​​以识别蜂窝网络的接口。也尝试IPv6(请参阅我以前的评论中的链接)。 –

回答

14

我finaly做到了,我用这个代码:

struct ifaddrs *interfaces = NULL; 
    struct ifaddrs *temp_addr = NULL; 
    NSString *wifiAddress = nil; 
    NSString *cellAddress = nil; 

    // retrieve the current interfaces - returns 0 on success 
    if(!getifaddrs(&interfaces)) { 
     // Loop through linked list of interfaces 
     temp_addr = interfaces; 
     while(temp_addr != NULL) { 
      sa_family_t sa_type = temp_addr->ifa_addr->sa_family; 
      if(sa_type == AF_INET || sa_type == AF_INET6) { 
       NSString *name = [NSString stringWithUTF8String:temp_addr->ifa_name]; 
       NSString *addr = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; // pdp_ip0 
       //NSLog(@"NAME: \"%@\" addr: %@", name, addr); // see for yourself 

       if([name isEqualToString:@"en0"]) { 
        // Interface is the wifi connection on the iPhone 
        wifiAddress = addr; 
       } else 
        if([name isEqualToString:@"pdp_ip0"]) { 
         // Interface is the cell connection on the iPhone 
         cellAddress = addr; 
        } 
      } 
      temp_addr = temp_addr->ifa_next; 
     } 
     // Free memory 
     freeifaddrs(interfaces); 
    } 
    NSString *addr = wifiAddress ? wifiAddress : cellAddress; 

    NSLog(addr); 
+2

请注意'inet_ntoa'只适用于IPv4地址。如果您在IPv6网络中,则必须使用'inet_ntop'或更好''getnameinfo'。 –

+2

Wi-Fi IP不是外部IP。 – Mahouk

+0

你也应该检查哪个网络实际连接,在我的代码中,wifiAddress = addr;被执行了两次 –