• 设备标识、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";

    }

  • 相关阅读:
    服务器安装软件
    SQL server
    改变下blog思维
    react 父子组件互相通信
    linux下,文件的权限和数字对应关系详解
    Linux 下非root用户使用docker
    Two 观察者 observer pattern
    one 策略模式 strategy
    ssm maven spring AOP读写分离
    Unknown column in 'where clause'
  • 原文地址:https://www.cnblogs.com/swallow37/p/4958763.html
Copyright © 2020-2023  润新知