游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3170|回复: 0

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

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32092
发表于 2017-3-28 13:53:22 | 显示全部楼层 |阅读模式
  文/si1ence

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

600.jpg

601.jpg

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

  一行代码就搞定的统一来!
  1.   // 这个方法后面会列出来
  2.     NSString *deviceName = [self getDeviceName];
  3.     NSLog(@"设备型号-->%@", deviceName);

  4.     NSString *iPhoneName = [UIDevice currentDevice].name;
  5.     NSLog(@"iPhone名称-->%@", iPhoneName);

  6.     NSString *appVerion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  7.     NSLog(@"app版本号-->%@", appVerion);

  8.     CGFloat batteryLevel = [[UIDevice currentDevice] batteryLevel];
  9.     NSLog(@"电池电量-->%f", batteryLevel);

  10.     NSString *localizedModel = [UIDevice currentDevice].localizedModel;
  11.     NSLog(@"localizedModel-->%@", localizedModel);

  12.     NSString *systemName = [UIDevice currentDevice].systemName;
  13.     NSLog(@"当前系统名称-->%@", systemName);

  14.     NSString *systemVersion = [UIDevice currentDevice].systemVersion;
  15.     NSLog(@"当前系统版本号-->%@", systemVersion);

  16.     struct utsname systemInfo;
  17.     uname(&systemInfo);
  18.     NSString *device_model = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
  19.     NSLog(@"device_model-->%@", device_model);

  20.     // 这个方法后面会单独列出
  21.     NSString *macAddress = [self getMacAddress];
  22.     NSLog(@"macAddress-->%@", macAddress);

  23.     // 这个方法后面会单独列出
  24.     NSString *deviceIP = [self getDeviceIPAddresses];
  25.     NSLog(@"deviceIP-->%@", deviceIP);
复制代码

  广告位标识符:在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,用户可以在 设置|隐私|广告追踪里重置此id的值,或限制此id的使用,故此id有可能会取不到值,但好在Apple默认是允许追踪的,而且一般用户都不知道有这么个设置,所以基本上用来监测推广效果,是戳戳有余了
  1. NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
  2.   NSLog(@"广告位标识符idfa-->%@", idfa);
