| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 |
- //
- // TVCUtils.m
- // TCLVBIMDemo
- //
- // Created by carolsuo on 2017/11/3.
- // Copyright © 2017年 tencent. All rights reserved.
- //
- #import "TVCUtils.h"
- #import <sys/utsname.h>
- #import <sys/sysctl.h>
- #import <CommonCrypto/CommonDigest.h>
- #import <CoreTelephony/CTCarrier.h>
- #import <CoreTelephony/CTTelephonyNetworkInfo.h>
- #import <SystemConfiguration/SystemConfiguration.h>
- #import <UIKit/UIKit.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- static NSString * const kTVCPDDictionaryKey = @"com.tencent.liteavupload.uuidDictionaryKey";
- static NSString * const kTVCPDKeyChainKey = @"com.tencent.liteavupload.uuidkeychainKey";
- @implementation TVCUtils
- static NSString *tvc_systemBootTime(){
- struct timeval boottime;
- size_t len = sizeof(boottime);
- int mib[2] = { CTL_KERN, KERN_BOOTTIME };
-
- if( sysctl(mib, 2, &boottime, &len, NULL, 0) < 0 )
- {
- return @"";
- }
- time_t bsec = boottime.tv_sec / 10000;
-
- NSString *bootTime = [NSString stringWithFormat:@"%ld",bsec];
-
- return bootTime;
- }
- static NSString *tvc_countryCode() {
- NSLocale *locale = [NSLocale currentLocale];
- NSString *countryCode = [locale objectForKey:NSLocaleCountryCode];
- return countryCode;
- }
- static NSString *tvc_language() {
- NSString *language;
- NSLocale *locale = [NSLocale currentLocale];
- if ([[NSLocale preferredLanguages] count] > 0) {
- language = [[NSLocale preferredLanguages]objectAtIndex:0];
- } else {
- language = [locale objectForKey:NSLocaleLanguageCode];
- }
-
- return language;
- }
- static NSString *tvc_systemVersion() {
- return [[UIDevice currentDevice] systemVersion];
- }
- static NSString *tvc_deviceName(){
- return [[UIDevice currentDevice] name];
- }
- static const char *tvc_SIDFAModel = "hw.model";
- static const char *tvc_SIDFAMachine = "hw.machine";
- static NSString *tvc_getSystemHardwareByName(const char *typeSpecifier) {
- size_t size;
- sysctlbyname(typeSpecifier, NULL, &size, NULL, 0);
- char *answer = malloc(size);
- sysctlbyname(typeSpecifier, answer, &size, NULL, 0);
- NSString *results = [NSString stringWithUTF8String:answer];
- free(answer);
- return results;
- }
- static NSUInteger tvc_getSysInfo(uint typeSpecifier) {
- size_t size = sizeof(int);
- int results;
- int mib[2] = {CTL_HW, typeSpecifier};
- sysctl(mib, 2, &results, &size, NULL, 0);
- return (NSUInteger) results;
- }
- static NSString *tvc_carrierInfo() {
- NSMutableString* cInfo = [NSMutableString string];
-
- CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];
- CTCarrier *carrier = [networkInfo subscriberCellularProvider];
-
- NSString *carrierName = [carrier carrierName];
- if (carrierName != nil){
- [cInfo appendString:carrierName];
- }
-
- NSString *mcc = [carrier mobileCountryCode];
- if (mcc != nil){
- [cInfo appendString:mcc];
- }
-
- NSString *mnc = [carrier mobileNetworkCode];
- if (mnc != nil){
- [cInfo appendString:mnc];
- }
-
- return cInfo;
- }
- static NSString *tvc_systemHardwareInfo(){
- NSString *model = tvc_getSystemHardwareByName(tvc_SIDFAModel);
- NSString *machine = tvc_getSystemHardwareByName(tvc_SIDFAMachine);
- NSString *carInfo = tvc_carrierInfo();
- NSUInteger totalMemory = tvc_getSysInfo(HW_PHYSMEM);
-
- return [NSString stringWithFormat:@"%@,%@,%@,%td",model,machine,carInfo,totalMemory];
- }
- static NSString *tvc_systemFileTime(){
- NSFileManager *file = [NSFileManager defaultManager];
- NSDictionary *dic= [file attributesOfItemAtPath:@"System/Library/CoreServices" error:nil];
- return [NSString stringWithFormat:@"%@,%@",[dic objectForKey:NSFileCreationDate],[dic objectForKey:NSFileModificationDate]];
- }
- static NSString *tvc_disk(){
- NSDictionary *fattributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil];
- NSString *diskSize = [[fattributes objectForKey:NSFileSystemSize] stringValue];
- return diskSize;
- }
- static void tvc_MD5_16(NSString *source, unsigned char *ret){
- const char* str = [source UTF8String];
- unsigned char result[CC_MD5_DIGEST_LENGTH];
- CC_MD5(str, (CC_LONG)strlen(str), result);
-
- for(int i = 4; i < CC_MD5_DIGEST_LENGTH - 4; i++) {
- ret[i-4] = result[i];
- }
- }
- static NSString *tvc_combineTwoFingerPrint(unsigned char *fp1,unsigned char *fp2){
- NSMutableString *hash = [NSMutableString stringWithCapacity:36];
- for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i+=1)
- {
- if (i==4 || i== 6 || i==8 || i==10)
- [hash appendString:@"-"];
-
- if (i < 8) {
- [hash appendFormat:@"%02X",fp1[i]];
- }else{
- [hash appendFormat:@"%02X",fp2[i-8]];
- }
- }
-
- return hash;
- }
- + (NSString *)tvc_createSimulateIDFA{
- NSString *sysBootTime = tvc_systemBootTime();
- NSString *countryC= tvc_countryCode();
- NSString *languge = tvc_language();
- NSString *deviceN = tvc_deviceName();
-
- NSString *sysVer = tvc_systemVersion();
- NSString *systemHardware = tvc_systemHardwareInfo();
- NSString *systemFT = tvc_systemFileTime();
- NSString *diskS = tvc_disk();
-
- NSString *fingerPrintUnstablePart = [NSString stringWithFormat:@"%@,%@,%@,%@", sysBootTime, countryC, languge, deviceN];
- NSString *fingerPrintStablePart = [NSString stringWithFormat:@"%@,%@,%@,%@", sysVer, systemHardware, systemFT, diskS];
-
- unsigned char fingerPrintUnstablePartMD5[CC_MD5_DIGEST_LENGTH/2];
- tvc_MD5_16(fingerPrintUnstablePart,fingerPrintUnstablePartMD5);
-
- unsigned char fingerPrintStablePartMD5[CC_MD5_DIGEST_LENGTH/2];
- tvc_MD5_16(fingerPrintStablePart,fingerPrintStablePartMD5);
-
- NSString *simulateIDFA = tvc_combineTwoFingerPrint(fingerPrintStablePartMD5,fingerPrintUnstablePartMD5);
- return simulateIDFA;
- }
- + (NSMutableDictionary *)tvc_getKeychainQuery:(NSString *)service {
- return [NSMutableDictionary dictionaryWithObjectsAndKeys:
- (id)kSecClassGenericPassword,(id)kSecClass,
- service, (id)kSecAttrService,
- service, (id)kSecAttrAccount,
- (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
- nil];
- }
- + (void)tvc_keyChainSave:(NSString *)string {
- NSMutableDictionary *tempDic = [NSMutableDictionary dictionary];
- [tempDic setObject:string forKey:kTVCPDDictionaryKey];
- //Get search dictionary
- NSMutableDictionary *keychainQuery = [TVCUtils tvc_getKeychainQuery:kTVCPDKeyChainKey];
- //Delete old item before add new item
- SecItemDelete((CFDictionaryRef)keychainQuery);
- //Add new object to search dictionary(Attention:the data format)
- [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:tempDic] forKey:(id)kSecValueData];
- //Add item to keychain with the search dictionary
- SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
- }
- + (NSString *)tvc_keyChainLoad{
- id ret = nil;
- NSMutableDictionary *keychainQuery = [TVCUtils tvc_getKeychainQuery:kTVCPDKeyChainKey];
- //Configure the search setting
- //Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
- [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
- [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
- CFDataRef keyData = NULL;
- if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
- @try {
- ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
- } @catch (NSException *e) {
- NSLog(@"Unarchive of %@ failed: %@", kTVCPDKeyChainKey, e);
- } @finally {
- }
- }
- if (keyData)
- CFRelease(keyData);
-
- NSMutableDictionary *tempDic = ret;
- return [tempDic objectForKey:kTVCPDDictionaryKey];
- }
- + (NSString *)tvc_createDevUUID:(NSString *)simulateIDFA {
- NSString * devUuid = [TVCUtils tvc_keyChainLoad];
- if (nil == devUuid) {
- CFUUIDRef puuid = CFUUIDCreate( nil );
- CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
- NSString * cUUID = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
- CFRelease(puuid);
- CFRelease(uuidString);
- simulateIDFA = [simulateIDFA stringByAppendingString:cUUID];
-
- const char *c_str_simulateIDFA = [simulateIDFA UTF8String];
- unsigned char md5_simulateIDFA[CC_MD5_DIGEST_LENGTH];
- CC_MD5( c_str_simulateIDFA, (CC_LONG)strlen(c_str_simulateIDFA), md5_simulateIDFA);
- devUuid = tvc_combineTwoFingerPrint(md5_simulateIDFA, md5_simulateIDFA+(CC_MD5_DIGEST_LENGTH/2));
- [TVCUtils tvc_keyChainSave:devUuid];
- }
- return devUuid;
- }
- + (NSString *)tvc_getDevUUID {
- return [TVCUtils tvc_createDevUUID:[TVCUtils tvc_createSimulateIDFA]];
- }
- + (int) tvc_getNetWorkType
- {
- int NetworkType = 0; // UNKNOWN
-
- //创建零地址,0.0.0.0的地址表示查询本机的网络连接状态
- struct sockaddr_storage zeroAddress;
-
- bzero(&zeroAddress, sizeof(zeroAddress));
- zeroAddress.ss_len = sizeof(zeroAddress);
- zeroAddress.ss_family = AF_INET;
-
- // Recover reachability flags
- SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
- SCNetworkReachabilityFlags flags;
-
- //获得连接的标志
- BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
- CFRelease(defaultRouteReachability);
-
- //如果不能获取连接标志,则不能连接网络,直接返回
- if (!didRetrieveFlags)
- {
- return NetworkType;
- }
-
-
- if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
- {
- // if target host is reachable and no connection is required
- // then we'll assume (for now) that your on Wi-Fi
-
- if ((flags & kSCNetworkReachabilityFlagsReachable) != 0) // fix by annidy:无连接时不能返回WIFI
- NetworkType = 1; // WIFI
- }
-
- if (
- ((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
- (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0
- )
- {
- // ... and the connection is on-demand (or on-traffic) if the
- // calling application is using the CFSocketStream or higher APIs
- if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
- {
- // ... and no [user] intervention is needed
- NetworkType = 1; // WIFI
- }
- }
-
- if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
- {
- if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
- {
- CTTelephonyNetworkInfo * info = [[CTTelephonyNetworkInfo alloc] init];
- NSString *currentRadioAccessTechnology = info.currentRadioAccessTechnology;
-
- if (currentRadioAccessTechnology)
- {
- if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE])
- {
- NetworkType = 2; // 4G
- }
- else if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS])
- {
- NetworkType = 4; // 2G
- }
- else
- {
- NetworkType = 3; // 3G
- }
- }
- }
- else
- {
- if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable)
- {
- if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection)
- {
- if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired)
- {
- NetworkType = 4; // 2G
- }
- else
- {
- NetworkType = 3; // 3G
- }
- }
- }
- }
- }
-
- return NetworkType;
- }
- + (NSString *)tvc_deviceModelName
- {
- struct utsname systemInfo;
- uname(&systemInfo);
- NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
-
- //iPhone 系列
- if ([deviceModel isEqualToString:@"iPhone1,1"]) return @"iPhone 1G";
- if ([deviceModel isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
- if ([deviceModel isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
- if ([deviceModel isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
- if ([deviceModel isEqualToString:@"iPhone3,2"]) return @"Verizon iPhone 4";
- if ([deviceModel isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
- if ([deviceModel isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
- if ([deviceModel isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
- if ([deviceModel isEqualToString:@"iPhone5,3"]) return @"iPhone 5C";
- if ([deviceModel isEqualToString:@"iPhone5,4"]) return @"iPhone 5C";
- if ([deviceModel isEqualToString:@"iPhone6,1"]) return @"iPhone 5S";
- if ([deviceModel isEqualToString:@"iPhone6,2"]) return @"iPhone 5S";
- if ([deviceModel isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
- if ([deviceModel isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
- if ([deviceModel isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
- if ([deviceModel isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
- if ([deviceModel isEqualToString:@"iPhone9,1"]) return @"iPhone 7 (CDMA)";
- if ([deviceModel isEqualToString:@"iPhone9,3"]) return @"iPhone 7 (GSM)";
- if ([deviceModel isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus (CDMA)";
- if ([deviceModel isEqualToString:@"iPhone9,4"]) return @"iPhone 7 Plus (GSM)";
-
- //iPod 系列
- if ([deviceModel isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
- if ([deviceModel isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
- if ([deviceModel isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G";
- if ([deviceModel isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G";
- if ([deviceModel isEqualToString:@"iPod5,1"]) return @"iPod Touch 5G";
-
- //iPad 系列
- if ([deviceModel isEqualToString:@"iPad1,1"]) return @"iPad";
- if ([deviceModel isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)";
- if ([deviceModel isEqualToString:@"iPad2,2"]) return @"iPad 2 (GSM)";
- if ([deviceModel isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)";
- if ([deviceModel isEqualToString:@"iPad2,4"]) return @"iPad 2 (32nm)";
- if ([deviceModel isEqualToString:@"iPad2,5"]) return @"iPad mini (WiFi)";
- if ([deviceModel isEqualToString:@"iPad2,6"]) return @"iPad mini (GSM)";
- if ([deviceModel isEqualToString:@"iPad2,7"]) return @"iPad mini (CDMA)";
-
- if ([deviceModel isEqualToString:@"iPad3,1"]) return @"iPad 3(WiFi)";
- if ([deviceModel isEqualToString:@"iPad3,2"]) return @"iPad 3(CDMA)";
- if ([deviceModel isEqualToString:@"iPad3,3"]) return @"iPad 3(4G)";
- if ([deviceModel isEqualToString:@"iPad3,4"]) return @"iPad 4 (WiFi)";
- if ([deviceModel isEqualToString:@"iPad3,5"]) return @"iPad 4 (4G)";
- if ([deviceModel isEqualToString:@"iPad3,6"]) return @"iPad 4 (CDMA)";
-
- if ([deviceModel isEqualToString:@"iPad4,1"]) return @"iPad Air";
- if ([deviceModel isEqualToString:@"iPad4,2"]) return @"iPad Air";
- if ([deviceModel isEqualToString:@"iPad4,3"]) return @"iPad Air";
- if ([deviceModel isEqualToString:@"iPad5,3"]) return @"iPad Air 2";
- if ([deviceModel isEqualToString:@"iPad5,4"]) return @"iPad Air 2";
- if ([deviceModel isEqualToString:@"i386"]) return @"Simulator";
- if ([deviceModel isEqualToString:@"x86_64"]) return @"Simulator";
-
- if ([deviceModel isEqualToString:@"iPad4,4"]
- ||[deviceModel isEqualToString:@"iPad4,5"]
- ||[deviceModel isEqualToString:@"iPad4,6"]) return @"iPad mini 2";
-
- if ([deviceModel isEqualToString:@"iPad4,7"]
- ||[deviceModel isEqualToString:@"iPad4,8"]
- ||[deviceModel isEqualToString:@"iPad4,9"]) return @"iPad mini 3";
-
- return deviceModel;
- }
- @end
|