Tools.m 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. //
  2. // Tools.m
  3. // jiaPeiC
  4. //
  5. // Created by apple on 16/3/12.
  6. // Copyright © 2016年 JCZ. All rights reserved.
  7. //
  8. #import "Tools.h"
  9. #import "SDSoundPlayer.h"
  10. #import "sys/utsname.h"
  11. #import "NetManager.h"
  12. @implementation Tools
  13. #pragma mark - iphoneX验证
  14. + (BOOL)isIPhoneX {
  15. struct utsname systemInfo;
  16. uname(&systemInfo);
  17. NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding];
  18. if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"]) {
  19. // 模拟器下采用屏幕的高度来判断
  20. return [UIScreen mainScreen].bounds.size.height == 812;
  21. }
  22. // iPhone10,6是美版iPhoneX 感谢hegelsu指出:https://github.com/banchichen/TZImagePickerController/issues/635
  23. BOOL isIPhoneX = [platform isEqualToString:@"iPhone10,3"] || [platform isEqualToString:@"iPhone10,6"];
  24. return isIPhoneX;
  25. }
  26. #pragma mark - 获取已知名字文件路径
  27. // 记得是文件 不是文件夹路径
  28. + (NSString *)getPathWithFileName:(NSString *)fileName
  29. {
  30. NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
  31. NSString *filePath = [document stringByAppendingPathComponent:fileName];
  32. return filePath;
  33. }
  34. #pragma mark - 验证是否是电话号码
  35. + (BOOL)isMobileNumber:(NSString *)mobileNum
  36. {
  37. // 电信号段:133/153/180/181/189/177
  38. // 联通号段:130/131/132/155/156/185/186/145/176
  39. // 移动号段:134/135/136/137/138/139/150/151/152/157/158/159/182/183/184/187/188/147/178
  40. // 虚拟运营商:170
  41. NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[06-8])\\d{8}$";
  42. NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
  43. return [regextestmobile evaluateWithObject:mobileNum];
  44. }
  45. #pragma mark - 播报声音
  46. +(void)playAudioWithString:(NSString *)string
  47. {
  48. SDSoundPlayer *player = [SDSoundPlayer SDSoundPlayerInit];
  49. [player setDefaultWithVolume:-1.0 rate:0.5 pitchMultiplier:1.2];
  50. [player play:string];
  51. }
  52. #pragma mark - 根据图片二进制流获取图片格式
  53. + (NSString *)typeForImageData:(NSData *)data {
  54. uint8_t c;
  55. [data getBytes:&c length:1];
  56. switch (c) {
  57. case 0xFF:
  58. return @"jpeg";
  59. case 0x89:
  60. return @"png";
  61. case 0x47:
  62. return @"gif";
  63. case 0x49:
  64. case 0x4D:
  65. return @"tiff";
  66. }
  67. return @"jpg";
  68. }
  69. #pragma mark - 结合keychain的存储
  70. //存
  71. + (void)save:(NSString *)service data:(id)data {
  72. //Get search dictionary
  73. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  74. //Delete old item before add new item
  75. SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
  76. //Add new object to search dictionary(Attention:the data format)
  77. [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData];
  78. //Add item to keychain with the search dictionary
  79. SecItemAdd((__bridge CFDictionaryRef)keychainQuery, NULL);
  80. }
  81. + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
  82. return [NSMutableDictionary dictionaryWithObjectsAndKeys:
  83. (__bridge id)kSecClassGenericPassword,(__bridge id)kSecClass,
  84. service, (__bridge id)kSecAttrService,
  85. service, (__bridge id)kSecAttrAccount,
  86. (__bridge id)kSecAttrAccessibleAfterFirstUnlock,(__bridge id)kSecAttrAccessible,
  87. nil];
  88. }
  89. //取
  90. + (id)load:(NSString *)service {
  91. id ret = nil;
  92. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  93. //Configure the search setting
  94. //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
  95. [keychainQuery setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
  96. [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
  97. CFDataRef keyData = NULL;
  98. if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
  99. @try {
  100. ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
  101. } @catch (NSException *e) {
  102. NSLog(@"Unarchive of %@ failed: %@", service, e);
  103. } @finally {
  104. }
  105. }
  106. if (keyData)
  107. CFRelease(keyData);
  108. return ret;
  109. }
  110. //删除
  111. + (void)delete:(NSString *)service {
  112. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  113. SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
  114. }
  115. #pragma mark - 权限验证
  116. +(void)permissionValidationWithID:(NSString *)str
  117. view:(UIView *)view
  118. result:(GetResult)result
  119. {
  120. NSMutableDictionary * mdic = [NSMutableDictionary new];
  121. [mdic setValue:defUser.userDict[@"id"] forKey:@"userId"];
  122. [mdic setValue:str forKey:@"id"];
  123. [MBProgressHUD showLoadToView:view];
  124. [NetManager requestAnythingWithURL:@"showMenu" dictionary:mdic dataArray:nil completion:^(NSDictionary *root) {
  125. [MBProgressHUD hideHUDForView:view animated:NO];
  126. if (!root) {
  127. result(NO,@"请求失败");
  128. return;
  129. }
  130. if ([root[@"code"] integerValue] == 1) {
  131. result(NO,root[@"msg"]);
  132. return;
  133. }
  134. result(YES,nil);
  135. }];
  136. }
  137. @end