设备标识、ip地址、网络类型

1、设备标识

+ (NSString *) getSysInfo

{

    int mib[2];

    size_t len;

    char *machine;

    

    mib[0] = CTL_HW;

    mib[1] = HW_MACHINE;

    sysctl(mib, 2, NULL, &len, NULL, 0);

    machine = malloc(len);

    sysctl(mib, 2, machine, &len, NULL, 0);

    

    NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];

    free(machine);

    return platform;

}

根据得到的设备编号,对应如下表:

https://www.innerfence.com/howto/apple-ios-devices-dates-versions-instruction-sets

 2、网络ip地址

如下这个只能WIFI的,手机流量的无法获取

+ (NSString *)deviceIPAdress {

    NSString *address = @"";

    struct ifaddrs *interfaces = NULL;

    struct ifaddrs *temp_addr = NULL;

    int success = 0;

    

    success = getifaddrs(&interfaces);

    

    if (success == 0) { // 0 表示获取成功

        

        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;

        }

    }

    

    freeifaddrs(interfaces);  

    return address;

}

//http://stackoverflow.com/questions/7072989/iphone-ipad-osx-how-to-get-my-ip-address-programmatically

//默认取的就是ipv4格式:192.168.0.2  ipv6的格式像:av:4f:dd:qq:ed

+ (NSString *)getIPAddress:(BOOL)preferIPv4

{

    NSArray *searchArray = preferIPv4 ?

    @[ IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] :

    @[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;

    

    NSDictionary *addresses = [NUIDeviceExtension getIPAddresses];

    NSLog(@"addresses: %@", addresses);

    

    __block NSString *address;

    [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)

     {

         address = addresses[key];

         if(address) *stop = YES;

     } ];

    return address ? address : @"0.0.0.0";

}

+ (NSDictionary *)getIPAddresses

{

    NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];

    

    // retrieve the current interfaces - returns 0 on success

    struct ifaddrs *interfaces;

    if(!getifaddrs(&interfaces)) {

        // Loop through linked list of interfaces

        struct ifaddrs *interface;

        for(interface=interfaces; interface; interface=interface->ifa_next) {

            if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {

                continue; // deeply nested code harder to read

            }

            const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;

            char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];

            if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {

                NSString *name = [NSString stringWithUTF8String:interface->ifa_name];

                NSString *type;

                if(addr->sin_family == AF_INET) {

                    if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {

                        type = IP_ADDR_IPv4;

                    }

                } else {

                    const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;

                    if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {

                        type = IP_ADDR_IPv6;

                    }

                }

                if(type) {

                    NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];

                    addresses[key] = [NSString stringWithUTF8String:addrBuf];

                }

            }

        }

        // Free memory

        freeifaddrs(interfaces);

    }

    return [addresses count] ? addresses : nil;

}

 3、网络类型

分2g、3g、4g只有7.0以上支持,默认使用

Reachability即可

+ (NSString*)getNetWorkWithWWAN

{

    CTTelephonyNetworkInfo  *networkInfo = [[CTTelephonyNetworkInfo  alloc] init];

    

    NSString *currentStatus  = networkInfo.currentRadioAccessTechnology; //获取当前网络描述

    if ([currentStatus isEqualToString:CTRadioAccessTechnologyLTE]) {

        return @"4G";

    } else if ([currentStatus isEqualToString:CTRadioAccessTechnologyEdge] || [currentStatus isEqualToString:CTRadioAccessTechnologyGPRS]) {

        return @"2G";

    } else {

        return @"3G";

    }

    return @"CellNetwork";

}

原文地址:https://www.cnblogs.com/swallow37/p/4958763.html