DeviceInfo.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. //
  2. // DeviceInfo.m
  3. // hello
  4. //
  5. // Created by 罗国 on 2019/1/25.
  6. //
  7. #import "DeviceInfo.h"
  8. #import "sys/utsname.h"
  9. //淘宝外网IP接口
  10. #define PUBLIC_IP_ADDRESS_API @"http://ip.taobao.com/service/getIpInfo.php?ip=myip"
  11. @implementation DeviceInfo
  12. + (NSString *)deviceVersion
  13. {
  14. struct utsname systemInfo;
  15. uname(&systemInfo);
  16. NSString * deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
  17. NSLog(@"device: %@", deviceString);
  18. //iPhone
  19. if ([deviceString isEqualToString:@"iPhone1,1"]) return @"iPhone 1G";
  20. if ([deviceString isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
  21. if ([deviceString isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
  22. if ([deviceString isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
  23. if ([deviceString isEqualToString:@"iPhone3,2"]) return @"iPhone 4";
  24. if ([deviceString isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
  25. if ([deviceString isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
  26. if ([deviceString isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
  27. if ([deviceString isEqualToString:@"iPhone5,3"]) return @"iPhone 5C";
  28. if ([deviceString isEqualToString:@"iPhone5,4"]) return @"iPhone 5C";
  29. if ([deviceString isEqualToString:@"iPhone6,1"]) return @"iPhone 5S";
  30. if ([deviceString isEqualToString:@"iPhone6,2"]) return @"iPhone 5S";
  31. if ([deviceString isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
  32. if ([deviceString isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
  33. if ([deviceString isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
  34. if ([deviceString isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
  35. if ([deviceString isEqualToString:@"iPhone9,1"]) return @"iPhone 7";
  36. if ([deviceString isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus";
  37. if ([deviceString isEqualToString:@"iPhone10,1"]) return @"iPhone 8";
  38. if ([deviceString isEqualToString:@"iPhone10,4"]) return @"iPhone 8";
  39. if ([deviceString isEqualToString:@"iPhone10,2"]) return @"iPhone 8 Plus";
  40. if ([deviceString isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus";
  41. if ([deviceString isEqualToString:@"iPhone10,3"]) return @"iPhone X";
  42. if ([deviceString isEqualToString:@"iPhone10,6"]) return @"iPhone X";
  43. if ([deviceString isEqualToString:@"iPhone11,2"]) return @"iPhone XS";
  44. if ([deviceString isEqualToString:@"iPhone11,4"]) return @"iPhone XS Max";
  45. if ([deviceString isEqualToString:@"iPhone11,6"]) return @"iPhone XS Max";
  46. if ([deviceString isEqualToString:@"iPhone11,8"]) return @"iPhone XR";
  47. return deviceString;
  48. }
  49. + (BOOL)isLessThanIphone6s
  50. {
  51. struct utsname systemInfo;
  52. uname(&systemInfo);
  53. NSString * deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
  54. NSLog(@"device: %@", deviceString);
  55. if ([deviceString isEqualToString:@"iPhone1,1"]) return YES;
  56. if ([deviceString isEqualToString:@"iPhone1,2"]) return YES;
  57. if ([deviceString isEqualToString:@"iPhone2,1"]) return YES;
  58. if ([deviceString isEqualToString:@"iPhone3,1"]) return YES;
  59. if ([deviceString isEqualToString:@"iPhone3,2"]) return YES;
  60. if ([deviceString isEqualToString:@"iPhone4,1"]) return YES;
  61. if ([deviceString isEqualToString:@"iPhone5,1"]) return YES;
  62. if ([deviceString isEqualToString:@"iPhone5,2"]) return YES;
  63. if ([deviceString isEqualToString:@"iPhone5,3"]) return YES;
  64. if ([deviceString isEqualToString:@"iPhone5,4"]) return YES;
  65. if ([deviceString isEqualToString:@"iPhone6,1"]) return YES;
  66. if ([deviceString isEqualToString:@"iPhone6,2"]) return YES;
  67. if ([deviceString isEqualToString:@"iPhone7,1"]) return YES;
  68. if ([deviceString isEqualToString:@"iPhone7,2"]) return YES;
  69. if ([deviceString isEqualToString:@"iPhone8,1"]) return YES;
  70. return NO;
  71. }
  72. + (BOOL)isAllDigits:(NSString *)str
  73. {
  74. NSCharacterSet* nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
  75. NSRange r = [str rangeOfCharacterFromSet: nonNumbers];
  76. return r.location == NSNotFound && str.length > 0;
  77. }
  78. +(BOOL)isProxyOpened
  79. {
  80. NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());
  81. //NSLog(@"%@", proxySettings);
  82. NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:@"http://www.baidu.com"]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));
  83. NSDictionary *settings = [proxies objectAtIndex:0];
  84. NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);
  85. NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
  86. NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);
  87. if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"])
  88. {
  89. NSLog(@">>>>>>没有设置代理");
  90. return NO;
  91. }
  92. NSLog(@">>>>>>设置了代理");
  93. return YES;
  94. }
  95. +(BOOL)isVPNConnected
  96. {
  97. NSDictionary * proxySettings = (__bridge NSDictionary *)CFNetworkCopySystemProxySettings();
  98. //NSLog(@"%@", proxySettings);
  99. NSArray * keys = [proxySettings[@"__SCOPED__"] allKeys];
  100. for (NSString * key in keys)
  101. {
  102. if ([key rangeOfString:@"tap"].location != NSNotFound ||
  103. [key rangeOfString:@"tun"].location != NSNotFound ||
  104. [key rangeOfString:@"ppp"].location != NSNotFound) {
  105. NSLog(@">>>>>>开启了VPN");
  106. return YES;
  107. }
  108. }
  109. NSLog(@">>>>>>没有开启VPN");
  110. return NO;
  111. }
  112. +(BOOL)isSimuLator
  113. {
  114. return (TARGET_IPHONE_SIMULATOR == 1 && TARGET_OS_IPHONE == 1) ? YES: NO;
  115. }
  116. +(NSString *)getWANIPAdress
  117. {
  118. NSError *error;
  119. NSURL*url = [NSURL URLWithString:PUBLIC_IP_ADDRESS_API];
  120. NSMutableString*content = [NSMutableString stringWithContentsOfURL:url
  121. encoding:NSUTF8StringEncoding
  122. error:&error];
  123. if (content == nil )
  124. {
  125. return nil;
  126. }
  127. NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:[content dataUsingEncoding:NSUTF8StringEncoding]
  128. options:NSJSONReadingMutableContainers
  129. error:nil];
  130. if (dic == nil)
  131. {
  132. return nil;
  133. }
  134. return dic[@"data"][@"ip"];
  135. }
  136. //获取用户唯一的id, 有则从keychain 获取, 无则生成。
  137. +(NSString*)getDeviceId
  138. {
  139. NSString*groupId = [self getDeviceIdFromKeychain];
  140. if ((groupId == nil) || (groupId.length==0))
  141. {
  142. return [self generDeviceId];
  143. }
  144. return groupId;
  145. }
  146. // 从keychain 获取设备唯一标志
  147. +(NSString*)getDeviceIdFromKeychain
  148. {
  149. NSMutableDictionary *tempDic = (NSMutableDictionary *)[self load:@"GroupId"];
  150. if (tempDic == nil)
  151. {
  152. return nil;
  153. }
  154. return [tempDic objectForKey:kPDDictionaryKey];
  155. }
  156. // 生成设备id
  157. +(NSString*)generDeviceId
  158. {
  159. struct timeval tv;
  160. gettimeofday(&tv, NULL);
  161. long lTime = tv.tv_sec * 1000 + tv.tv_usec / 1000;
  162. NSString*newGroupId = [NSString stringWithFormat:@"%ld",lTime];
  163. NSMutableDictionary *tempDic = [NSMutableDictionary dictionary];
  164. [tempDic setObject:newGroupId forKey:kPDDictionaryKey];
  165. [self save:@"GroupId" data:tempDic];
  166. return newGroupId;
  167. }
  168. static NSString * const kPDDictionaryKey = @"com.ssy.37chat.dictionaryKey";
  169. + (void)keyChainSave:(NSDictionary *)aDict
  170. {
  171. NSString *Key= [aDict objectForKey:@"key"];
  172. NSString *Value = [aDict objectForKey: @"value"];
  173. [self setKeyChainValue:Key withValue:Value];
  174. }
  175. + (void)setKeyChainValue:(NSString *)key withValue:( NSString *)value
  176. {
  177. if ((key != nil) && (value != nil))
  178. {
  179. NSMutableDictionary *tempDic = [NSMutableDictionary dictionary];
  180. [tempDic setObject:value forKey:kPDDictionaryKey];
  181. [self save:key data:tempDic];
  182. }
  183. }
  184. +(NSString *)getKeyChainValue:(NSString *)key
  185. {
  186. NSMutableDictionary *tempDic = (NSMutableDictionary *)[self load:key];
  187. return [tempDic objectForKey:kPDDictionaryKey];
  188. }
  189. +(NSString *)keyChainLoad:(NSDictionary *)aDict
  190. {
  191. NSString *kPDKeyChainKey= [aDict objectForKey:@"key"];
  192. return [self getKeyChainValue:kPDKeyChainKey];
  193. }
  194. + (void)keyChainDelete:(NSString *)kPDKeyChainKey{
  195. [self delete:kPDKeyChainKey];
  196. }
  197. + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
  198. return [NSMutableDictionary dictionaryWithObjectsAndKeys:
  199. (id)kSecClassGenericPassword,(id)kSecClass,
  200. service, (id)kSecAttrService,
  201. service, (id)kSecAttrAccount,
  202. (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
  203. nil];
  204. }
  205. + (void)save:(NSString *)service data:(id)data {
  206. //Get search dictionary
  207. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  208. //Delete old item before add new item
  209. SecItemDelete((CFDictionaryRef)keychainQuery);
  210. //Add new object to search dictionary(Attention:the data format)
  211. [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
  212. //Add item to keychain with the search dictionary
  213. SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
  214. }
  215. + (id)load:(NSString *)service {
  216. id ret = nil;
  217. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  218. //Configure the search setting
  219. //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
  220. [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
  221. [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
  222. CFDataRef keyData = NULL;
  223. if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
  224. @try {
  225. ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
  226. } @catch (NSException *e) {
  227. NSLog(@"Unarchive of %@ failed: %@", service, e);
  228. } @finally {
  229. }
  230. }
  231. if (keyData)
  232. CFRelease(keyData);
  233. return ret;
  234. }
  235. + (void)delete:(NSString *)service {
  236. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  237. SecItemDelete((CFDictionaryRef)keychainQuery);
  238. }
  239. //strTan 举例 7
  240. + (BOOL)isLessThan:(NSInteger)phoneVersion {
  241. struct utsname systemInfo;
  242. uname(&systemInfo);
  243. NSString * deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
  244. if(![deviceString hasPrefix:@"iPhone"]) {
  245. return NO;
  246. }
  247. NSArray *arr = [deviceString componentsSeparatedByString:@","];
  248. if(arr.count <= 1)
  249. return NO;
  250. NSString* sf = arr[0];
  251. sf = [sf stringByReplacingOccurrencesOfString:@"iPhone" withString:@""];
  252. if([sf integerValue] > 0 && [sf integerValue] <= phoneVersion)
  253. return YES;
  254. return NO;
  255. }
  256. @end