iPhone.m 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. //
  2. // IPhoneDeviceManager.m
  3. // VclustersGemini
  4. //
  5. // Created by APPLE on 2019/6/14.
  6. // Copyright © 2019 APPLE. All rights reserved.
  7. //
  8. #import "iPhone.h"
  9. #import <sys/utsname.h>
  10. #import <ifaddrs.h>
  11. #import <arpa/inet.h>
  12. /* 运营商 首先需要引入以下两个系统类:*/
  13. #import <CoreTelephony/CTCarrier.h>
  14. #import <CoreTelephony/CTTelephonyNetworkInfo.h>
  15. #import "KeychainHelper.h"
  16. @implementation iPhone
  17. static iPhone *shareInstance = nil;
  18. + (iPhone *)shareInstance
  19. {
  20. static dispatch_once_t onceToken;
  21. dispatch_once(&onceToken, ^{
  22. shareInstance = [[iPhone alloc]init];
  23. });
  24. return shareInstance;
  25. }
  26. #pragma mark 手机相关参数
  27. + (NSString*)phoneDeviceIPAddress
  28. {
  29. NSString *address = @"error";
  30. struct ifaddrs *interfaces = NULL;
  31. struct ifaddrs *temp_addr = NULL;
  32. int success = 0;
  33. // 检索当前接口,在成功时,返回0
  34. success = getifaddrs(&interfaces);
  35. if (success == 0) {
  36. // 循环链表的接口
  37. temp_addr = interfaces;
  38. while(temp_addr != NULL) {
  39. if(temp_addr->ifa_addr->sa_family == AF_INET) {
  40. // 检查接口是否en0 wifi连接在iPhone上
  41. if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
  42. // 得到NSString从C字符串
  43. address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
  44. }
  45. }
  46. temp_addr = temp_addr->ifa_next;
  47. }
  48. }
  49. // 释放内存
  50. freeifaddrs(interfaces);
  51. return address;
  52. }
  53. static NSString *MyKeyChainUUIDStr = nil;
  54. + (NSString*)phoneDeviceUuid
  55. {
  56. if (MyKeyChainUUIDStr) {
  57. return MyKeyChainUUIDStr;
  58. }
  59. NSString *MyKeyChainUUID = [KeychainHelper getStringForKey:@"MyKeyChainUUID"];
  60. if(MyKeyChainUUID){
  61. MyKeyChainUUIDStr = MyKeyChainUUID;
  62. return MyKeyChainUUID;
  63. }
  64. NSString *UUIDString = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
  65. BOOL isSuc = [KeychainHelper saveString:UUIDString forKey:@"MyKeyChainUUID"];
  66. if (isSuc) {
  67. HLog(@"保存UUID成功")
  68. }
  69. return UUIDString;
  70. }
  71. + (NSString*)phoneDeviceType
  72. {
  73. struct utsname systemInfo;
  74. uname(&systemInfo);
  75. NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
  76. if ([deviceModel isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
  77. if ([deviceModel isEqualToString:@"iPhone3,2"]) return @"iPhone 4";
  78. if ([deviceModel isEqualToString:@"iPhone3,3"]) return @"iPhone 4";
  79. if ([deviceModel isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
  80. if ([deviceModel isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
  81. if ([deviceModel isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (GSM+CDMA)";
  82. if ([deviceModel isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (GSM)";
  83. if ([deviceModel isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (GSM+CDMA)";
  84. if ([deviceModel isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (GSM)";
  85. if ([deviceModel isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (GSM+CDMA)";
  86. if ([deviceModel isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
  87. if ([deviceModel isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
  88. if ([deviceModel isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
  89. if ([deviceModel isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
  90. if ([deviceModel isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
  91. // 日行两款手机型号均为日本独占,可能使用索尼FeliCa支付方案而不是苹果支付
  92. if ([deviceModel isEqualToString:@"iPhone9,1"]) return @"国行、日版、港行iPhone 7";
  93. if ([deviceModel isEqualToString:@"iPhone9,2"]) return @"港行、国行iPhone 7 Plus";
  94. if ([deviceModel isEqualToString:@"iPhone9,3"]) return @"美版、台版iPhone 7";
  95. if ([deviceModel isEqualToString:@"iPhone9,4"]) return @"美版、台版iPhone 7 Plus";
  96. if ([deviceModel isEqualToString:@"iPhone10,1"]) return @"iPhone_8";
  97. if ([deviceModel isEqualToString:@"iPhone10,4"]) return @"iPhone_8";
  98. if ([deviceModel isEqualToString:@"iPhone10,2"]) return @"iPhone_8_Plus";
  99. if ([deviceModel isEqualToString:@"iPhone10,5"]) return @"iPhone_8_Plus";
  100. if ([deviceModel isEqualToString:@"iPhone10,3"]) return @"iPhone_X";
  101. if ([deviceModel isEqualToString:@"iPhone10,6"]) return @"iPhone_X";
  102. if ([deviceModel isEqualToString:@"iPhone11,2"]) return @"iPhone XS";
  103. if ([deviceModel isEqualToString:@"iPhone11,4"]) return @"iPhone XS Max";
  104. if ([deviceModel isEqualToString:@"iPhone11,6"]) return @"iPhone XS Max";
  105. if ([deviceModel isEqualToString:@"iPhone11,8"]) return @"iPhone XR";
  106. if ([deviceModel isEqualToString:@"iPhone12,1"]) return @"iPhone 11";
  107. if ([deviceModel isEqualToString:@"iPhone12,3"]) return @"iPhone 11 Pro";
  108. if ([deviceModel isEqualToString:@"iPhone12,5"]) return @"iPhone 11 Pro Max";
  109. if ([deviceModel isEqualToString:@"iPhone12,8"]) return @"iPhone SE2";
  110. if ([deviceModel isEqualToString:@"iPhone13,1"]) return @"iPhone 12 mini";
  111. if ([deviceModel isEqualToString:@"iPhone13,2"]) return @"iPhone 12";
  112. if ([deviceModel isEqualToString:@"iPhone13,3"]) return @"iPhone 12 Pro";
  113. if ([deviceModel isEqualToString:@"iPhone13,4"]) return @"iPhone 12 Pro Max";
  114. if ([deviceModel isEqualToString:@"iPhone14,4"]) return @"iPhone 13 mini";
  115. if ([deviceModel isEqualToString:@"iPhone14,5"]) return @"iPhone 13";
  116. if ([deviceModel isEqualToString:@"iPhone14,2"]) return @"iPhone 13 Pro";
  117. if ([deviceModel isEqualToString:@"iPhone14,3"]) return @"iPhone 13 Pro Max";
  118. // iPod
  119. if ([deviceModel isEqualToString:@"iPod1,1"]) return @"iPod Touch 1";
  120. if ([deviceModel isEqualToString:@"iPod2,1"]) return @"iPod Touch 2";
  121. if ([deviceModel isEqualToString:@"iPod3,1"]) return @"iPod Touch 3";
  122. if ([deviceModel isEqualToString:@"iPod4,1"]) return @"iPod Touch 4";
  123. if ([deviceModel isEqualToString:@"iPod5,1"]) return @"iPod Touch 5";
  124. if ([deviceModel isEqualToString:@"iPod7,1"]) return @"iPod Touch 6";
  125. if ([deviceModel isEqualToString:@"iPod9,1"]) return @"iPod Touch 7";
  126. // iPad
  127. if ([deviceModel isEqualToString:@"iPad1,1"]) return @"iPad 1";
  128. if ([deviceModel isEqualToString:@"iPad2,1"]) return @"iPad 2";
  129. if ([deviceModel isEqualToString:@"iPad2,2"]) return @"iPad 2";
  130. if ([deviceModel isEqualToString:@"iPad2,3"]) return @"iPad 2";
  131. if ([deviceModel isEqualToString:@"iPad2,4"]) return @"iPad 2";
  132. if ([deviceModel isEqualToString:@"iPad2,5"]) return @"iPad Mini 1";
  133. if ([deviceModel isEqualToString:@"iPad2,6"]) return @"iPad Mini 1";
  134. if ([deviceModel isEqualToString:@"iPad2,7"]) return @"iPad Mini 1";
  135. if ([deviceModel isEqualToString:@"iPad3,1"]) return @"iPad 3";
  136. if ([deviceModel isEqualToString:@"iPad3,2"]) return @"iPad 3";
  137. if ([deviceModel isEqualToString:@"iPad3,3"]) return @"iPad 3";
  138. if ([deviceModel isEqualToString:@"iPad3,4"]) return @"iPad 4";
  139. if ([deviceModel isEqualToString:@"iPad3,5"]) return @"iPad 4";
  140. if ([deviceModel isEqualToString:@"iPad3,6"]) return @"iPad 4";
  141. if ([deviceModel isEqualToString:@"iPad4,1"]) return @"iPad Air";
  142. if ([deviceModel isEqualToString:@"iPad4,2"]) return @"iPad Air";
  143. if ([deviceModel isEqualToString:@"iPad4,3"]) return @"iPad Air";
  144. if ([deviceModel isEqualToString:@"iPad4,4"]) return @"iPad mini 2";
  145. if ([deviceModel isEqualToString:@"iPad4,5"]) return @"iPad mini 2";
  146. if ([deviceModel isEqualToString:@"iPad4,6"]) return @"iPad mini 2";
  147. if ([deviceModel isEqualToString:@"iPad4,7"]) return @"iPad mini 3";
  148. if ([deviceModel isEqualToString:@"iPad4,8"]) return @"iPad mini 3";
  149. if ([deviceModel isEqualToString:@"iPad4,9"]) return @"iPad mini 3";
  150. if ([deviceModel isEqualToString:@"iPad5,1"]) return @"iPad mini 4";
  151. if ([deviceModel isEqualToString:@"iPad5,2"]) return @"iPad mini 4";
  152. if ([deviceModel isEqualToString:@"iPad5,3"]) return @"iPad Air 2";
  153. if ([deviceModel isEqualToString:@"iPad5,4"]) return @"iPad Air 2";
  154. if ([deviceModel isEqualToString:@"iPad6,3"]) return @"iPad Pro (9.7-inch)";
  155. if ([deviceModel isEqualToString:@"iPad6,4"]) return @"iPad Pro (9.7-inch)";
  156. if ([deviceModel isEqualToString:@"iPad6,7"]) return @"iPad Pro (12.9-inch)";
  157. if ([deviceModel isEqualToString:@"iPad6,8"]) return @"iPad Pro (12.9-inch)";
  158. if ([deviceModel isEqualToString:@"iPad6,11"]) return @"iPad 5";
  159. if ([deviceModel isEqualToString:@"iPad6,12"]) return @"iPad 5";
  160. if ([deviceModel isEqualToString:@"iPad7,1"]) return @"iPad Pro 2(12.9-inch)";
  161. if ([deviceModel isEqualToString:@"iPad7,2"]) return @"iPad Pro 2(12.9-inch)";
  162. if ([deviceModel isEqualToString:@"iPad7,3"]) return @"iPad Pro (10.5-inch)";
  163. if ([deviceModel isEqualToString:@"iPad7,4"]) return @"iPad Pro (10.5-inch)";
  164. if ([deviceModel isEqualToString:@"iPad7,5"]) return @"iPad 6";
  165. if ([deviceModel isEqualToString:@"iPad7,6"]) return @"iPad 6";
  166. if ([deviceModel isEqualToString:@"iPad7,11"]) return @"iPad 7";
  167. if ([deviceModel isEqualToString:@"iPad7,12"]) return @"iPad 7";
  168. if ([deviceModel isEqualToString:@"iPad8,1"]) return @"iPad Pro (11-inch)";
  169. if ([deviceModel isEqualToString:@"iPad8,2"]) return @"iPad Pro (11-inch)";
  170. if ([deviceModel isEqualToString:@"iPad8,3"]) return @"iPad Pro (11-inch)";
  171. if ([deviceModel isEqualToString:@"iPad8,4"]) return @"iPad Pro (11-inch)";
  172. if ([deviceModel isEqualToString:@"iPad8,5"]) return @"iPad Pro 3 (12.9-inch)";
  173. if ([deviceModel isEqualToString:@"iPad8,6"]) return @"iPad Pro 3 (12.9-inch)";
  174. if ([deviceModel isEqualToString:@"iPad8,7"]) return @"iPad Pro 3 (12.9-inch)";
  175. if ([deviceModel isEqualToString:@"iPad8,8"]) return @"iPad Pro 3 (12.9-inch)";
  176. if ([deviceModel isEqualToString:@"iPad8,9"]) return @"iPad Pro 2 (11-inch)";
  177. if ([deviceModel isEqualToString:@"iPad8,10"]) return @"iPad Pro 2 (11-inch)";
  178. if ([deviceModel isEqualToString:@"iPad8,11"]) return @"iPad Pro 4 (12.9-inch)";
  179. if ([deviceModel isEqualToString:@"iPad8,12"]) return @"iPad Pro 4 (12.9-inch)";
  180. if ([deviceModel isEqualToString:@"iPad11,1"]) return @"iPad mini 5";
  181. if ([deviceModel isEqualToString:@"iPad11,2"]) return @"iPad mini 5";
  182. if ([deviceModel isEqualToString:@"iPad11,3"]) return @"iPad Air 3";
  183. if ([deviceModel isEqualToString:@"iPad11,4"]) return @"iPad Air 3";
  184. if ([deviceModel isEqualToString:@"iPad11,6"]) return @"iPad 8";
  185. if ([deviceModel isEqualToString:@"iPad11,7"]) return @"iPad 8";
  186. if ([deviceModel isEqualToString:@"iPad12,1"]) return @"iPad 9";
  187. if ([deviceModel isEqualToString:@"iPad12,2"]) return @"iPad 9";
  188. if ([deviceModel isEqualToString:@"iPad13,1"]) return @"iPad Air 4";
  189. if ([deviceModel isEqualToString:@"iPad13,2"]) return @"iPad Air 4";
  190. if ([deviceModel isEqualToString:@"iPad13,4"]) return @"iPad Pro 4 (11-inch)";
  191. if ([deviceModel isEqualToString:@"iPad13,5"]) return @"iPad Pro 4 (11-inch)";
  192. if ([deviceModel isEqualToString:@"iPad13,6"]) return @"iPad Pro 4 (11-inch)";
  193. if ([deviceModel isEqualToString:@"iPad13,7"]) return @"iPad Pro 4 (11-inch)";
  194. if ([deviceModel isEqualToString:@"iPad13,8"]) return @"iPad Pro 5 (12.9-inch)";
  195. if ([deviceModel isEqualToString:@"iPad13,9"]) return @"iPad Pro 5 (12.9-inch)";
  196. if ([deviceModel isEqualToString:@"iPad13,10"]) return @"iPad Pro 5 (12.9-inch)";
  197. if ([deviceModel isEqualToString:@"iPad13,11"]) return @"iPad Pro 5 (12.9-inch)";
  198. if ([deviceModel isEqualToString:@"iPad14,1"]) return @"iPad mini 6";
  199. if ([deviceModel isEqualToString:@"iPad14,2"]) return @"iPad mini 6";
  200. if ([deviceModel isEqualToString:@"AppleTV2,1"]) return @"Apple TV 2";
  201. if ([deviceModel isEqualToString:@"AppleTV3,1"]) return @"Apple TV 3";
  202. if ([deviceModel isEqualToString:@"AppleTV3,2"]) return @"Apple TV 3";
  203. if ([deviceModel isEqualToString:@"AppleTV5,3"]) return @"Apple TV 4";
  204. if ([deviceModel isEqualToString:@"i386"]) return @"Simulator";
  205. if ([deviceModel isEqualToString:@"x86_64"]) return @"Simulator";
  206. return deviceModel;
  207. }
  208. + (NSString*)appVersion
  209. {
  210. NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
  211. NSString *appVersion = [infoDic objectForKey:@"CFBundleShortVersionString"];
  212. return appVersion;
  213. }
  214. + (NSString*)appBuildNumber
  215. {
  216. // 获取应用构建号(Build Number)
  217. NSString *build = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
  218. NSLog(@"Build: %@", build);
  219. return build;
  220. }
  221. + (NSString*)phoneVersion
  222. {
  223. NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];
  224. return phoneVersion;
  225. }
  226. + (NSString*)appBundleName
  227. {
  228. NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
  229. //NSString *appVersion = [infoDic objectForKey:@"CFBundleName"];
  230. NSString *appVersion = [infoDic objectForKey:@"CFBundleDisplayName"];
  231. return appVersion;
  232. }
  233. + (NSString *)resolution
  234. {
  235. CGRect rect = [[UIScreen mainScreen] bounds];
  236. CGSize size = rect.size;
  237. CGFloat width = size.width;
  238. CGFloat height = size.height;
  239. NSLog(@"print %f,%f", width, height);
  240. //分辨率
  241. CGFloat scale_screen = [UIScreen mainScreen].scale;
  242. return [NSString stringWithFormat:@"%d*%d", (int)(width * scale_screen), (int)(height * scale_screen)];
  243. }
  244. #pragma mark 验证邮箱格式
  245. + (BOOL)validateEmail:(NSString *)email
  246. {
  247. NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
  248. NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
  249. return [emailTest evaluateWithObject:email];
  250. }
  251. #pragma mark 验证手机号码是否有效
  252. + (BOOL)isVaildPhoneNo:(NSString *)mobileNum
  253. {
  254. if (mobileNum.length != 11)
  255. {
  256. return NO;
  257. }
  258. NSString *NEWSTAND = @"^1([3-9])([0-9])\\d{8}$";
  259. /**
  260. * 手机号码:
  261. * 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[6, 7, 8], 18[0-9], 170[0-9]
  262. * 移动号段: 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705
  263. * 联通号段: 130,131,132,155,156,185,186,145,176,1709
  264. * 电信号段: 133,153,180,181,189,177,1700
  265. */
  266. NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[0678])\\d{8}$";
  267. /**
  268. * 中国移动:China Mobile
  269. * 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,148,178,1705,172,198
  270. */
  271. NSString *CM = @"(^1(3[4-9]|4[78]|5[0-27-9]|7[28]|8[2-478]|9[8])\\d{8}$)|(^1705\\d{7}$)";
  272. /**
  273. * 中国联通:China Unicom
  274. * 130,131,132,155,156,185,186,145,146,176,1709,166,171,175
  275. */
  276. NSString *CU = @"(^1(3[0-2]|4[56]|5[56]|6[6]|7[156]|8[56])\\d{8}$)|(^1709\\d{7}$)";
  277. /**
  278. * 中国电信:China Telecom
  279. * 133,153,180,181,189,177,1700,199.170.173,174,177
  280. */
  281. NSString *CT = @"(^1(49|99|33|53|77|70|7[34]|8[019])\\d{8}$)|(^1700\\d{7}$)";
  282. NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
  283. NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
  284. NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
  285. NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
  286. NSPredicate *regextestNe = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", NEWSTAND];
  287. if (([regextestmobile evaluateWithObject:mobileNum] == YES)
  288. || ([regextestcm evaluateWithObject:mobileNum] == YES)
  289. || ([regextestct evaluateWithObject:mobileNum] == YES)
  290. || ([regextestcu evaluateWithObject:mobileNum] == YES)
  291. || ([regextestNe evaluateWithObject:mobileNum] == YES))
  292. {
  293. return YES;
  294. }
  295. else
  296. {
  297. return NO;
  298. }
  299. }
  300. #pragma mark 验证身份证
  301. /**验证身份证*/
  302. //必须满足以下规则
  303. //1. 长度必须是18位,前17位必须是数字,第十八位可以是数字或X
  304. //2. 前两位必须是以下情形中的一种:11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91
  305. //3. 第7到第14位出生年月日。第7到第10位为出生年份;11到12位表示月份,范围为01-12;13到14位为合法的日期
  306. //4. 第17位表示性别,双数表示女,单数表示男
  307. //5. 第18位为前17位的校验位
  308. //算法如下:
  309. //(1)校验和 = (n1 + n11) * 7 + (n2 + n12) * 9 + (n3 + n13) * 10 + (n4 + n14) * 5 + (n5 + n15) * 8 + (n6 + n16) * 4 + (n7 + n17) * 2 + n8 + n9 * 6 + n10 * 3,其中n数值,表示第几位的数字
  310. //(2)余数 = 校验和 % 11
  311. //(3)如果余数为0,校验位应为1,余数为1到10校验位应为字符串“0X98765432”(不包括分号)的第余数位的值(比如余数等于3,校验位应为9)
  312. //6. 出生年份的前两位必须是19或20
  313. + (BOOL)verifyIDCardNumber:(NSString *)value
  314. {
  315. value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  316. if ([value length] != 18) {
  317. return NO;
  318. }
  319. NSString *mmdd = @"(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))";
  320. NSString *leapMmdd = @"0229";
  321. NSString *year = @"(19|20)[0-9]{2}";
  322. NSString *leapYear = @"(19|20)(0[48]|[2468][048]|[13579][26])";
  323. NSString *yearMmdd = [NSString stringWithFormat:@"%@%@", year, mmdd];
  324. NSString *leapyearMmdd = [NSString stringWithFormat:@"%@%@", leapYear, leapMmdd];
  325. NSString *yyyyMmdd = [NSString stringWithFormat:@"((%@)|(%@)|(%@))", yearMmdd, leapyearMmdd, @"20000229"];
  326. NSString *area = @"(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|82|[7-9]1)[0-9]{4}";
  327. NSString *regex = [NSString stringWithFormat:@"%@%@%@", area, yyyyMmdd , @"[0-9]{3}[0-9Xx]"];
  328. NSPredicate *regexTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
  329. if (![regexTest evaluateWithObject:value]) {
  330. return NO;
  331. }
  332. int summary = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7
  333. + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9
  334. + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10
  335. + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5
  336. + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8
  337. + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4
  338. + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2
  339. + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6
  340. + [value substringWithRange:NSMakeRange(9,1)].intValue *3;
  341. NSInteger remainder = summary % 11;
  342. NSString *checkBit = @"";
  343. NSString *checkString = @"10X98765432";
  344. checkBit = [checkString substringWithRange:NSMakeRange(remainder,1)];// 判断校验位
  345. return [checkBit isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]];
  346. }
  347. #pragma mark 获取运营商名称
  348. /**获取运营商名称*/
  349. + (NSString *)getCarrierInfo
  350. {
  351. CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init];
  352. CTCarrier *carrier = nil;
  353. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 12.1) {
  354. if ([telephonyInfo respondsToSelector:@selector(serviceSubscriberCellularProviders)]) {
  355. #pragma clang diagnostic push
  356. #pragma clang diagnostic ignored "-Wunguarded-availability-new"
  357. NSDictionary *dic = [telephonyInfo serviceSubscriberCellularProviders];
  358. if (dic.allKeys.count) {
  359. carrier = [dic objectForKey:dic.allKeys[0]];
  360. }
  361. #pragma clang diagnostic pop
  362. }
  363. }
  364. if(!carrier) {
  365. //遇到的 warning 又明知干不掉的时候就用这种方法隐藏即可,-Wdeprecated-declarations
  366. #pragma clang diagnostic push
  367. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  368. carrier = telephonyInfo.subscriberCellularProvider;
  369. #pragma clang diagnostic pop
  370. }
  371. //countryCode,移动国家码,MCC的资源由国际电联(ITU)统一分配和管理,唯一识别移动用户所属的国家,共3位,中国为460;
  372. NSString *countryCode = [carrier mobileCountryCode];
  373. //code,移动网络码,共2位,中国移动TD系统使用00,中国联通GSM系统使用01,中国移动GSM系统使用02,中国电信CDMA系统使用03,一个典型的IMSI号码为460030912121001
  374. NSString *code = [carrier mobileNetworkCode];
  375. //网络运营商的名字
  376. NSString *carrier_name = @"";
  377. //用户运营商网络 (中国电信:CHINANET,中国联通:UNICOM,中国移动:CMNET,中国铁通:CRTC,中国广电:GCABLENET)
  378. if ([countryCode isEqualToString:@"460"] && countryCode && code) {
  379. if ([code isEqualToString:@"00"] || [code isEqualToString:@"02"] || [code isEqualToString:@"04"] || [code isEqualToString:@"07"] || [code isEqualToString:@"08"]|| [code isEqualToString:@"13"]) {
  380. carrier_name = @"CMNET";
  381. }
  382. else if ([code isEqualToString:@"03"] || [code isEqualToString:@"05"] || [code isEqualToString:@"11"] || [code isEqualToString:@"12"])
  383. {
  384. carrier_name = @"CHINANET";
  385. }
  386. else if ([code isEqualToString:@"01"] || [code isEqualToString:@"06"] || [code isEqualToString:@"09"] || [code isEqualToString:@"10"])
  387. {
  388. carrier_name = @"UNICOM";
  389. }
  390. else if ([code isEqualToString:@"20"])
  391. {
  392. carrier_name = @"CRTC";
  393. }
  394. else if ([code isEqualToString:@"15"])
  395. {
  396. carrier_name = @"GCABLENET";
  397. }
  398. }
  399. return carrier_name;
  400. }
  401. @end