复制代码

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

  获取设备型号
  1. // 获取设备型号然后手动转化为对应名称
  2. - (NSString *)getDeviceName
  3. {
  4.     // 需要#import "sys/utsname.h"
  5.     #warning 题主呕心沥血总结!!最全面!亲测!全网独此一份!!
  6.     struct utsname systemInfo;
  7.     uname(&systemInfo);
  8.     NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

  9.     if ([deviceString isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
  10.     if ([deviceString isEqualToString:@"iPhone3,2"])    return @"iPhone 4";
  11.     if ([deviceString isEqualToString:@"iPhone3,3"])    return @"iPhone 4";
  12.     if ([deviceString isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
  13.     if ([deviceString isEqualToString:@"iPhone5,1"])    return @"iPhone 5";
  14.     if ([deviceString isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
  15.     if ([deviceString isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
  16.     if ([deviceString isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
  17.     if ([deviceString isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
  18.     if ([deviceString isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
  19.     if ([deviceString isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
  20.     if ([deviceString isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
  21.     if ([deviceString isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";
  22.     if ([deviceString isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";
  23.     if ([deviceString isEqualToString:@"iPhone8,4"])    return @"iPhone SE";
  24.     // 日行两款手机型号均为日本独占,可能使用索尼FeliCa支付方案而不是苹果支付
  25.     if ([deviceString isEqualToString:@"iPhone9,1"])    return @"国行、日版、港行iPhone 7";
  26.     if ([deviceString isEqualToString:@"iPhone9,2"])    return @"港行、国行iPhone 7 Plus";
  27.     if ([deviceString isEqualToString:@"iPhone9,3"])    return @"美版、台版iPhone 7";
  28.     if ([deviceString isEqualToString:@"iPhone9,4"])    return @"美版、台版iPhone 7 Plus";

  29.     if ([deviceString isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
  30.     if ([deviceString isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
  31.     if ([deviceString isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
  32.     if ([deviceString isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
  33.     if ([deviceString isEqualToString:@"iPod5,1"])      return @"iPod Touch (5 Gen)";

  34.     if ([deviceString isEqualToString:@"iPad1,1"])      return @"iPad";
  35.     if ([deviceString isEqualToString:@"iPad1,2"])      return @"iPad 3G";
  36.     if ([deviceString isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
  37.     if ([deviceString isEqualToString:@"iPad2,2"])      return @"iPad 2";
  38.     if ([deviceString isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
  39.     if ([deviceString isEqualToString:@"iPad2,4"])      return @"iPad 2";
  40.     if ([deviceString isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
  41.     if ([deviceString isEqualToString:@"iPad2,6"])      return @"iPad Mini";
  42.     if ([deviceString isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
  43.     if ([deviceString isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
  44.     if ([deviceString isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
  45.     if ([deviceString isEqualToString:@"iPad3,3"])      return @"iPad 3";
  46.     if ([deviceString isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
  47.     if ([deviceString isEqualToString:@"iPad3,5"])      return @"iPad 4";
  48.     if ([deviceString isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";
  49.     if ([deviceString isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
  50.     if ([deviceString isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
  51.     if ([deviceString isEqualToString:@"iPad4,4"])      return @"iPad Mini 2 (WiFi)";
  52.     if ([deviceString isEqualToString:@"iPad4,5"])      return @"iPad Mini 2 (Cellular)";
  53.     if ([deviceString isEqualToString:@"iPad4,6"])      return @"iPad Mini 2";
  54.     if ([deviceString isEqualToString:@"iPad4,7"])      return @"iPad Mini 3";
  55.     if ([deviceString isEqualToString:@"iPad4,8"])      return @"iPad Mini 3";
  56.     if ([deviceString isEqualToString:@"iPad4,9"])      return @"iPad Mini 3";
  57.     if ([deviceString isEqualToString:@"iPad5,1"])      return @"iPad Mini 4 (WiFi)";
  58.     if ([deviceString isEqualToString:@"iPad5,2"])      return @"iPad Mini 4 (LTE)";
  59.     if ([deviceString isEqualToString:@"iPad5,3"])      return @"iPad Air 2";
  60.     if ([deviceString isEqualToString:@"iPad5,4"])      return @"iPad Air 2";
  61.     if ([deviceString isEqualToString:@"iPad6,3"])      return @"iPad Pro 9.7";
  62.     if ([deviceString isEqualToString:@"iPad6,4"])      return @"iPad Pro 9.7";
  63.     if ([deviceString isEqualToString:@"iPad6,7"])      return @"iPad Pro 12.9";
  64.     if ([deviceString isEqualToString:@"iPad6,8"])      return @"iPad Pro 12.9";

  65.     if ([deviceString isEqualToString:@"i386"])         return @"Simulator";
  66.     if ([deviceString isEqualToString:@"x86_64"])       return @"Simulator";

  67.     return deviceString;
  68. }
复制代码

  mac 地址
  1. - (NSString *)getMacAddress {
  2.     int mib[6];
  3.     size_t len;
  4.     char *buf;
  5.     unsigned char *ptr;
  6.     struct if_msghdr *ifm;
  7.     struct sockaddr_dl *sdl;

  8.     mib[0] = CTL_NET;
  9.     mib[1] = AF_ROUTE;
  10.     mib[2] = 0;
  11.     mib[3] = AF_LINK;
  12.     mib[4] = NET_RT_IFLIST;

  13.     if ((mib[5] = if_nametoindex("en0")) == 0) {
  14.         printf("Error: if_nametoindex error/n");
  15.         return NULL;
  16.     }

  17.     if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
  18.         printf("Error: sysctl, take 1/n");
  19.         return NULL;
  20.     }

  21.     if ((buf = malloc(len)) == NULL) {
  22.         printf("Could not allocate memory. error!/n");
  23.         return NULL;
  24.     }

  25.     if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
  26.         printf("Error: sysctl, take 2");
  27.         return NULL;
  28.     }

  29.     ifm = (struct if_msghdr *)buf;
  30.     sdl = (struct sockaddr_dl *)(ifm + 1);
  31.     ptr = (unsigned char *)LLADDR(sdl);

  32.     NSString *outstring = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
  33.     free(buf);

  34.     return [outstring uppercaseString];
  35. }
复制代码

  IP地址
  1. - (NSString *)getDeviceIPAddresses {

  2.     int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

  3.     NSMutableArray *ips = [NSMutableArray array];

  4.     int BUFFERSIZE = 4096;

  5.     struct ifconf ifc;

  6.     char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;

  7.     struct ifreq *ifr, ifrcopy;

  8.     ifc.ifc_len = BUFFERSIZE;
  9.     ifc.ifc_buf = buffer;

  10.     if (ioctl(sockfd, SIOCGIFCONF, &ifc) >= 0){

  11.         for (ptr = buffer; ptr < buffer + ifc.ifc_len; ){

  12.             ifr = (struct ifreq *)ptr;
  13.             int len = sizeof(struct sockaddr);

  14.             if (ifr->ifr_addr.sa_len > len) {
  15.                 len = ifr->ifr_addr.sa_len;
  16.             }

  17.             ptr += sizeof(ifr->ifr_name) + len;
  18.             if (ifr->ifr_addr.sa_family != AF_INET) continue;
  19.             if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL) *cptr = 0;
  20.             if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) continue;

  21.             memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
  22.             ifrcopy = *ifr;
  23.             ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);

  24.             if ((ifrcopy.ifr_flags & IFF_UP) == 0) continue;

  25.             NSString *ip = [NSString  stringWithFormat:@"%s", inet_ntoa(((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr)];
  26.             [ips addObject:ip];
  27.         }
  28.     }

  29.     close(sockfd);
  30.     NSString *deviceIP = @"";

  31.     for (int i=0; i < ips.count; i++) {
  32.         if (ips.count > 0) {
  33.             deviceIP = [NSString stringWithFormat:@"%@",ips.lastObject];
  34.         }
  35.     }
  36.     return deviceIP;
  37. }
复制代码

相关阅读:App Store研究:iOS APP提交上架最新流程

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-24 23:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表