http://www.cocoachina.com/ios/20171024/20890.html

为了统计用户信息、下发广告,服务器端往往需要手机用户设备及app的各种信息,下面讲述一下各种信息的获取方式:

点击下载以上展示效果的GitHub源码

  • 一行代码就搞定的统一来!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
     // 这个方法后面会列出来
     NSString *deviceName = [self getDeviceName];
     NSLog(@ "设备型号-->%@" , deviceName);
     
     NSString *iPhoneName = [UIDevice currentDevice].name;
     NSLog(@ "iPhone名称-->%@" , iPhoneName); 
     
     NSString *appVerion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@ "CFBundleShortVersionString" ];
     NSLog(@ "app版本号-->%@" , appVerion);
  
     CGFloat batteryLevel = [[UIDevice currentDevice] batteryLevel];
     NSLog(@ "电池电量-->%f" , batteryLevel);
     
     NSString *localizedModel = [UIDevice currentDevice].localizedModel;
     NSLog(@ "localizedModel-->%@" , localizedModel);
     
     NSString *systemName = [UIDevice currentDevice].systemName;
     NSLog(@ "当前系统名称-->%@" , systemName);
     
     NSString *systemVersion = [UIDevice currentDevice].systemVersion;
     NSLog(@ "当前系统版本号-->%@" , systemVersion);
     struct utsname systemInfo;
     uname(&systemInfo);
     NSString *device_model = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
     NSLog(@ "device_model-->%@" , device_model);
     // 这个方法后面会单独列出
     NSString *macAddress = [self getMacAddress];
     NSLog(@ "macAddress-->%@" , macAddress);
     
     // 这个方法后面会单独列出
     NSString *deviceIP = [self getDeviceIPAddresses];
     NSLog(@ "deviceIP-->%@" , deviceIP);
    // 设备上次重启的时间
    NSTimeInterval time = [[NSProcessInfo processInfo] systemUptime];
    NSDate *lastRestartDate = [[NSDate alloc] initWithTimeIntervalSinceNow:( 0  - time)];

  • 广告位标识符:在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,用户可以在 设置|隐私|广告追踪里重置此id的值,或限制此id的使用,故此id有可能会取不到值,但好在Apple默认是允许追踪的,而且一般用户都不知道有这么个设置,所以基本上用来监测推广效果,是戳戳有余了

1
2
     NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
     NSLog(@ "广告位标识符idfa-->%@" , idfa);

  • UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指 定。这样,每个人都可以建立不与其它人冲突的 UUID。在此情况下,就不需考虑数据库建立时的名称重复问题。苹果公司建议使用UUID为应用生成唯一标识字符串。

1
2
     NSString *uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
     NSLog(@ "唯一识别码uuid-->%@" , uuid);

  • 获取设备型号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// 获取设备型号然后手动转化为对应名称
