【问题标题】:How to get the Cellular IP address in iOS app如何在 iOS 应用程序中获取蜂窝 IP 地址
【发布时间】:2013-03-28 22:51:58
【问题描述】:

我喜欢在我的应用程序中显示 IP 地址,我已经知道如何显示 WiFi IP 地址,但是当我在 callular 时它会显示错误,那么有没有一种方法可以在 iPhone 上显示蜂窝 IP 地址?

这是我用于 WiFi 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);

【问题讨论】:

  • 您收到什么错误信息?也许蜂窝网络的接口名称不是“en0”?您的代码仅适用于 IPv4 地址。有关枚举所有本地 IPv4 和 IPv6 接口地址的代码,请参阅(例如)stackoverflow.com/a/14084031/1187415,这可能会有所帮助。
  • @Martin R 我没有收到任何错误,IP 地址的字符串只是(错误)
  • 蜂窝网络的接口可能有不同的名称(不是“en0”)。尝试枚举所有接口,也许你可以识别出蜂窝网络的接口。还可以尝试 IPv6(请参阅我之前评论中的链接)。

标签: ios objective-c ip-address


【解决方案1】:

我终于成功了,我正在使用这个代码:

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

【讨论】:

  • 请注意,inet_ntoa 仅适用于 IPv4 地址。如果您在 IPv6 网络中,则必须使用 inet_ntop 或更好的 getnameinfo
  • Wi-Fi IP 不是外接的。
  • 您还应该检查实际连接的网络,在我的代码中,wifiAddress = addr;被执行了两次
猜你喜欢
  • 2011-02-05
  • 2020-09-14
  • 2017-04-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2015-02-15
相关资源
最近更新 更多