首先推荐一个在用的库XYQuick 地址:https://github.com/uxyheaven/XYQuick
idfa:
获取方式
[ASIdentifierManager sharedManager].advertisingIdentifier.UUIDString
每个设备只有一个IDFA,不同APP在同一设备上获取IDFA的结果是一样的 设备重启不会产生新的IDFA 但IDFA存在重新生成的情况: 用户完全重置系统(设置程序 -> 通用 -> 还原 -> 还原位置与隐私) 用户明确还原广告(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符)
Appstore禁止不使用广告而采集IDFA的app上架
检查代码中是否使用了idfa 1、打开终端cd到要检查的文件的根目录。 2、执行下列语句:grep -r advertisingIdentifier . (别少了最后那个点号)。
由于idfa会出现取不到的情况,故绝不可以作为业务分析的主id,来识别用户
或者当idfa取不到就使用另外的方法生成具有相同作用的标示符存储在钥匙串中
idfv:
获取方式 [UIDevice currentDevice].identifierForVendor.UUIDString
特点: 根据vendor的值,如果vendor相同,则返回同一字符串;如果vendor不同,则返回不同的字符串。 vendor解释:英文解释为卖家,小贩。根据xcode文档解释,正常情况下,会根据App Store提供的数据进行判断。但是如果app不是通过app store进行安装的(如企业应用或开发调试阶段),那么会根据bundle ID判断。 判断准则:参考官方说明 com.example.app1和com.example.app2,只有最后的后缀不同,所以会产生相同的vendor ID
如果用户将属于此Vender的所有App卸载,则idfv的值会被重置,即再重装此Vender的App,idfv的值和之前不同
udid:
UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成。
在很多需要限制一台设备一个账号的应用中经常会用到。在iOS5中可以获取到设备的UDID,后来被苹果禁止了。
uuid:
UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。
这样,每个人都可以建立不与其它人冲突的 UUID。在此情况下,就不需考虑数据库建立时的名称重复问题。苹果公司建议使用UUID为应用生成唯一标识字符串。
开发者可以在应用第一次启动时调用一 次,然后将该串存储起来,替代UDID来使用。但是,如果用户删除该应用再次安装时,又会生成新的字符串,所以不能保证唯一识别该设备。
使用UUID,就要考虑应用被删除后再重新安装时的处理。一个解决的办法是:UUID一般只生成一次,保存在iOS系统里面,如果应用删除了,重装应用之后它的UUID还是一样的,除非系统重置
。但是不能保证在以后的系统升级后还能用(如果系统保存了该信息就能用)
isJailbreaking:
手机是否越狱是根据手机文件目录来实现的, 可以使用XYQuick提供的方法: [XYSystemInfo sharedInstance].isJailBroken
isDeviceSimulator:
- (BOOL)isDeviceSimulator{ struct utsname systemInfo; uname(&systemInfo); NSString *tmpDevStr = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if ([tmpDevStr isEqualToString:@"x86_64"] || [tmpDevStr isEqualToString:@"i386"] || [tmpDevStr isEqualToString:@"i586"]) { return YES; } return NO; }
Wi-FiMac:
通常指Wi-Fi的BSSID - (NSString *)wifiMac{ NSString *macIp = @"Not Found"; CFArrayRef myArray = CNCopySupportedInterfaces(); if (myArray != nil) { CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0)); if (myDict != nil) { NSDictionary *dict = (NSDictionary*)CFBridgingRelease(myDict); macIp = [dict valueForKey:@"BSSID"]; } } if(myArray){ CFRelease(myArray); } return macIp; }
Wi-Fi Name:
Wi-Fi Name通常指Wi-Fi的SSID - (NSString *)deviceSSID{ NSString *wifiName = nil; CFArrayRef wifiInterfaces = CNCopySupportedInterfaces(); if (!wifiInterfaces) { return nil; } NSArray *interfaces = (__bridge NSArray *)wifiInterfaces; for (NSString *interfaceName in interfaces) { CFDictionaryRef dictRef = CNCopyCurrentNetworkInfo((__bridge CFStringRef)(interfaceName)); if (dictRef) { NSDictionary *networkInfo = (__bridge NSDictionary *)dictRef; wifiName = [networkInfo objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID]; CFRelease(dictRef); } } CFRelease(wifiInterfaces); return wifiName; }
deviceName:
- (NSString *)deviceName { #if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) return [UIDevice currentDevice].name; #else return @""; #endif }
freeDiskSpace:
- (NSString *)freeDiskSpace { #if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] ; NSFileManager *fileManager = [[NSFileManager alloc ]init]; NSDictionary *fileSysAttributes = [fileManager attributesOfFileSystemForPath:path error:nil]; NSNumber *totalSpace = [fileSysAttributes objectForKey:NSFileSystemFreeSize]; return [NSString stringWithFormat:@"%.2fG",[totalSpace longLongValue]/1024.0/1024.0/1024.0]; #else return nil; #endif }
totalSpace:
- (NSString *)totalSpace { #if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] ; NSFileManager *fileManager = [[NSFileManager alloc ]init]; NSDictionary *fileSysAttributes = [fileManager attributesOfFileSystemForPath:path error:nil]; NSNumber *totalSpace = [fileSysAttributes objectForKey:NSFileSystemSize]; return [NSString stringWithFormat:@"%.2fG",[totalSpace longLongValue]/1024.0/1024.0/1024.0]; #else return nil; #endif }