- (NSString *)getDeviceName
{
     // 需要#import "sys/utsname.h"
     #warning 题主呕心沥血总结!!最全面!亲测!全网独此一份!!
     struct utsname systemInfo;
     uname(&systemInfo);
     NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
     
     if  ([deviceString isEqualToString:@ "iPhone3,1" ])     return  @ "iPhone 4" ;
     if  ([deviceString isEqualToString:@ "iPhone3,2" ])     return  @ "iPhone 4" ;
     if  ([deviceString isEqualToString:@ "iPhone3,3" ])     return  @ "iPhone 4" ;
     if  ([deviceString isEqualToString:@ "iPhone4,1" ])     return  @ "iPhone 4S" ;
     if  ([deviceString isEqualToString:@ "iPhone5,1" ])     return  @ "iPhone 5" ;
     if  ([deviceString isEqualToString:@ "iPhone5,2" ])     return  @ "iPhone 5 (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPhone5,3" ])     return  @ "iPhone 5c (GSM)" ;
     if  ([deviceString isEqualToString:@ "iPhone5,4" ])     return  @ "iPhone 5c (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPhone6,1" ])     return  @ "iPhone 5s (GSM)" ;
     if  ([deviceString isEqualToString:@ "iPhone6,2" ])     return  @ "iPhone 5s (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPhone7,1" ])     return  @ "iPhone 6 Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone7,2" ])     return  @ "iPhone 6" ;
     if  ([deviceString isEqualToString:@ "iPhone8,1" ])     return  @ "iPhone 6s" ;
     if  ([deviceString isEqualToString:@ "iPhone8,2" ])     return  @ "iPhone 6s Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone8,4" ])     return  @ "iPhone SE" ;
     // 日行两款手机型号均为日本独占,可能使用索尼FeliCa支付方案而不是苹果支付
     if  ([deviceString isEqualToString:@ "iPhone9,1" ])     return  @ "国行、日版、港行iPhone 7" ;
     if  ([deviceString isEqualToString:@ "iPhone9,2" ])     return  @ "港行、国行iPhone 7 Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone9,3" ])     return  @ "美版、台版iPhone 7" ;
     if  ([deviceString isEqualToString:@ "iPhone9,4" ])     return  @ "美版、台版iPhone 7 Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone10,1" ])    return  @ "国行(A1863)、日行(A1906)iPhone 8" ;
     if  ([deviceString isEqualToString:@ "iPhone10,4" ])    return  @ "美版(Global/A1905)iPhone 8" ;
     if  ([deviceString isEqualToString:@ "iPhone10,2" ])    return  @ "国行(A1864)、日行(A1898)iPhone 8 Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone10,5" ])    return  @ "美版(Global/A1897)iPhone 8 Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone10,3" ])    return  @ "国行(A1865)、日行(A1902)iPhone X" ;
     if  ([deviceString isEqualToString:@ "iPhone10,6" ])    return  @ "美版(Global/A1901)iPhone X" ;
     
     if  ([deviceString isEqualToString:@ "iPod1,1" ])       return  @ "iPod Touch 1G" ;
     if  ([deviceString isEqualToString:@ "iPod2,1" ])       return  @ "iPod Touch 2G" ;
     if  ([deviceString isEqualToString:@ "iPod3,1" ])       return  @ "iPod Touch 3G" ;
     if  ([deviceString isEqualToString:@ "iPod4,1" ])       return  @ "iPod Touch 4G" ;
     if  ([deviceString isEqualToString:@ "iPod5,1" ])       return  @ "iPod Touch (5 Gen)" ;
     
     if  ([deviceString isEqualToString:@ "iPad1,1" ])       return  @ "iPad" ;
     if  ([deviceString isEqualToString:@ "iPad1,2" ])       return  @ "iPad 3G" ;
     if  ([deviceString isEqualToString:@ "iPad2,1" ])       return  @ "iPad 2 (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad2,2" ])       return  @ "iPad 2" ;
     if  ([deviceString isEqualToString:@ "iPad2,3" ])       return  @ "iPad 2 (CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPad2,4" ])       return  @ "iPad 2" ;
     if  ([deviceString isEqualToString:@ "iPad2,5" ])       return  @ "iPad Mini (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad2,6" ])       return  @ "iPad Mini" ;
     if  ([deviceString isEqualToString:@ "iPad2,7" ])       return  @ "iPad Mini (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPad3,1" ])       return  @ "iPad 3 (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad3,2" ])       return  @ "iPad 3 (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPad3,3" ])       return  @ "iPad 3" ;
     if  ([deviceString isEqualToString:@ "iPad3,4" ])       return  @ "iPad 4 (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad3,5" ])       return  @ "iPad 4" ;
     if  ([deviceString isEqualToString:@ "iPad3,6" ])       return  @ "iPad 4 (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPad4,1" ])       return  @ "iPad Air (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad4,2" ])       return  @ "iPad Air (Cellular)" ;
     if  ([deviceString isEqualToString:@ "iPad4,4" ])       return  @ "iPad Mini 2 (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad4,5" ])       return  @ "iPad Mini 2 (Cellular)" ;
     if  ([deviceString isEqualToString:@ "iPad4,6" ])       return  @ "iPad Mini 2" ;
     if  ([deviceString isEqualToString:@ "iPad4,7" ])       return  @ "iPad Mini 3" ;
     if  ([deviceString isEqualToString:@ "iPad4,8" ])       return  @ "iPad Mini 3" ;
     if  ([deviceString isEqualToString:@ "iPad4,9" ])       return  @ "iPad Mini 3" ;
     if  ([deviceString isEqualToString:@ "iPad5,1" ])       return  @ "iPad Mini 4 (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad5,2" ])       return  @ "iPad Mini 4 (LTE)" ;
     if  ([deviceString isEqualToString:@ "iPad5,3" ])       return  @ "iPad Air 2" ;
     if  ([deviceString isEqualToString:@ "iPad5,4" ])       return  @ "iPad Air 2" ;
     if  ([deviceString isEqualToString:@ "iPad6,3" ])       return  @ "iPad Pro 9.7" ;
     if  ([deviceString isEqualToString:@ "iPad6,4" ])       return  @ "iPad Pro 9.7" ;
     if  ([deviceString isEqualToString:@ "iPad6,7" ])       return  @ "iPad Pro 12.9" ;
     if  ([deviceString isEqualToString:@ "iPad6,8" ])       return  @ "iPad Pro 12.9" ;
     if  ([machineString isEqualToString:@ "iPad6,11" ])     return  @ "iPad 5 (WiFi)" ;
     if  ([machineString isEqualToString:@ "iPad6,12" ])     return  @ "iPad 5 (Cellular)" ;
     if  ([machineString isEqualToString:@ "iPad7,1" ])      return  @ "iPad Pro 12.9 inch 2nd gen (WiFi)" ;
     if  ([machineString isEqualToString:@ "iPad7,2" ])      return  @ "iPad Pro 12.9 inch 2nd gen (Cellular)" ;
     if  ([machineString isEqualToString:@ "iPad7,3" ])      return  @ "iPad Pro 10.5 inch (WiFi)" ;
     if  ([machineString isEqualToString:@ "iPad7,4" ])      return  @ "iPad Pro 10.5 inch (Cellular)" ;
     
    if  ([deviceString isEqualToString:@ "AppleTV2,1" ])     return  @ "Apple TV 2" ;
    if  ([deviceString isEqualToString:@ "AppleTV3,1" ])     return  @ "Apple TV 3" ;
    if  ([deviceString isEqualToString:@ "AppleTV3,2" ])     return  @ "Apple TV 3" ;
    if  ([deviceString isEqualToString:@ "AppleTV5,3" ])     return  @ "Apple TV 4" ;
     if  ([deviceString isEqualToString:@ "i386" ])          return  @ "Simulator" ;
     if  ([deviceString isEqualToString:@ "x86_64" ])        return  @ "Simulator" ;
     
     return  deviceString;
}

  • mac 地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- (NSString *)getMacAddress {
     int  mib[ 6 ];
     size_t len;
     char *buf;
     unsigned char *ptr;
     struct if_msghdr *ifm;
     struct sockaddr_dl *sdl;
     
     mib[ 0 ] = CTL_NET;
     mib[ 1 ] = AF_ROUTE;
     mib[ 2 ] =  0 ;
     mib[ 3 ] = AF_LINK;
     mib[ 4 ] = NET_RT_IFLIST;
     
     if  ((mib[ 5 ] = if_nametoindex( "en0" )) ==  0 ) {
         printf( "Error: if_nametoindex error/n" );
         return  NULL;
     }
     
     if  (sysctl(mib,  6 , NULL, &len, NULL,  0 ) <  0 ) {
         printf( "Error: sysctl, take 1/n" );
         return  NULL;
     }
     
     if  ((buf = malloc(len)) == NULL) {
         printf( "Could not allocate memory. error!/n" );
         return  NULL;
     }
     
     if  (sysctl(mib,  6 , buf, &len, NULL,  0 ) <  0 ) {
         printf( "Error: sysctl, take 2" );
         return  NULL;
     }
     
     ifm = (struct if_msghdr *)buf;
     sdl = (struct sockaddr_dl *)(ifm +  1 );
     ptr = (unsigned char *)LLADDR(sdl);
     
     NSString *outstring = [NSString stringWithFormat:@ "xxxxxx" , *ptr, *(ptr+ 1 ), *(ptr+ 2 ), *(ptr+ 3 ), *(ptr+ 4 ), *(ptr+ 5 )];
     free(buf);
     
     return  [outstring uppercaseString];
}

  • IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
