// // DeviceInfo.m // hello // // Created by 罗国 on 2019/1/25. // #import "DeviceInfo.h" #import "sys/utsname.h" //淘宝外网IP接口 #define PUBLIC_IP_ADDRESS_API @"http://ip.taobao.com/service/getIpInfo.php?ip=myip" @implementation DeviceInfo + (NSString *)deviceVersion { struct utsname systemInfo; uname(&systemInfo); NSString * deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; NSLog(@"device: %@", deviceString); //iPhone if ([deviceString isEqualToString:@"iPhone1,1"]) return @"iPhone 1G"; if ([deviceString isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; if ([deviceString isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS"; if ([deviceString isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; if ([deviceString isEqualToString:@"iPhone3,2"]) 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"; if ([deviceString isEqualToString:@"iPhone5,3"]) return @"iPhone 5C"; if ([deviceString isEqualToString:@"iPhone5,4"]) return @"iPhone 5C"; if ([deviceString isEqualToString:@"iPhone6,1"]) return @"iPhone 5S"; if ([deviceString isEqualToString:@"iPhone6,2"]) return @"iPhone 5S"; 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:@"iPhone9,1"]) return @"iPhone 7"; if ([deviceString isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus"; if ([deviceString isEqualToString:@"iPhone10,1"]) return @"iPhone 8"; if ([deviceString isEqualToString:@"iPhone10,4"]) return @"iPhone 8"; if ([deviceString isEqualToString:@"iPhone10,2"]) return @"iPhone 8 Plus"; if ([deviceString isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus"; if ([deviceString isEqualToString:@"iPhone10,3"]) return @"iPhone X"; if ([deviceString isEqualToString:@"iPhone10,6"]) return @"iPhone X"; if ([deviceString isEqualToString:@"iPhone11,2"]) return @"iPhone XS"; if ([deviceString isEqualToString:@"iPhone11,4"]) return @"iPhone XS Max"; if ([deviceString isEqualToString:@"iPhone11,6"]) return @"iPhone XS Max"; if ([deviceString isEqualToString:@"iPhone11,8"]) return @"iPhone XR"; return deviceString; } + (BOOL)isLessThanIphone6s { struct utsname systemInfo; uname(&systemInfo); NSString * deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; NSLog(@"device: %@", deviceString); if ([deviceString isEqualToString:@"iPhone1,1"]) return YES; if ([deviceString isEqualToString:@"iPhone1,2"]) return YES; if ([deviceString isEqualToString:@"iPhone2,1"]) return YES; if ([deviceString isEqualToString:@"iPhone3,1"]) return YES; if ([deviceString isEqualToString:@"iPhone3,2"]) return YES; if ([deviceString isEqualToString:@"iPhone4,1"]) return YES; if ([deviceString isEqualToString:@"iPhone5,1"]) return YES; if ([deviceString isEqualToString:@"iPhone5,2"]) return YES; if ([deviceString isEqualToString:@"iPhone5,3"]) return YES; if ([deviceString isEqualToString:@"iPhone5,4"]) return YES; if ([deviceString isEqualToString:@"iPhone6,1"]) return YES; if ([deviceString isEqualToString:@"iPhone6,2"]) return YES; if ([deviceString isEqualToString:@"iPhone7,1"]) return YES; if ([deviceString isEqualToString:@"iPhone7,2"]) return YES; if ([deviceString isEqualToString:@"iPhone8,1"]) return YES; return NO; } + (BOOL)isAllDigits:(NSString *)str { NSCharacterSet* nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; NSRange r = [str rangeOfCharacterFromSet: nonNumbers]; return r.location == NSNotFound && str.length > 0; } +(BOOL)isProxyOpened { NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings()); //NSLog(@"%@", proxySettings); NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:@"http://www.baidu.com"]), (__bridge CFDictionaryRef _Nonnull)(proxySettings))); NSDictionary *settings = [proxies objectAtIndex:0]; NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]); NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]); NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]); if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"]) { NSLog(@">>>>>>没有设置代理"); return NO; } NSLog(@">>>>>>设置了代理"); return YES; } +(BOOL)isVPNConnected { NSDictionary * proxySettings = (__bridge NSDictionary *)CFNetworkCopySystemProxySettings(); //NSLog(@"%@", proxySettings); NSArray * keys = [proxySettings[@"__SCOPED__"] allKeys]; for (NSString * key in keys) { if ([key rangeOfString:@"tap"].location != NSNotFound || [key rangeOfString:@"tun"].location != NSNotFound || [key rangeOfString:@"ppp"].location != NSNotFound) { NSLog(@">>>>>>开启了VPN"); return YES; } } NSLog(@">>>>>>没有开启VPN"); return NO; } +(BOOL)isSimuLator { return (TARGET_IPHONE_SIMULATOR == 1 && TARGET_OS_IPHONE == 1) ? YES: NO; } +(NSString *)getWANIPAdress { NSError *error; NSURL*url = [NSURL URLWithString:PUBLIC_IP_ADDRESS_API]; NSMutableString*content = [NSMutableString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; if (content == nil ) { return nil; } NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:[content dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil]; if (dic == nil) { return nil; } return dic[@"data"][@"ip"]; } //获取用户唯一的id, 有则从keychain 获取, 无则生成。 +(NSString*)getDeviceId { NSString*groupId = [self getDeviceIdFromKeychain]; if ((groupId == nil) || (groupId.length==0)) { return [self generDeviceId]; } return groupId; } // 从keychain 获取设备唯一标志 +(NSString*)getDeviceIdFromKeychain { NSMutableDictionary *tempDic = (NSMutableDictionary *)[self load:@"GroupId"]; if (tempDic == nil) { return nil; } return [tempDic objectForKey:kPDDictionaryKey]; } // 生成设备id +(NSString*)generDeviceId { struct timeval tv; gettimeofday(&tv, NULL); long lTime = tv.tv_sec * 1000 + tv.tv_usec / 1000; NSString*newGroupId = [NSString stringWithFormat:@"%ld",lTime]; NSMutableDictionary *tempDic = [NSMutableDictionary dictionary]; [tempDic setObject:newGroupId forKey:kPDDictionaryKey]; [self save:@"GroupId" data:tempDic]; return newGroupId; } static NSString * const kPDDictionaryKey = @"com.ssy.37chat.dictionaryKey"; + (void)keyChainSave:(NSDictionary *)aDict { NSString *Key= [aDict objectForKey:@"key"]; NSString *Value = [aDict objectForKey: @"value"]; [self setKeyChainValue:Key withValue:Value]; } + (void)setKeyChainValue:(NSString *)key withValue:( NSString *)value { if ((key != nil) && (value != nil)) { NSMutableDictionary *tempDic = [NSMutableDictionary dictionary]; [tempDic setObject:value forKey:kPDDictionaryKey]; [self save:key data:tempDic]; } } +(NSString *)getKeyChainValue:(NSString *)key { NSMutableDictionary *tempDic = (NSMutableDictionary *)[self load:key]; return [tempDic objectForKey:kPDDictionaryKey]; } +(NSString *)keyChainLoad:(NSDictionary *)aDict { NSString *kPDKeyChainKey= [aDict objectForKey:@"key"]; return [self getKeyChainValue:kPDKeyChainKey]; } + (void)keyChainDelete:(NSString *)kPDKeyChainKey{ [self delete:kPDKeyChainKey]; } + (NSMutableDictionary *)getKeychainQuery:(NSString *)service { return [NSMutableDictionary dictionaryWithObjectsAndKeys: (id)kSecClassGenericPassword,(id)kSecClass, service, (id)kSecAttrService, service, (id)kSecAttrAccount, (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible, nil]; } + (void)save:(NSString *)service data:(id)data { //Get search dictionary NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; //Delete old item before add new item SecItemDelete((CFDictionaryRef)keychainQuery); //Add new object to search dictionary(Attention:the data format) [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData]; //Add item to keychain with the search dictionary SecItemAdd((CFDictionaryRef)keychainQuery, NULL); } + (id)load:(NSString *)service { id ret = nil; NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; //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: %@", service, e); } @finally { } } if (keyData) CFRelease(keyData); return ret; } + (void)delete:(NSString *)service { NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; SecItemDelete((CFDictionaryRef)keychainQuery); } //strTan 举例 7 + (BOOL)isLessThan:(NSInteger)phoneVersion { struct utsname systemInfo; uname(&systemInfo); NSString * deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if(![deviceString hasPrefix:@"iPhone"]) { return NO; } NSArray *arr = [deviceString componentsSeparatedByString:@","]; if(arr.count <= 1) return NO; NSString* sf = arr[0]; sf = [sf stringByReplacingOccurrencesOfString:@"iPhone" withString:@""]; if([sf integerValue] > 0 && [sf integerValue] <= phoneVersion) return YES; return NO; } @end