- (NSString *)getDeviceIPAddresses {
     
     int  sockfd = socket(AF_INET, SOCK_DGRAM,  0 );
     
     NSMutableArray *ips = [NSMutableArray array];
     
     int  BUFFERSIZE =  4096 ;
     
     struct ifconf ifc;
     
     char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
     
     struct ifreq *ifr, ifrcopy;
     
     ifc.ifc_len = BUFFERSIZE;
     ifc.ifc_buf = buffer;
     
     if  (ioctl(sockfd, SIOCGIFCONF, &ifc) >=  0 ){
         
         for  (ptr = buffer; ptr < buffer + ifc.ifc_len; ){
             
             ifr = (struct ifreq *)ptr;
             int  len = sizeof(struct sockaddr);
             
             if  (ifr->ifr_addr.sa_len > len) {
                 len = ifr->ifr_addr.sa_len;
             }
             
             ptr += sizeof(ifr->ifr_name) + len;
             if  (ifr->ifr_addr.sa_family != AF_INET)  continue ;
             if  ((cptr = (char *)strchr(ifr->ifr_name,  ':' )) != NULL) *cptr =  0 ;
             if  (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) ==  0 continue ;
             
             memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
             ifrcopy = *ifr;
             ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
             
             if  ((ifrcopy.ifr_flags & IFF_UP) ==  0 continue ;
             
             NSString *ip = [NSString  stringWithFormat:@ "%s" , inet_ntoa(((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr)];
             [ips addObject:ip];
         }
     }
     
     close(sockfd);
     NSString *deviceIP = @ "" ;
     
     for  ( int  i= 0 ; i < ips.count; i++) {
         if  (ips.count >  0 ) {
             deviceIP = [NSString stringWithFormat:@ "%@" ,ips.lastObject];
         }
     }
     return  deviceIP;
}

  • CPU

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// CPU总数目
- (NSUInteger)getCPUCount {
     return  [NSProcessInfo processInfo].activeProcessorCount;
}
// 已使用的CPU比例
- (float)getCPUUsage {
     float cpu =  0 ;
     NSArray *cpus = [self getPerCPUUsage];
     if  (cpus.count ==  0 return  - 1 ;
     for  (NSNumber *n  in  cpus) {
         cpu += n.floatValue;
     }
     return  cpu;
}
// 获取每个cpu的使用比例
- (NSArray *)getPerCPUUsage {
     processor_info_array_t _cpuInfo, _prevCPUInfo = nil;
     mach_msg_type_number_t _numCPUInfo, _numPrevCPUInfo =  0 ;
     unsigned _numCPUs;
     NSLock *_cpuUsageLock;
     
     int  _mib[2U] = { CTL_HW, HW_NCPU };
     size_t _sizeOfNumCPUs = sizeof(_numCPUs);
     int  _status = sysctl(_mib, 2U, &_numCPUs, &_sizeOfNumCPUs, NULL, 0U);
     if  (_status)
         _numCPUs =  1 ;
     
     _cpuUsageLock = [[NSLock alloc] init];
     
     natural_t _numCPUsU = 0U;
     kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &_numCPUsU, &_cpuInfo, &_numCPUInfo);
     if  (err == KERN_SUCCESS) {
         [_cpuUsageLock lock];
         
         NSMutableArray *cpus = [NSMutableArray  new ];
         for  (unsigned i = 0U; i < _numCPUs; ++i) {
             Float32 _inUse, _total;
             if  (_prevCPUInfo) {
                 _inUse = (
                           (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER]   - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER])
                           + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM])
                           + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]   - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE])
                           );
                 _total = _inUse + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]);
             else  {
                 _inUse = _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE];
                 _total = _inUse + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE];
             }
             [cpus addObject:@(_inUse / _total)];
         }
         
         [_cpuUsageLock unlock];
         if  (_prevCPUInfo) {
             size_t prevCpuInfoSize = sizeof(integer_t) * _numPrevCPUInfo;
             vm_deallocate(mach_task_self(), (vm_address_t)_prevCPUInfo, prevCpuInfoSize);
         }
         return  cpus;
     else  {
         return  nil;
     }
}

  • Disk磁盘空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 获取磁盘总空间
- (int64_t)getTotalDiskSpace {
     NSError *error = nil;
     NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error];
     if  (error)  return  - 1 ;
     int64_t space =  [[attrs objectForKey:NSFileSystemSize] longLongValue];
     if  (space <  0 ) space = - 1 ;
     return  space;
}
// 获取未使用的磁盘空间
- (int64_t)getFreeDiskSpace {
     NSError *error = nil;
     NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error];
     if  (error)  return  - 1 ;
     int64_t space =  [[attrs objectForKey:NSFileSystemFreeSize] longLongValue];
     if  (space <  0 ) space = - 1 ;
     return  space;
}
// 获取已使用的磁盘空间
- (int64_t)getUsedDiskSpace {
     int64_t totalDisk = [self getTotalDiskSpace];
     int64_t freeDisk = [self getFreeDiskSpace];
     if  (totalDisk <  0  || freeDisk <  0 return  - 1 ;
     int64_t usedDisk = totalDisk - freeDisk;
     if  (usedDisk <  0 ) usedDisk = - 1 ;
     return  usedDisk;
}

  • Memory内存相关数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// 系统总内存空间
- (int64_t)getTotalMemory {
     int64_t totalMemory = [[NSProcessInfo processInfo] physicalMemory];
     if  (totalMemory < - 1 ) totalMemory = - 1 ;
     return  totalMemory;
}
// 活跃的内存,正在使用或者很短时间内被使用过
- (int64_t)getActiveMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  vm_stat.active_count * page_size;
}
// 最近使用过,但是目前处于不活跃状态的内存
- (int64_t)getInActiveMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  vm_stat.inactive_count * page_size;
}
// 空闲的内存空间
- (int64_t)getFreeMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  vm_stat.free_count * page_size;
}
// 已使用的内存空间
- (int64_t)getUsedMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  page_size * (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count);
}
// 用来存放内核和数据结构的内存,framework、用户级别的应用无法分配
- (int64_t)getWiredMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  vm_stat.wire_count * page_size;
}
// 可释放的内存空间:内存吃紧自动释放,针对大对象存放所需的大块内存空间
- (int64_t)getPurgableMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  vm_stat.purgeable_count * page_size;

史上最全的iOS各种设备信息获取总结相关推荐

  1. 史上最全的iOS各种设备信息获取总结(iPhone8/iPhone X 已更新)

    不管是在Android开发还是iOS开发过程中,有时候我们需要经常根据设备的一些状态或信息进行不同的设置和性能配置,例如横竖屏切换时,电池电量低时,内存不够时,网络切换时等等,我们在这时候需要进行一些 ...

  2. 史上最全的iOS各种设备信息获取总结(iPhone X 详细信息已更新)

    2016.07.01 更新至iPhone X 新增设备颜色的获取 为了统计用户信息.下发广告,服务器端往往需要手机用户设备及app的各种信息,下面讲述一下各种信息的获取方式: 点击下载以上展示效果的G ...

  3. 史上最全的iOS各种设备信息获取总结(iPhone 12已更新)

    更新至iPhone 11   [转] 添加了iphone12的设备 > 为了统计用户信息.下发广告,服务器端往往需要手机用户设备及app的各种信息,下面讲述一下各种信息的获取方式: ![imag ...

  4. 史上最全的iOS面试题及答案

    史上最全的iOS面试题及答案 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encodin ...

  5. 史上最全的iOS开源项目分类汇总

    学了这么久,还是抽时间把github上比较好用的第三方总结了一下: Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错- BFKit 又一套Ca ...

  6. 史上最全的 iOS 各种测试工具集锦

    引言: 随着移动互联网的兴起,APP 测试的越来越被重视!Android 系统因为自己的开源性,测试工具和测试方法比较广为流传,但是 iOS 系统的私密性,导致很多测试的执行都有点麻烦. 为了帮助大家 ...

  7. iOS: iOS各种设备信息获取

    Author:si1ence Link:http://www.jianshu.com/p/b23016bb97af 为了统计用户信息.下发广告,服务器端往往需要手机用户设备及app的各种信息,下面讲述 ...

  8. 新手必看,史上最全的iOS开发教程集锦,没有之一!

    最近大火的iPhone XS Max和iPhone XS,不知道有没有同学已经下手了呢?一万三的价位确实让很多人望而却步啊.据说为了赢得中国的用户,专门出了双卡双待的,可想而知中国市场这块" ...

  9. 【iOS】史上最全的iOS持续集成教程 (上)

    这个系列的博客分为上下两篇,上篇介绍命令行工具使用,下篇介绍利用Jenkins进行持续化集成 在iOS的开发过程中总是免不了要不停的打包,通常的打包方式是这样的 XCode->Archive-& ...

最新文章

  1. IO流 字符流 字节流 缓冲流 文件的复制
  2. swift_015(Swift 的函数)
  3. .Net微信开发之通过UnionID机制,解决用户在不同公众号,或在公众号、移动应用之间帐号统一问题...
  4. 初等代数(3):代数方程、指数与对数、复数
  5. postgresql批量插入数据脚本_每日踩坑 2020-11-04 PostgreSQL 批量插入数据
  6. 现代计算机密码学阶段主要有两个方向,密码学技术读书笔记
  7. java两种绑定方式_Javascript绑定事件的两种方式的区别
  8. 负载均衡工具 haproxy剖析
  9. PL/SQL编程的简单学习
  10. 运行报错provider = models.ForeignKey(Provider, on_delete=True) TypeError(‘on_delete must be callable.‘)
  11. day17--JQuery
  12. Mysql批量添加数据
  13. ies文件 vray_光域网ies文件免费
  14. 回归算法--K近邻算法
  15. 微信公众号支付开发-php
  16. 如何设置正确的dns服务器地址,dns服务器地址如何设置
  17. javascript英语单词音节拆分_英语单词音节的划分法
  18. 模糊集合和隶属度详解
  19. TxtView 手机文本阅读器
  20. 安装6.0之后,防止应用进入DOZE状态,导致无法后台请求服务器,或者其他请求。

热门文章

  1. android4.4+wifi移植,Android KitKat 4.4 Wifi移植之Wifi driver
  2. 移动端(vue)如何调用手机拨号功能
  3. office365前端js效果
  4. vivo手机中误删的照片怎么恢复?快速找回的方法!
  5. linux kde桌面内存,Linux系统KDE桌面,打造最接近Windows的界面环境!
  6. pubg2019年7月服务器维护时间,绝地求生2019年7月10日官方更新公告及更新内容汇总...
  7. zz Fedora14 快速设置
  8. 打表技巧和矩阵处理技巧
  9. 浏览器之争:程序员眼里浏览器的地位 IE:我开了!
  10. android 全透明背景,@谷歌android帝 这是你想要的,全局透明背景教程,两种方法...