PublicObj.m 78 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753
  1. //
  2. // PublicObj.m
  3. // YBVideo
  4. //
  5. // Created by YunBao on 2018/6/6.
  6. // Copyright © 2018年 cat. All rights reserved.
  7. //
  8. #import "PublicObj.h"
  9. #import <CommonCrypto/CommonCrypto.h>
  10. #import <MediaPlayer/MediaPlayer.h>
  11. #import <AVFoundation/AVFoundation.h>
  12. #import <WXApi.h>
  13. #import "RKUUIDManager.h"
  14. #import "sys/utsname.h"
  15. #import "UIImage+RKImgSize.h"
  16. #import <ShareSDK/ShareSDK.h>
  17. #import <JPUSHService.h>
  18. #import <CoreTelephony/CTTelephonyNetworkInfo.h>
  19. #import "YBInvitationView.h"
  20. #import "YBYoungSmall.h"
  21. @interface PublicObj()
  22. @property (nonatomic, strong) MPVolumeView *volumeView;
  23. @end
  24. @implementation PublicObj
  25. static PublicObj *_publicInstance = nil;
  26. +(instancetype)publicInstance{
  27. static dispatch_once_t onceToken;
  28. dispatch_once(&onceToken, ^{
  29. _publicInstance = [[super allocWithZone:NULL]init];
  30. });
  31. return _publicInstance;
  32. }
  33. + (instancetype)allocWithZone:(struct _NSZone *)zone{
  34. return [self publicInstance];
  35. }
  36. -(MPVolumeView *)volumeView {
  37. if (!_volumeView) {
  38. _volumeView = [[MPVolumeView alloc] init];
  39. _volumeView.frame = CGRectMake(-1000, -1000, 100, 100);
  40. }
  41. return _volumeView;
  42. }
  43. /// 添加系统音量view
  44. - (void)addSystemVolumeView {
  45. [self.volumeView removeFromSuperview];
  46. }
  47. /// 移除系统音量view
  48. - (void)removeSystemVolumeView {
  49. [[UIApplication sharedApplication].keyWindow addSubview:self.volumeView];
  50. }
  51. - (void)addCusDelayedRemove;{
  52. [self removeSystemVolumeView];
  53. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  54. [self addSystemVolumeView];
  55. });
  56. }
  57. #pragma mark - 单行文本长度计算
  58. +(CGSize)sizeWithString:(NSString *)string andFont:(UIFont *)font {
  59. CGSize size = [string sizeWithAttributes:[NSDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName, nil]];
  60. return size;
  61. }
  62. #pragma mark - 多行计算frame
  63. +(CGRect)rectWithString:(NSString *)string andFont:(UIFont *)font maxWidth:(CGFloat)width {
  64. CGRect rect = [string boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName, nil] context:nil];
  65. return rect;
  66. }
  67. #pragma mark - 登录逾期
  68. +(void)tokenExpired:(NSString *)msg {
  69. if (![PublicObj checkNull:msg]) {
  70. [MBProgressHUD showPop:msg];
  71. }
  72. if ([[YBBaseAppDelegate sharedAppDelegate].topViewController isKindOfClass:[DspLoginVC class]]) {
  73. return;
  74. }
  75. [self resetUserToVisitor];
  76. DspLoginVC *login = [[DspLoginVC alloc]init];
  77. login.showAlert = YES;
  78. login.isOverdue = YES;
  79. [[YBBaseAppDelegate sharedAppDelegate] pushViewController:login animated:NO];
  80. /*
  81. //延迟1.3在跳回,因为YBMsgPop提示动画是1.2,直接跳动画就销毁了
  82. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  83. UIApplication *app =[UIApplication sharedApplication];
  84. AppDelegate *app2 = (AppDelegate*)app.delegate;
  85. DspLoginVC *login = [[DspLoginVC alloc]init];
  86. UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:login];
  87. app2.window.rootViewController = nav;
  88. });*/
  89. }
  90. #pragma mark - 返回游客信息
  91. +(NSDictionary *)visitorDic{
  92. NSDictionary *dic = @{
  93. @"age":@"18",
  94. @"coin":@"0",
  95. @"area":@"",
  96. @"avatar" : @"http://livedemo.yunbaozhibo.com/default.jpg",
  97. @"avatar_thumb" : @"http://livedemo.yunbaozhibo.com/default_thumb.jpg",
  98. @"birthday" : @"",
  99. @"city" : @"",
  100. @"code" : @"",
  101. @"hometown":@"",
  102. @"id" : @"-9999",
  103. @"isreg" : @"0",
  104. @"province" : @"",
  105. @"sex" : @"2",
  106. @"signature" : @"",
  107. @"token" : @"-9999",
  108. @"user_nickname" : @"游客",
  109. };
  110. return dic;
  111. }
  112. #pragma mark - 提醒游客请登录
  113. +(void)warnLogin {
  114. //有弹窗--提示是否登录
  115. /*
  116. UIViewController *currentVC = [UIApplication sharedApplication].keyWindow.rootViewController;
  117. UIAlertController *alertContro = [UIAlertController alertControllerWithTitle:@"提示" message:@"请先登录" preferredStyle:UIAlertControllerStyleAlert];
  118. UIAlertAction *cancleAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  119. }];
  120. [alertContro addAction:cancleAction];
  121. UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  122. DspLoginVC *login =[[DspLoginVC alloc]init];
  123. login.youke = @"youke";
  124. UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:login];
  125. [currentVC presentViewController:navi animated:YES completion:nil];
  126. }];
  127. [alertContro addAction:sureAction];
  128. [currentVC presentViewController:alertContro animated:YES completion:nil];
  129. */
  130. //无弹窗--直接进入登录
  131. /*
  132. UIViewController *currentVC = [UIApplication sharedApplication].keyWindow.rootViewController;
  133. DspLoginVC *login =[[DspLoginVC alloc]init];
  134. login.youke = @"youke";
  135. UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:login];
  136. [currentVC presentViewController:navi animated:YES completion:nil];
  137. */
  138. DspLoginVC *login = [[DspLoginVC alloc]init];
  139. login.showAlert = YES;
  140. [[YBBaseAppDelegate sharedAppDelegate] pushViewController:login animated:NO];
  141. }
  142. #pragma mark - 根据色值获取图片
  143. +(UIImage*)getImgWithColor:(UIColor *)color {
  144. CGRect rect = CGRectMake(0.0f,0.0f, 1.0f,1.0f);
  145. UIGraphicsBeginImageContext(rect.size);
  146. CGContextRef context =UIGraphicsGetCurrentContext();
  147. CGContextSetFillColorWithColor(context, [color CGColor]);
  148. CGContextFillRect(context, rect);
  149. UIImage *image =UIGraphicsGetImageFromCurrentImageContext();
  150. UIGraphicsEndImageContext();
  151. return image;
  152. }
  153. +(UIImage*)getImgWithColor:(UIColor *)color withSize:(CGSize)size{
  154. CGRect rect = CGRectMake(0.0f,0.0f, size.width,size.height);
  155. UIGraphicsBeginImageContext(rect.size);
  156. CGContextRef context =UIGraphicsGetCurrentContext();
  157. CGContextSetFillColorWithColor(context, [color CGColor]);
  158. CGContextFillRect(context, rect);
  159. UIImage *image =UIGraphicsGetImageFromCurrentImageContext();
  160. UIGraphicsEndImageContext();
  161. return image;
  162. }
  163. #pragma mark - 设置上图下文字
  164. +(UIButton*)setUpImgDownText:(UIButton *)btn {
  165. /*
  166. 多处使用,不要随意更改,
  167. */
  168. [btn.titleLabel sizeToFit];
  169. CGFloat textW = [self sizeWithString:btn.titleLabel.text andFont:btn.titleLabel.font].width;
  170. CGFloat totalH = btn.imageView.frame.size.height + btn.titleLabel.frame.size.height;
  171. CGFloat totalW = btn.imageView.frame.size.width + textW;
  172. CGFloat allowanceW = totalW - btn.frame.size.width;
  173. CGFloat spaceH = 5;
  174. CGFloat btnW = btn.size.width;
  175. CGFloat btnImgW = btn.imageView.size.width;
  176. if (allowanceW>0) {
  177. //标题+图片宽度大于按钮宽度
  178. [btn setImageEdgeInsets:UIEdgeInsetsMake(-(totalH - btn.imageView.frame.size.height),(btnW-btnImgW)/2, 0.0, -(btnW-btnImgW)/2)];
  179. [btn setTitleEdgeInsets:UIEdgeInsetsMake(spaceH, -btn.imageView.frame.size.width, -(totalH - btn.titleLabel.frame.size.height),0)];
  180. }else {
  181. //标题+图片宽度小于按钮宽度
  182. [btn setImageEdgeInsets:UIEdgeInsetsMake(-(totalH - btn.imageView.frame.size.height),0.0, 0.0, -btn.titleLabel.frame.size.width)];
  183. [btn setTitleEdgeInsets:UIEdgeInsetsMake(spaceH, -btn.imageView.frame.size.width, -(totalH - btn.titleLabel.frame.size.height),0.0)];
  184. }
  185. /*
  186. CGFloat allowanceW = (totalW - btn.frame.size.width) > 0 ? (totalW - btn.frame.size.width)/2:0;
  187. //设置按钮图片偏移
  188. [btn setImageEdgeInsets:UIEdgeInsetsMake(-(totalH - btn.imageView.frame.size.height),0.0, 0.0, -btn.titleLabel.frame.size.width-allowanceW)];
  189. //设置按钮标题偏移
  190. [btn setTitleEdgeInsets:UIEdgeInsetsMake(spaceH, -btn.imageView.frame.size.width-allowanceW, -(totalH - btn.titleLabel.frame.size.height),0.0)];
  191. */
  192. return btn;
  193. }
  194. //自定义间距上图下文字
  195. +(UIButton*)setUpImgDownText:(UIButton *)btn space:(CGFloat)space {
  196. CGFloat textW = [self sizeWithString:btn.titleLabel.text andFont:btn.titleLabel.font].width;
  197. CGFloat totalH = btn.imageView.frame.size.height + btn.titleLabel.frame.size.height;
  198. CGFloat totalW = btn.imageView.frame.size.width + textW;
  199. CGFloat allowanceW = (totalW - btn.frame.size.width) > 0 ? (totalW - btn.frame.size.width)/2.0 : 0;
  200. CGFloat spaceH = space;
  201. //设置按钮图片偏移
  202. [btn setImageEdgeInsets:UIEdgeInsetsMake(-(totalH - btn.imageView.frame.size.height),0.0, 0.0, -btn.titleLabel.frame.size.width-allowanceW)];
  203. //设置按钮标题偏移
  204. [btn setTitleEdgeInsets:UIEdgeInsetsMake(spaceH, -btn.imageView.frame.size.width-allowanceW, -(totalH - btn.titleLabel.frame.size.height),0.0)];
  205. return btn;
  206. }
  207. #pragma mark - 重设root
  208. +(void)resetVC:(UIViewController*)vc{
  209. UIApplication *app =[UIApplication sharedApplication];
  210. AppDelegate *app2 = (AppDelegate*)app.delegate;
  211. YBNavigationController *nav = [[YBNavigationController alloc]initWithRootViewController:vc];
  212. NSLog(@"1031=ob1===%lu====:%@",app2.window.subviews.count,app2.window.subviews);
  213. [app2.window removeAllSubViews];
  214. NSLog(@"1031=ob2===%lu====:%@",app2.window.subviews.count,app2.window.subviews);
  215. app2.window.rootViewController = nav;
  216. }
  217. #pragma mark - 根据图片名拼接文件路径
  218. +(NSString *)getFilePathWithImageName:(NSString *)imageName {
  219. if (imageName) {
  220. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES);
  221. NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:imageName];
  222. return filePath;
  223. }
  224. return nil;
  225. }
  226. #pragma mark - 以当前时间合成视频名称
  227. +(NSString *)getNameBaseCurrentTime:(NSString *)suf {
  228. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  229. [dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
  230. NSString *nameStr = [[dateFormatter stringFromDate:[NSDate date]] stringByAppendingString:suf];
  231. return [NSString stringWithFormat:@"%@_IOS_%@",[Config getOwnID],nameStr];
  232. }
  233. #pragma mark - 判断是不是本地视频
  234. + (BOOL)judgeAssetisInLocalAblum:(PHAsset *)asset {
  235. __block BOOL result = NO;
  236. if (@available(iOS 10.0, *)) {
  237. // https://stackoverflow.com/questions/31966571/check-given-phasset-is-icloud-asset
  238. // 这个api虽然是9.0出的,但是9.0会全部返回NO,未知原因,暂时先改为10.0
  239. NSArray *resourceArray = [PHAssetResource assetResourcesForAsset:asset];
  240. if (resourceArray.count) {
  241. result = [[resourceArray.firstObject valueForKey:@"locallyAvailable"] boolValue];
  242. }
  243. } else {
  244. PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
  245. option.networkAccessAllowed = NO;
  246. option.synchronous = YES;
  247. [[PHCachingImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
  248. result = imageData ? YES : NO;
  249. }];
  250. }
  251. return result;
  252. }
  253. #pragma mark - 权限相关
  254. + (BOOL)havePhotoLibraryAuthority
  255. {
  256. PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
  257. if (status == PHAuthorizationStatusAuthorized) {
  258. return YES;
  259. }
  260. return NO;
  261. }
  262. #pragma mark - 原图-小-恢复
  263. +(CAAnimation*)bigToSmallRecovery {
  264. CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
  265. animation.duration = 1;
  266. NSMutableArray *values = [NSMutableArray array];
  267. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1.0)]];
  268. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.7, 0.7, 1.0)]];
  269. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1.0)]];
  270. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.3, 0.3, 1.0)]];
  271. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]];
  272. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.3, 0.3, 1.0)]];
  273. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1.0)]];
  274. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.7, 0.7, 1.0)]];
  275. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1.0)]];
  276. animation.values = values;
  277. return animation;
  278. }
  279. #pragma mark - 原图-大-小
  280. +(CAAnimation*)smallToBigToSmall {
  281. CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
  282. animation.duration = 1.0;
  283. NSMutableArray *values = [NSMutableArray array];
  284. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1.0)]];
  285. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.3, 1.3, 1.0)]];
  286. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1.0)]];
  287. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.7, 0.7, 1.0)]];
  288. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1.0)]];
  289. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.3, 0.3, 1.0)]];
  290. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]];
  291. animation.values = values;
  292. return animation;
  293. }
  294. #pragma mark - 原图-小-保持
  295. +(CAAnimation*)originToSmall {
  296. CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
  297. animation.duration = 0.2;
  298. NSMutableArray *values = [NSMutableArray array];
  299. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1.0)]];
  300. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.7, 0.7, 1.0)]];
  301. animation.values = values;
  302. return animation;
  303. }
  304. #pragma mark - 原图-大-小-恢复
  305. +(CAAnimation*)originToBigToSmallRecovery {
  306. CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
  307. animation.duration = 0.5;
  308. NSMutableArray *values = [NSMutableArray array];
  309. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
  310. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  311. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  312. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
  313. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.7, 0.7, 1.0)]];
  314. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1.0)]];
  315. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.3, 0.3, 1.0)]];
  316. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1.0)]];
  317. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.7, 0.7, 1.0)]];
  318. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
  319. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  320. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  321. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
  322. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1.0)]];
  323. animation.values = values;
  324. return animation;
  325. }
  326. #pragma mark - 观看页面上下切换,并且未关注的情况下的过渡动画
  327. +(CAAnimation*)followShowTransition {
  328. CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
  329. animation.duration = 0.5;
  330. NSMutableArray *values = [NSMutableArray array];
  331. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
  332. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  333. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  334. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
  335. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
  336. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 1.0)]];
  337. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.8, 0.8, 1.0)]];
  338. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.7, 0.7, 1.0)]];
  339. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.6, 0.6, 1.0)]];
  340. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1.0)]];
  341. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.4, 0.4, 1.0)]];
  342. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.3, 0.3, 1.0)]];
  343. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.4, 0.4, 1.0)]];
  344. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1.0)]];
  345. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.6, 0.6, 1.0)]];
  346. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.7, 0.7, 1.0)]];
  347. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.8, 0.8, 1.0)]];
  348. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 1.0)]];
  349. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
  350. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
  351. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  352. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  353. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
  354. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1.0)]];
  355. animation.values = values;
  356. return animation;
  357. }
  358. #pragma mark - 按钮按下执行动画(录音)
  359. +(CAAnimation*)touchDownAnimation {
  360. CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
  361. animation.duration = 1;
  362. animation.repeatCount = MAXFLOAT;
  363. NSMutableArray *values = [NSMutableArray array];
  364. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
  365. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  366. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.3, 1.3, 1.0)]];
  367. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.4, 1.4, 1.0)]];
  368. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.5, 1.5, 1.0)]];
  369. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.6, 1.6, 1.0)]];
  370. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.7, 1.7, 1.0)]];
  371. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.6, 1.6, 1.0)]];
  372. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.5, 1.5, 1.0)]];
  373. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.4, 1.4, 1.0)]];
  374. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.3, 1.3, 1.0)]];
  375. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  376. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
  377. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1.0)]];
  378. animation.values = values;
  379. return animation;
  380. }
  381. #pragma mark - 旋转动画
  382. +(CABasicAnimation*)rotationAnimation {
  383. CABasicAnimation *rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
  384. rotate.toValue = @(2 * M_PI);
  385. rotate.duration = 5;
  386. rotate.repeatCount = MAXFLOAT;
  387. return rotate;
  388. }
  389. #pragma mark - 动画组
  390. +(CAAnimationGroup*)caGroup{
  391. //路径
  392. CAAnimationGroup *group = [[CAAnimationGroup alloc]init];
  393. CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
  394. pathAnimation.calculationMode = kCAAnimationPaced;
  395. pathAnimation.fillMode = kCAFillModeForwards;
  396. pathAnimation.removedOnCompletion = YES;
  397. CGMutablePathRef curvedPath = CGPathCreateMutable();
  398. //起点
  399. CGPathMoveToPoint(curvedPath, NULL, 50, 55);
  400. //辅助点和终点--- 父视图 85*50(唱片 50*50 )
  401. CGPathAddQuadCurveToPoint(curvedPath, NULL, 6, 45, 16, -5);
  402. pathAnimation.path = curvedPath;
  403. CGPathRelease(curvedPath);
  404. //缩放
  405. CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
  406. NSMutableArray *values = [NSMutableArray array];
  407. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1.0)]];
  408. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
  409. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  410. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.3, 1.3, 1.0)]];
  411. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.4, 1.4, 1.0)]];
  412. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.5, 1.5, 1.0)]];
  413. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.6, 1.6, 1.0)]];
  414. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.7, 1.7, 1.0)]];
  415. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.8, 1.8, 1.0)]];
  416. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.9, 1.9, 1.0)]];
  417. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.0, 2.0, 1.0)]];
  418. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.1, 2.1, 1.0)]];
  419. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.9, 0, 0, 1)]];
  420. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.8, 0, 0, 1)]];
  421. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.7, 0, 0, 1)]];
  422. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.6, 0, 1, 0)]];
  423. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.5, 0, 1, 0)]];
  424. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.9, 0, 1, 0)]];
  425. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.9, 0, 1, 0)]];
  426. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.9, 0, 1, 0)]];
  427. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.9, 0, 1, 0)]];
  428. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.9, 0, 1, 0)]];
  429. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.9, 0, 1, 0)]];
  430. // [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.9, 0, 1, 0)]];
  431. animation.values = values;
  432. //透明
  433. CAKeyframeAnimation *opacityAnimaton = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
  434. opacityAnimaton.values = @[@1,@1,@1,@1,@1,@0.9,@0.8,@0.7,@0.6,@0.5,@0.4,@0.3];
  435. group.animations = @[pathAnimation,animation,opacityAnimaton];
  436. group.duration = 3.0;
  437. group.repeatCount = MAXFLOAT;
  438. group.fillMode = kCAFillModeForwards;
  439. return group;
  440. }
  441. #pragma mark - MD5
  442. +(NSString *)stringToMD5:(NSString *)str {
  443. //1.首先将字符串转换成UTF-8编码, 因为MD5加密是基于C语言的,所以要先把字符串转化成C语言的字符串
  444. const char *fooData = [str UTF8String];
  445. //2.然后创建一个字符串数组,接收MD5的值
  446. unsigned char result[CC_MD5_DIGEST_LENGTH];
  447. //3.计算MD5的值, 这是官方封装好的加密方法:把我们输入的字符串转换成16进制的32位数,然后存储到result中
  448. CC_MD5(fooData, (CC_LONG)strlen(fooData), result);
  449. /**
  450. 第一个参数:要加密的字符串
  451. 第二个参数: 获取要加密字符串的长度
  452. 第三个参数: 接收结果的数组
  453. */
  454. //4.创建一个字符串保存加密结果
  455. NSMutableString *saveResult = [NSMutableString string];
  456. //5.从result 数组中获取加密结果并放到 saveResult中
  457. for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
  458. [saveResult appendFormat:@"%02x", result[i]];
  459. }
  460. /*
  461. x表示十六进制,%02X 意思是不足两位将用0补齐,如果多余两位则不影响
  462. NSLog("%02X", 0x888); //888
  463. NSLog("%02X", 0x4); //04
  464. */
  465. return saveResult;
  466. }
  467. #pragma mark - 检查为空
  468. +(BOOL)checkNull:(NSString *)str {
  469. if ([str isEqual:@"<null>"]||[str isEqual:@"(null)"]||[str isKindOfClass:[NSNull class]]||str.length==0) {
  470. return YES;
  471. }
  472. return NO;
  473. }
  474. #pragma mark - 双击点赞
  475. +(void)doubleClickShowZan:(UIView *)sueprView withCenter:(CGPoint)center{
  476. __block UIImageView *imgIV = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"home_zan_sel"]];
  477. imgIV.frame = CGRectMake(0, 0, 50, 50);
  478. imgIV.center = center;
  479. [sueprView addSubview:imgIV];
  480. CGFloat allDuration = 1.0;
  481. NSArray *angleArray = @[@(60),@(75),@(90),@(105),@(120)];
  482. int randowm = arc4random() % (angleArray.count);
  483. CGFloat angle = [angleArray[randowm] floatValue];
  484. NSLog(@"==%f\n====%@====%d",angle,angleArray[randowm],randowm);
  485. //旋转
  486. CAKeyframeAnimation* rotation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];
  487. NSMutableArray *ro_va = [NSMutableArray array];
  488. [ro_va addObject:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(angle, 0, 0, 1)]];
  489. rotation.values = ro_va;
  490. //缩放
  491. CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
  492. NSMutableArray *values = [NSMutableArray array];
  493. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(3.5, 3.5, 1.0)]];
  494. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1.0)]];
  495. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  496. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  497. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  498. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  499. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  500. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
  501. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.3, 1.3, 1.0)]];
  502. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.4, 1.4, 1.0)]];
  503. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.5, 1.5, 1.0)]];
  504. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.6, 1.6, 1.0)]];
  505. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.7, 1.7, 1.0)]];
  506. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.8, 1.8, 1.0)]];
  507. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.9, 1.9, 1.0)]];
  508. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.0, 2.0, 1.0)]];
  509. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.1, 2.1, 1.0)]];
  510. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.2, 2.2, 1.0)]];
  511. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.3, 2.3, 1.0)]];
  512. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.4, 2.4, 1.0)]];
  513. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.5, 2.5, 1.0)]];
  514. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.6, 2.6, 1.0)]];
  515. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.7, 2.7, 1.0)]];
  516. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.8, 2.8, 1.0)]];
  517. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(2.9, 2.9, 1.0)]];
  518. [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(3.0, 3.0, 1.0)]];
  519. animation.values = values;
  520. //透明
  521. CAKeyframeAnimation *opacityAnimaton = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
  522. opacityAnimaton.values = @[@1.0,@1.0,@1.0,@1.0,@1.0,@0.9,@0.8,@0.7,@0.6,@0.5,@0.4,@0.3];
  523. //组
  524. CAAnimationGroup *group = [[CAAnimationGroup alloc]init];
  525. group.animations = @[animation,opacityAnimaton,rotation];
  526. group.duration = allDuration;
  527. group.repeatCount = 1;
  528. group.fillMode = kCAFillModeForwards;
  529. group.removedOnCompletion = NO;
  530. [imgIV.layer addAnimation:group forKey:nil];
  531. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(allDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  532. [imgIV removeFromSuperview];
  533. imgIV = nil;
  534. });
  535. }
  536. #pragma mark - 创建emoji正则表达式
  537. +(NSArray <NSTextCheckingResult *> *)machesWithPattern:(NSString *)pattern andStr:(NSString *)str {
  538. NSError *error = nil;
  539. NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
  540. if (error) {
  541. NSLog(@"正则表达式创建失败");
  542. return nil;
  543. }
  544. return [expression matchesInString:str options:0 range:NSMakeRange(0, str.length)];
  545. }
  546. #pragma mark - 画一条线
  547. +(UIView *)lineViewWithFrame:(CGRect)frame andColor:(UIColor *)color andView:(UIView *)view{
  548. UIView *lineView = [[UIView alloc]initWithFrame:frame];
  549. lineView.backgroundColor = color;
  550. [view addSubview:lineView];
  551. return lineView;
  552. }
  553. #pragma mark - 获取系统音量滑块
  554. +(UISlider*)setSystemVolumSliderWithSuperViwe:(UIViewController *)superView{
  555. static UISlider * volumeViewSlider = nil;
  556. MPVolumeView *volumeView;
  557. if (volumeViewSlider == nil) {
  558. volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-1000, -1000, 40, 40)];
  559. [superView.view addSubview:volumeView];
  560. for (UIView* newView in volumeView.subviews) {
  561. if ([newView.class.description isEqualToString:@"MPVolumeSlider"]){
  562. volumeViewSlider = (UISlider*)newView;
  563. break;
  564. }
  565. }
  566. }
  567. [volumeView setHidden:NO];
  568. [volumeView setShowsRouteButton:YES];
  569. [volumeView setShowsVolumeSlider:YES];
  570. return volumeViewSlider;
  571. }
  572. +(CGFloat)getSysOutputVolume {
  573. CGFloat volume = [AVAudioSession sharedInstance].outputVolume;
  574. return volume;
  575. }
  576. #pragma mark - 获取缩略图(需要导入AVFoundation.h)
  577. +(UIImage*)getVideoPreViewImageWithPath:(NSURL *)videoPath {
  578. AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoPath options:nil];
  579. AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
  580. gen.appliesPreferredTrackTransform = YES;
  581. CMTime time = CMTimeMakeWithSeconds(0.0, 600);
  582. NSError *error = nil;
  583. CMTime actualTime;
  584. CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
  585. UIImage *img = [[UIImage alloc] initWithCGImage:image];
  586. return img;
  587. }
  588. #pragma mark - /** 获取启动图 */
  589. + (UIImage *)getLaunchImage{
  590. UIImage *launchImg = [[UIImage alloc] init];
  591. NSString *orientation = @"";
  592. CGFloat scale = [UIScreen mainScreen].scale;
  593. CGSize screenSize = [UIScreen mainScreen].bounds.size;
  594. UIInterfaceOrientation statusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];
  595. if (statusBarOrientation == UIInterfaceOrientationLandscapeLeft || statusBarOrientation == UIInterfaceOrientationLandscapeRight) {
  596. orientation = @"Landscape";
  597. } else {
  598. orientation = @"Portrait";
  599. }
  600. NSArray *imgsInfoArr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UILaunchImages"];
  601. for (NSDictionary *info in imgsInfoArr) {
  602. CGSize imgSize = CGSizeFromString(info[@"UILaunchImageSize"]);
  603. if (CGSizeEqualToSize(imgSize, screenSize) && [orientation isEqualToString:info[@"UILaunchImageOrientation"]] ) {
  604. launchImg = [UIImage imageNamed:info[@"UILaunchImageName"]];
  605. if (launchImg.scale == scale) {
  606. break;
  607. }
  608. }
  609. }
  610. return launchImg;
  611. }
  612. #pragma mark - /** 获取版本号 */
  613. +(NSString *)getAppBuild {
  614. NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
  615. NSNumber *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];
  616. NSString *build = [NSString stringWithFormat:@"%@",app_build];
  617. return build;
  618. }
  619. +(BOOL)isUp{
  620. if ([[PublicObj getAppBuild] isEqual:[common ios_shelves]]) {
  621. return YES;
  622. }
  623. return NO;
  624. }
  625. +(NSString *)getAppName;{
  626. NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
  627. NSString *app_name = [infoDictionary objectForKey:@"CFBundleDisplayName"];
  628. return app_name;
  629. }
  630. +(CGFloat)getSysVersion{
  631. return [[[UIDevice currentDevice] systemVersion] floatValue];
  632. }
  633. #pragma mark - 获取App头像
  634. +(UIImage *)getAppIcon {
  635. NSDictionary *infoPlist = [[NSBundle mainBundle] infoDictionary];
  636. NSString *icon = [[infoPlist valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"] lastObject];
  637. UIImage *img= [UIImage imageNamed:icon];
  638. return img;
  639. }
  640. #pragma mark - /** 字典字符串加(解)密排序 */
  641. + (NSString *)sortString:(NSDictionary *)dic{
  642. // 2. 非数字型字符串(注意用compare比较要剔除空数据(nil))
  643. NSString *returnStr = @"";
  644. NSArray *charArray = [dic allKeys];
  645. NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch;
  646. NSComparator sort = ^(NSString *obj1,NSString *obj2){
  647. NSRange range = NSMakeRange(0,obj1.length);
  648. return [obj1 compare:obj2 options:comparisonOptions range:range];
  649. };
  650. NSArray *resultArray2 = [charArray sortedArrayUsingComparator:sort];
  651. for (int i = 0; i < resultArray2.count; i++) {
  652. NSString *str = resultArray2[i];
  653. if (i != resultArray2.count - 1) {
  654. returnStr = [NSString stringWithFormat:@"%@%@=%@&",returnStr,str,minstr([dic valueForKey:str])];
  655. }else{
  656. returnStr = [NSString stringWithFormat:@"%@%@=%@&562d4226cb2a2b4f74b3ef4340828b5d",returnStr,str,minstr([dic valueForKey:str])];
  657. }
  658. }
  659. return [self stringToMD5:returnStr];
  660. }
  661. + (NSString *)decrypt:(NSString *)code{
  662. if ([PublicObj checkNull:code]) {
  663. return @"";
  664. }
  665. NSString* str = @"HmTPvkJ3otK5gp.COdrAi:q09Z62ash-QGn8V;FNIlbfM/D74Wj&S_E=UzYuw?1ecxXyLRB";
  666. NSInteger strl = str.length;
  667. NSInteger len = code.length;
  668. NSString* newCode = @"";
  669. for(int i = 0;i < len; i++){
  670. NSString *codeIteam = [code substringWithRange:NSMakeRange(i, 1)];
  671. for(int j = 0; j < strl; j++){
  672. NSString *strIteam = [str substringWithRange:NSMakeRange(j, 1)];
  673. if([strIteam isEqual:codeIteam]){
  674. if(j == 0){
  675. newCode = [NSString stringWithFormat:@"%@%@",newCode,[str substringWithRange:NSMakeRange(strl - 1, 1)]];
  676. }else{
  677. newCode = [NSString stringWithFormat:@"%@%@",newCode,[str substringWithRange:NSMakeRange(j-1, 1)]];
  678. }
  679. }
  680. }
  681. }
  682. return newCode;
  683. }
  684. #pragma mark - 小程序
  685. + (void)openWXMiniProgram:(NSString *)path{
  686. YBWeakSelf;
  687. [ShareSDK getUserInfo:SSDKPlatformTypeWechat onStateChanged:^(SSDKResponseState state, SSDKUser *user, NSError *error) {
  688. if (state == SSDKResponseStateSuccess) {
  689. NSLog(@"uid=%@",user.uid);
  690. NSLog(@"%@",user.credential);
  691. NSLog(@"token=%@",user.credential.token);
  692. NSLog(@"nickname=%@",user.nickname);
  693. dispatch_async(dispatch_get_main_queue(), ^{
  694. [weakSelf gogoWeChat:path];
  695. });
  696. } else if (state == 2 || state == 3) {
  697. [MBProgressHUD showError:YZMsg(@"未获取授权")];
  698. }
  699. }];
  700. }
  701. + (void)gogoWeChat:(NSString *)path{
  702. /*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。
  703. *
  704. * 需要在每次启动第三方应用程序时调用。
  705. * @attention 请保证在主线程中调用此函数
  706. * @param appid 微信开发者ID
  707. * @param universalLink 微信开发者Universal Link
  708. * @return 成功返回YES,失败返回NO。
  709. */
  710. [WXApi registerApp:WechatAppId universalLink:WechatUniversalLink];
  711. /*! @brief WXLaunchMiniProgramReq对象, 可实现通过sdk拉起微信小程序
  712. *
  713. * @note 返回的WXLaunchMiniProgramReq对象是自动释放的
  714. */
  715. WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object];
  716. //拉起的小程序的username(小程序的原始ID)
  717. launchMiniProgramReq.userName = WechatUsername;
  718. //拉起小程序页面的可带参路径,不填默认拉起小程序首页,对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。
  719. launchMiniProgramReq.path = path;
  720. //拉起小程序的类型
  721. launchMiniProgramReq.miniProgramType = WXMiniProgramTypeRelease;
  722. [WXApi sendReq:launchMiniProgramReq completion:^(BOOL success) {
  723. NSLog(@"拉起小程序结果=%d",success);
  724. }];
  725. }
  726. #pragma mark - /** git 转 data */
  727. +(NSData *)gifConvertDataWithName:(NSString *)gifName{
  728. NSString *filePath = [[NSBundle mainBundle] pathForResource:gifName ofType: @"gif"];
  729. NSData *gifData = [NSData dataWithContentsOfFile: filePath];
  730. return gifData;
  731. }
  732. #pragma mark - /** 封面width、height */
  733. +(void)getThumbSizeWithUrl:(NSString *)url complete:(ThumbSizeBlock)complete {
  734. if (complete) {
  735. complete(0,1);
  736. }
  737. return;
  738. /*
  739. if (![[NSUserDefaults standardUserDefaults]objectForKey:[NSString stringWithFormat:@"%@width",url]]) {
  740. CGSize imageSize = [UIImage rk_getImageSizeWithURL:url];
  741. if (complete) {
  742. complete(imageSize.width,imageSize.height);
  743. }
  744. [[NSUserDefaults standardUserDefaults] setObject:@(imageSize.width) forKey:[NSString stringWithFormat:@"%@width",url]];
  745. [[NSUserDefaults standardUserDefaults] setObject:@(imageSize.height) forKey:[NSString stringWithFormat:@"%@height",url]];
  746. [[NSUserDefaults standardUserDefaults]synchronize];
  747. }else {
  748. CGFloat img_width = [[[NSUserDefaults standardUserDefaults]objectForKey:[NSString stringWithFormat:@"%@width",url]] floatValue];
  749. CGFloat img_height = [[[NSUserDefaults standardUserDefaults]objectForKey:[NSString stringWithFormat:@"%@height",url]] floatValue];;
  750. if (complete) {
  751. complete(img_width,img_height);
  752. }
  753. }
  754. */
  755. }
  756. #pragma mark - /** 获取UUID */
  757. +(NSString *)getDeviceUUID {
  758. return [RKUUIDManager getUUID];
  759. }
  760. #pragma mark - 设置视图左上圆角
  761. /**
  762. 设置视图左上圆角
  763. @param leftC 左上半径
  764. @param rightC 又上半径
  765. @param view 父视图
  766. @return layer
  767. */
  768. +(CAShapeLayer *)setViewLeftTop:(CGFloat)leftC andRightTop:(CGFloat)rightC andView:(UIView *)view{
  769. UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(leftC, rightC)];
  770. CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
  771. maskLayer.frame = view.bounds;
  772. maskLayer.path = maskPath.CGPath;
  773. return maskLayer;
  774. }
  775. #pragma mark - 图片压缩相关 开始
  776. +(UIImage*)scaleImage:(UIImage *)image scaleToSize:(CGSize)size{
  777. UIGraphicsBeginImageContext(size);
  778. [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
  779. UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
  780. UIGraphicsEndImageContext();
  781. return scaledImage;
  782. }
  783. +(CGSize)getObjSize:(CGSize)sourceSize; {
  784. CGSize objSize = CGSizeMake(sourceSize.width, sourceSize.height);
  785. if (objSize.height >= objSize.width) {
  786. if([self supportCompressSize:CGSizeMake(720, 1280) objSize:objSize]){
  787. objSize = [self compress:CGSizeMake(720, 1280) objSize:objSize];
  788. }
  789. }else{
  790. if([self supportCompressSize:CGSizeMake(1280, 720) objSize:objSize]){
  791. objSize = [self compress:CGSizeMake(1280, 720) objSize:objSize];
  792. }
  793. }
  794. return objSize;
  795. }
  796. //判断是否需要压缩图片
  797. +(BOOL)supportCompressSize:(CGSize)compressSize objSize:(CGSize)objSize {
  798. if (objSize.width >= compressSize.width && objSize.height >= compressSize.height) {
  799. return YES;
  800. }
  801. if (objSize.width >= compressSize.height && objSize.height >= compressSize.width) {
  802. return YES;
  803. }
  804. return NO;
  805. }
  806. //获得压缩后图片大小
  807. +(CGSize)compress:(CGSize)compressSize objSize:(CGSize)objSize {
  808. CGSize size = CGSizeZero;
  809. if (compressSize.height / compressSize.width >= objSize.height / objSize.width) {
  810. size.width = compressSize.width;
  811. size.height = compressSize.width * objSize.height / objSize.width;
  812. }else{
  813. size.height = compressSize.height;
  814. size.width = compressSize.height * objSize.width / objSize.height;
  815. }
  816. return size;
  817. }
  818. #pragma mark - 图片压缩相关 结束
  819. #pragma mark - 渐变色
  820. +(void)addGradientWithFromColor:(UIColor *)formColor andEndColor:(UIColor *)endColor andView:(UIView *)view direction:(int)dire{
  821. CAGradientLayer *gradient = [CAGradientLayer layer];
  822. //设置开始和结束位置(设置渐变的方向)
  823. //dire:0-横向 1-纵向 2-斜向
  824. if (dire == 1) {
  825. gradient.startPoint = CGPointMake(0, 0);
  826. gradient.endPoint = CGPointMake(0, 1);
  827. }else if (dire == 2){
  828. gradient.startPoint = CGPointMake(0, 0);
  829. gradient.endPoint = CGPointMake(0, 1);
  830. }else {
  831. gradient.startPoint = CGPointMake(0, 0);
  832. gradient.endPoint = CGPointMake(1, 0);
  833. }
  834. gradient.frame =CGRectMake(0,0,view.width,view.height);
  835. gradient.colors = [NSArray arrayWithObjects:(id)formColor.CGColor,(id)endColor.CGColor,nil];
  836. [view.layer insertSublayer:gradient atIndex:0];
  837. }
  838. #pragma mark - 比较两个时间的大小(date01 老的时间、date02 新的时间 返回 1 -1 0)
  839. +(int)compareDate:(NSString*)date01 withDate:(NSString*)date02 {
  840. int ci;
  841. NSDateFormatter *df = [[NSDateFormatter alloc]init];
  842. [df setDateFormat:@"yyyy-MM-dd HH:mm"];
  843. NSDate *dt1 = [[NSDate alloc]init];
  844. NSDate *dt2 = [[NSDate alloc]init];
  845. dt1 = [df dateFromString:date01];
  846. dt2 = [df dateFromString:date02];
  847. NSComparisonResult result = [dt1 compare:dt2];
  848. switch (result){
  849. //date02比date01大
  850. case NSOrderedAscending:
  851. ci = 1;
  852. break;
  853. //date02比date01小
  854. case NSOrderedDescending:
  855. ci = -1;
  856. break;
  857. //date02=date01
  858. case NSOrderedSame:
  859. ci = 0;
  860. break;
  861. default:
  862. NSLog(@"erorr dates %@, %@", dt2, dt1);
  863. break;
  864. }
  865. return ci;
  866. }
  867. #pragma mark - 网络类型、手机类型
  868. /*
  869. + (NSString *)getNetworkType {
  870. NSString *network = @"";
  871. if ([[UIDevice currentDevice].systemVersion floatValue]>=13) {
  872. return network;
  873. }else
  874. if (iPhoneX) {
  875. UIApplication *app = [UIApplication sharedApplication];
  876. id statusBar = [app valueForKeyPath:@"statusBar"];
  877. // iPhone X
  878. id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
  879. UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
  880. NSArray *subviews = [[foregroundView subviews][2] subviews];
  881. for (id subview in subviews) {
  882. if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
  883. network = @"WIFI";
  884. }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
  885. network = [subview valueForKeyPath:@"originalText"];
  886. }
  887. }
  888. }else {
  889. UIApplication *app = [UIApplication sharedApplication];
  890. id statusBar = [app valueForKeyPath:@"statusBar"];
  891. //非 iPhone X
  892. UIView *foregroundView = [statusBar valueForKeyPath:@"foregroundView"];
  893. NSArray *subviews = [foregroundView subviews];
  894. for (id subview in subviews) {
  895. if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
  896. int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
  897. switch (networkType) {
  898. case 0:
  899. network = @"NONE";
  900. break;
  901. case 1:
  902. network = @"2G";
  903. break;
  904. case 2:
  905. network = @"3G";
  906. break;
  907. case 3:
  908. network = @"4G";
  909. break;
  910. case 5:
  911. network = @"WIFI";
  912. break;
  913. default:
  914. break;
  915. }
  916. }
  917. }
  918. }
  919. if ([network isEqualToString:@""]) {
  920. network = @"NO DISPLAY";
  921. }
  922. return network;
  923. }
  924. */
  925. /*
  926. + (NSString *)getNetworkType {
  927. UIApplication *app = [UIApplication sharedApplication];
  928. id statusBar = nil;
  929. NSString *network = @"";
  930. if (@available(iOS 13.0, *)) {
  931. UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;
  932. #pragma clang diagnostic push
  933. #pragma clang diagnostic ignored "-Wundeclared-selector"
  934. if ([statusBarManager respondsToSelector:@selector(createLocalStatusBar)]) {
  935. UIView *localStatusBar = [statusBarManager performSelector:@selector(createLocalStatusBar)];
  936. if ([localStatusBar respondsToSelector:@selector(statusBar)]) {
  937. statusBar = [localStatusBar performSelector:@selector(statusBar)];
  938. }
  939. }
  940. #pragma clang diagnostic pop
  941. if (statusBar) {
  942. // UIStatusBarDataCellularEntry
  943. id currentData = [[statusBar valueForKeyPath:@"_statusBar"] valueForKeyPath:@"currentData"];
  944. id _wifiEntry = [currentData valueForKeyPath:@"wifiEntry"];
  945. id _cellularEntry = [currentData valueForKeyPath:@"cellularEntry"];
  946. if (_wifiEntry && [[_wifiEntry valueForKeyPath:@"isEnabled"] boolValue]) {
  947. // If wifiEntry is enabled, is WiFi.
  948. network = @"WIFI";
  949. } else if (_cellularEntry && [[_cellularEntry valueForKeyPath:@"isEnabled"] boolValue]) {
  950. NSNumber *type = [_cellularEntry valueForKeyPath:@"type"];
  951. if (type) {
  952. switch (type.integerValue) {
  953. case 0:
  954. // 无sim卡
  955. network = @"NONE";
  956. break;
  957. case 1:
  958. network = @"1G";
  959. break;
  960. case 4:
  961. network = @"3G";
  962. break;
  963. case 5:
  964. network = @"4G";
  965. break;
  966. default:
  967. // 默认WWAN类型
  968. network = @"WWAN";
  969. break;
  970. }
  971. }
  972. }
  973. }
  974. }else {
  975. statusBar = [app valueForKeyPath:@"statusBar"];
  976. if (IS_IPHONE_X== 1) {
  977. // 刘海屏
  978. id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
  979. UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
  980. NSArray *subviews = [[foregroundView subviews][2] subviews];
  981. if (subviews.count == 0) {
  982. // iOS 12
  983. id currentData = [statusBarView valueForKeyPath:@"currentData"];
  984. id wifiEntry = [currentData valueForKey:@"wifiEntry"];
  985. if ([[wifiEntry valueForKey:@"_enabled"] boolValue]) {
  986. network = @"WIFI";
  987. }else {
  988. // 卡1:
  989. id cellularEntry = [currentData valueForKey:@"cellularEntry"];
  990. // 卡2:
  991. id secondaryCellularEntry = [currentData valueForKey:@"secondaryCellularEntry"];
  992. if (([[cellularEntry valueForKey:@"_enabled"] boolValue]|[[secondaryCellularEntry valueForKey:@"_enabled"] boolValue]) == NO) {
  993. // 无卡情况
  994. network = @"NONE";
  995. }else {
  996. // 判断卡1还是卡2
  997. BOOL isCardOne = [[cellularEntry valueForKey:@"_enabled"] boolValue];
  998. int networkType = isCardOne ? [[cellularEntry valueForKey:@"type"] intValue] : [[secondaryCellularEntry valueForKey:@"type"] intValue];
  999. switch (networkType) {
  1000. case 0://无服务
  1001. network = [NSString stringWithFormat:@"%@-%@", isCardOne ? @"Card 1" : @"Card 2", @"NONE"];
  1002. break;
  1003. case 3:
  1004. network = [NSString stringWithFormat:@"%@-%@", isCardOne ? @"Card 1" : @"Card 2", @"2G/E"];
  1005. break;
  1006. case 4:
  1007. network = [NSString stringWithFormat:@"%@-%@", isCardOne ? @"Card 1" : @"Card 2", @"3G"];
  1008. break;
  1009. case 5:
  1010. network = [NSString stringWithFormat:@"%@-%@", isCardOne ? @"Card 1" : @"Card 2", @"4G"];
  1011. break;
  1012. default:
  1013. break;
  1014. }
  1015. }
  1016. }
  1017. }else {
  1018. for (id subview in subviews) {
  1019. if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
  1020. network = @"WIFI";
  1021. }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
  1022. network = [subview valueForKeyPath:@"originalText"];
  1023. }
  1024. }
  1025. }
  1026. }else {
  1027. // 非刘海屏
  1028. UIView *foregroundView = [statusBar valueForKeyPath:@"foregroundView"];
  1029. NSArray *subviews = [foregroundView subviews];
  1030. for (id subview in subviews) {
  1031. if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
  1032. int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
  1033. switch (networkType) {
  1034. case 0:
  1035. network = @"NONE";
  1036. break;
  1037. case 1:
  1038. network = @"2G";
  1039. break;
  1040. case 2:
  1041. network = @"3G";
  1042. break;
  1043. case 3:
  1044. network = @"4G";
  1045. break;
  1046. case 5:
  1047. network = @"WIFI";
  1048. break;
  1049. default:
  1050. break;
  1051. }
  1052. }
  1053. }
  1054. }
  1055. }
  1056. if ([network isEqualToString:@""]) {
  1057. network = @"NO DISPLAY";
  1058. }
  1059. return network;
  1060. }
  1061. */
  1062. +(void)saveNetReachability:(NSString *)save{
  1063. NSUserDefaults *stanardDef = [NSUserDefaults standardUserDefaults];
  1064. [stanardDef setObject:save forKey:@"yb_new_reachablility"];
  1065. [stanardDef synchronize];
  1066. }
  1067. +(NSString *)getNetReachability {
  1068. NSUserDefaults *stanardDef = [NSUserDefaults standardUserDefaults];
  1069. NSString *getVal = [stanardDef objectForKey:@"yb_new_reachablility"];
  1070. return getVal;
  1071. }
  1072. + (NSString *)getNetworkType {
  1073. if ([self checkNull:[self getNetReachability]] || [[self getNetReachability] isEqual:@"unknown"]) {
  1074. return @"unknown";
  1075. }else if([[self getNetReachability] isEqual:@"wifi"]){
  1076. return @"wifi";
  1077. }else{
  1078. CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
  1079. /// 注意:没有SIM卡,值为空
  1080. NSString *currentStatus;
  1081. NSString *currentNet = @"5G";
  1082. if (@available(iOS 12.1, *)) {
  1083. if (info && [info respondsToSelector:@selector(serviceCurrentRadioAccessTechnology)]) {
  1084. NSDictionary *radioDic = [info serviceCurrentRadioAccessTechnology];
  1085. if (radioDic.allKeys.count) {
  1086. currentStatus = [radioDic objectForKey:radioDic.allKeys[0]];
  1087. }
  1088. }
  1089. }else{
  1090. currentStatus = info.currentRadioAccessTechnology;
  1091. }
  1092. if ([currentStatus isEqualToString:CTRadioAccessTechnologyGPRS]) {
  1093. currentNet = @"GPRS";
  1094. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyEdge]) {
  1095. currentNet = @"2.75G EDGE";
  1096. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyWCDMA]){
  1097. currentNet = @"3G";
  1098. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyHSDPA]){
  1099. currentNet = @"3.5G HSDPA";
  1100. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyHSUPA]){
  1101. currentNet = @"3.5G HSUPA";
  1102. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyCDMA1x]){
  1103. currentNet = @"2G";
  1104. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]){
  1105. currentNet = @"3G";
  1106. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]){
  1107. currentNet = @"3G";
  1108. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]){
  1109. currentNet = @"3G";
  1110. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyeHRPD]){
  1111. currentNet = @"HRPD";
  1112. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyLTE]){
  1113. currentNet = @"4G";
  1114. }else if (@available(iOS 14.1, *)) {
  1115. if ([currentStatus isEqualToString:CTRadioAccessTechnologyNRNSA]){
  1116. currentNet = @"5G NSA";
  1117. }else if ([currentStatus isEqualToString:CTRadioAccessTechnologyNR]){
  1118. currentNet = @"5G";
  1119. }
  1120. }
  1121. return currentNet;
  1122. }
  1123. }
  1124. /// 此方法谨慎使用【使用到了私有属性,随着系统的升级有可能面临苹果的禁用】
  1125. + (int)getSignalStrength {
  1126. int signalStrength = 0;
  1127. if (@available(iOS 13.0, *)) {
  1128. UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;
  1129. id statusBar = nil;
  1130. #pragma clang diagnostic push
  1131. #pragma clang diagnostic ignored "-Wundeclared-selector"
  1132. /*
  1133. if ([statusBarManager respondsToSelector:@selector(createLocalStatusBar)]) {
  1134. UIView *localStatusBar = [statusBarManager performSelector:@selector(createLocalStatusBar)];
  1135. if ([localStatusBar respondsToSelector:@selector(statusBar)]) {
  1136. statusBar = [localStatusBar performSelector:@selector(statusBar)];
  1137. }
  1138. }
  1139. */
  1140. if([statusBarManager respondsToSelector:NSSelectorFromString(@"createLocalStatusBar")]) {
  1141. UIView*localStatusBar = [statusBarManager performSelector:NSSelectorFromString(@"createLocalStatusBar")];
  1142. if([localStatusBar respondsToSelector:NSSelectorFromString(@"statusBar")]){
  1143. statusBar = [localStatusBar performSelector:NSSelectorFromString(@"statusBar")];
  1144. }
  1145. }
  1146. #pragma clang diagnostic pop
  1147. if (statusBar) {
  1148. id currentData = [[statusBar valueForKeyPath:@"_statusBar"] valueForKeyPath:@"currentData"];
  1149. id _wifiEntry = [currentData valueForKeyPath:@"wifiEntry"];
  1150. id _cellularEntry = [currentData valueForKeyPath:@"cellularEntry"];
  1151. if (_wifiEntry && [[_wifiEntry valueForKeyPath:@"isEnabled"] boolValue]) {
  1152. // If wifiEntry is enabled, is WiFi.
  1153. if ([_wifiEntry isKindOfClass:NSClassFromString(@"_UIStatusBarDataIntegerEntry")]) {
  1154. // 层级:_UIStatusBarDataNetworkEntry、_UIStatusBarDataIntegerEntry、_UIStatusBarDataEntry
  1155. signalStrength = [[_wifiEntry valueForKey:@"displayValue"] intValue];
  1156. }
  1157. } else if (_cellularEntry && [[_cellularEntry valueForKeyPath:@"isEnabled"] boolValue]) {
  1158. if ([_cellularEntry isKindOfClass:NSClassFromString(@"_UIStatusBarDataIntegerEntry")]) {
  1159. // 层级:_UIStatusBarDataNetworkEntry、_UIStatusBarDataIntegerEntry、_UIStatusBarDataEntry
  1160. signalStrength = [[_cellularEntry valueForKey:@"displayValue"] intValue];
  1161. }
  1162. }
  1163. }
  1164. }else {
  1165. if (IS_IPHONE_X == 1) {
  1166. id statusBar = [[UIApplication sharedApplication] valueForKeyPath:@"statusBar"];
  1167. id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
  1168. UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
  1169. int signalStrength = 0;
  1170. NSArray *subviews = [[foregroundView subviews][2] subviews];
  1171. for (id subview in subviews) {
  1172. if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
  1173. signalStrength = [[subview valueForKey:@"numberOfActiveBars"] intValue];
  1174. break;
  1175. }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarPersistentAnimationView")]) {//_UIStatusBarStringView
  1176. signalStrength = [[subview valueForKey:@"numberOfActiveBars"] intValue];
  1177. break;
  1178. }
  1179. }
  1180. return signalStrength;
  1181. } else {
  1182. UIApplication *app = [UIApplication sharedApplication];
  1183. NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
  1184. NSString *dataNetworkItemView = nil;
  1185. int signalStrength = 0;
  1186. for (id subview in subviews) {
  1187. if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]] && [[self getNetworkType] isEqualToString:@"WIFI"] && ![[self getNetworkType] isEqualToString:@"NONE"]) {
  1188. dataNetworkItemView = subview;
  1189. signalStrength = [[dataNetworkItemView valueForKey:@"_wifiStrengthBars"] intValue];
  1190. break;
  1191. }
  1192. if ([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]] && ![[self getNetworkType] isEqualToString:@"WIFI"] && ![[self getNetworkType] isEqualToString:@"NONE"]) {
  1193. dataNetworkItemView = subview;
  1194. // signalStrength = [[dataNetworkItemView valueForKey:@"_signalStrengthRaw"] intValue];
  1195. signalStrength = [[dataNetworkItemView valueForKey:@"_signalStrengthBars"] intValue];
  1196. break;
  1197. }
  1198. }
  1199. return signalStrength;
  1200. }
  1201. }
  1202. return signalStrength;
  1203. }
  1204. + (NSString *)iphoneType{
  1205. struct utsname systemInfo;
  1206. uname(&systemInfo);
  1207. NSString*phoneType = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
  1208. if([phoneType isEqualToString:@"iPhone1,1"]) return @"iPhone-2G";
  1209. if([phoneType isEqualToString:@"iPhone1,2"]) return @"iPhone-3G";
  1210. if([phoneType isEqualToString:@"iPhone2,1"]) return @"iPhone-3GS";
  1211. if([phoneType isEqualToString:@"iPhone3,1"]) return @"iPhone-4";
  1212. if([phoneType isEqualToString:@"iPhone3,2"]) return @"iPhone-4";
  1213. if([phoneType isEqualToString:@"iPhone3,3"]) return @"iPhone-4";
  1214. if([phoneType isEqualToString:@"iPhone4,1"]) return @"iPhone-4S";
  1215. if([phoneType isEqualToString:@"iPhone5,1"]) return @"iPhone-5";
  1216. if([phoneType isEqualToString:@"iPhone5,2"]) return @"iPhone-5";
  1217. if([phoneType isEqualToString:@"iPhone5,3"]) return @"iPhone-5c";
  1218. if([phoneType isEqualToString:@"iPhone5,4"]) return @"iPhone-5c";
  1219. if([phoneType isEqualToString:@"iPhone6,1"]) return @"iPhone-5s";
  1220. if([phoneType isEqualToString:@"iPhone6,2"]) return @"iPhone-5s";
  1221. if([phoneType isEqualToString:@"iPhone7,1"]) return @"iPhone-6Plus";
  1222. if([phoneType isEqualToString:@"iPhone7,2"]) return @"iPhone-6";
  1223. if([phoneType isEqualToString:@"iPhone8,1"]) return @"iPhone-6s";
  1224. if([phoneType isEqualToString:@"iPhone8,2"]) return @"iPhone-6sPlus";
  1225. if([phoneType isEqualToString:@"iPhone8,4"]) return @"iPhone-SE";
  1226. if([phoneType isEqualToString:@"iPhone9,1"]) return @"iPhone-7";
  1227. if([phoneType isEqualToString:@"iPhone9,2"]) return @"iPhone-7Plus";
  1228. if([phoneType isEqualToString:@"iPhone10,1"]) return @"iPhone-8";
  1229. if([phoneType isEqualToString:@"iPhone10,4"]) return @"iPhone-8";
  1230. if([phoneType isEqualToString:@"iPhone10,2"]) return @"iPhone-8Plus";
  1231. if([phoneType isEqualToString:@"iPhone10,5"]) return @"iPhone-8Plus";
  1232. if([phoneType isEqualToString:@"iPhone10,3"]) return @"iPhone-X";
  1233. if([phoneType isEqualToString:@"iPhone10,6"]) return @"iPhone-X";
  1234. if([phoneType isEqualToString:@"iPhone11,8"]) return @"iPhone-XR";
  1235. if([phoneType isEqualToString:@"iPhone11,2"]) return @"iPhone-XS";
  1236. if([phoneType isEqualToString:@"iPhone11,4"]) return @"iPhone-XSMax";
  1237. if([phoneType isEqualToString:@"iPhone11,6"]) return @"iPhone-XSMax";
  1238. if([phoneType isEqualToString:@"iPhone12,1"]) return @"iPhone-11";
  1239. if([phoneType isEqualToString:@"iPhone12,3"]) return @"iPhone-11Pro";
  1240. if([phoneType isEqualToString:@"iPhone12,5"]) return @"iPhone-11ProMax";
  1241. if([phoneType isEqualToString:@"iPhone12,8"]) return @"iPhone-SE2nd";
  1242. if([phoneType isEqualToString:@"iPhone13,1"]) return @"iPhone-12mini";
  1243. if([phoneType isEqualToString:@"iPhone13,2"]) return @"iPhone-12";
  1244. if([phoneType isEqualToString:@"iPhone13,3"]) return @"iPhone-12Pro";
  1245. if([phoneType isEqualToString:@"iPhone13,4"]) return @"iPhone-12ProMax";
  1246. if([phoneType isEqualToString:@"iPhone14,4"]) return @"iPhone-13mini";
  1247. if([phoneType isEqualToString:@"iPhone14,5"]) return @"iPhone-13";
  1248. if([phoneType isEqualToString:@"iPhone14,2"]) return @"iPhone-13Pro";
  1249. if([phoneType isEqualToString:@"iPhone14,3"]) return @"iPhone-13ProMax";
  1250. if([phoneType isEqualToString:@"iPhone14,6"]) return @"iPhone-SE3nd";
  1251. return phoneType;
  1252. }
  1253. + (NSInteger)getDeviceType;{
  1254. struct utsname systemInfo;
  1255. uname(&systemInfo);
  1256. NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
  1257. NSArray *symbols = [platform componentsSeparatedByString:@","];
  1258. NSInteger number = 0;
  1259. if (symbols.count > 0){
  1260. NSCharacterSet *characterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
  1261. number = [[[symbols[0] componentsSeparatedByCharactersInSet:characterSet] componentsJoinedByString:@""] integerValue];
  1262. }
  1263. return number;
  1264. }
  1265. /** 更新pushid */
  1266. +(void)updatePushId:(NSString *)pushId;{
  1267. if ([[Config getOwnID] intValue] <= 0) {
  1268. return;
  1269. }
  1270. [YBNetworking postWithUrl:@"Login.upUserPush" Dic:@{@"pushid":pushId} Suc:^(int code, id info, NSString *msg) {
  1271. } Fail:^(id fail) {
  1272. }];
  1273. }
  1274. /** 重置为游客 */
  1275. +(void)resetUserToVisitor{
  1276. [PublicObj updatePushId:@""];
  1277. [Config clearUnified];
  1278. [Config saveUnified:[PublicObj visitorDic]];
  1279. [Config removeCashAccount];
  1280. [[YBImManager shareInstance] imLogout];
  1281. YBTabBarController *root = [self currentTabbar];
  1282. [root setSelectedIndex:0];
  1283. }
  1284. +(YBTabBarController *)currentTabbar{
  1285. NSArray *topA = [YBBaseAppDelegate sharedAppDelegate].topViewController.navigationController.viewControllers;
  1286. NSLog(@"rk_tabbar:%@",topA);
  1287. if (topA.count > 0) {
  1288. UIViewController *vc = topA[0];
  1289. if ([vc isKindOfClass:[YBTabBarController class]]) {
  1290. return (YBTabBarController *)vc;
  1291. }
  1292. return nil;
  1293. }
  1294. return nil;
  1295. }
  1296. /** 背景模糊图 */
  1297. +(UIImageView *)getAvatarEffectWithUrl:(NSString *)avatarUrl{
  1298. UIImageView *avatarEffect = [self getAvatarEffectWithUrl:avatarUrl andFrame:CGRectMake(0, 0, _window_width, _window_height)];
  1299. return avatarEffect;
  1300. }
  1301. +(UIImageView *)getAvatarEffectWithUrl:(NSString *)avatarUrl andFrame:(CGRect)effectFrame{
  1302. UIImageView *avatarEffect = [[UIImageView alloc]initWithFrame:effectFrame];
  1303. avatarEffect.contentMode = UIViewContentModeScaleAspectFill;
  1304. avatarEffect.clipsToBounds = YES;
  1305. UIBlurEffect *blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
  1306. UIVisualEffectView *effectview = [[UIVisualEffectView alloc] initWithEffect:blur];
  1307. effectview.frame = effectFrame;
  1308. [avatarEffect addSubview:effectview];
  1309. [avatarEffect sd_setImageWithURL:[NSURL URLWithString:avatarUrl] placeholderImage:[PublicObj getAppIcon]];
  1310. return avatarEffect;
  1311. }
  1312. #pragma mark - 直播中头像动画
  1313. +(CAKeyframeAnimation *)avatarScaleAnimation {
  1314. CAKeyframeAnimation *scaleAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
  1315. scaleAnimation.values = @[@1.0, @0.95, @0.90, @0.85, @0.90, @0.95, @1.0];
  1316. scaleAnimation.repeatCount = MAXFLOAT;
  1317. scaleAnimation.duration = 1.0;
  1318. scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
  1319. return scaleAnimation;
  1320. }
  1321. +(CAKeyframeAnimation *)bottomScaleAnimation {
  1322. CAKeyframeAnimation *scaleAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
  1323. scaleAnimation.values = @[@1.0,@1.05, @1.1, @1.15, @1.10, @1.05,@1.0];
  1324. scaleAnimation.repeatCount = MAXFLOAT;
  1325. scaleAnimation.duration = 1.0;
  1326. scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
  1327. return scaleAnimation;
  1328. }
  1329. #pragma mark - 获取私信未读数量【去除:粉丝、赞、AT、评论、官方】
  1330. //+(void)getRoomImUnread:(RoomIMNumBlock)complete {
  1331. // TIMManager *manager = [TIMManager sharedInstance];
  1332. // NSArray *convs = [manager getConversationList];
  1333. // NSMutableArray *arrayd = [NSMutableArray array];
  1334. // int unRead = 0;
  1335. //
  1336. // for (int i = 0; i < convs.count; i ++) {
  1337. // TIMConversation *conv = convs[i];
  1338. // if([conv getType] == TIM_SYSTEM){
  1339. // continue;
  1340. // }else if([conv getType] == TIM_GROUP){
  1341. // continue;
  1342. // }else if ([[conv getReceiver] isEqual:@"dsp_admin_1"] ||
  1343. // [[conv getReceiver] isEqual:@"dsp_fans"] ||
  1344. // [[conv getReceiver] isEqual:@"dsp_like"] ||
  1345. // [[conv getReceiver] isEqual:@"dsp_at"] ||
  1346. // [[conv getReceiver] isEqual:@"dsp_comment"] ||
  1347. // [[conv getReceiver] isEqual:@"dsp_user_live"] ||
  1348. // [[conv getReceiver] isEqual:@"goodsorder_admin"]
  1349. // ){
  1350. // continue;
  1351. // }
  1352. // /**
  1353. // *dsp_admin_1、dsp_admin_2、dsp_fans、dsp_like、dsp_at、dsp_comment、
  1354. // *dsp_admin_control、dsp_user_live、goodsorder_admin
  1355. // */
  1356. // [arrayd addObject:conv];
  1357. // }
  1358. // for (int i = 0; i < arrayd.count; i ++) {
  1359. // TIMConversation *conv = arrayd[i];
  1360. // int jjj = [conv getUnReadMessageNum];
  1361. // unRead += jjj;
  1362. // }
  1363. // if (complete) {
  1364. // complete(unRead);
  1365. // }
  1366. //}
  1367. #pragma mark - /** 是否开启了粗体文本 */
  1368. +(BOOL)isBlodText;{
  1369. return ![[UIFont preferredFontForTextStyle:UIFontTextStyleBody].fontName hasSuffix:@"-Regular"];
  1370. }
  1371. #pragma mark - /** 更新同城tab名称 */
  1372. +(NSString *)updataNewCity:(NSString *)cityName;{
  1373. NSArray *tabbarArray = [[PublicObj currentTabbar] viewControllers];
  1374. // NSArray *oldTitles = @[@"首页1",@"同城1",@"消息1",@"我1"];
  1375. // for (int i = 0; i<tabbarArray.count; i++) {
  1376. // UINavigationController *navaaaa = tabbarArray[i];
  1377. // navaaaa.tabBarItem.title = oldTitles[i];
  1378. // }
  1379. NSString *showName = YZMsg(@"同城");
  1380. if (cityName.length <= 2) {
  1381. showName = cityName;
  1382. }
  1383. [[NSNotificationCenter defaultCenter]postNotificationName:@"UpdateCity" object:showName];
  1384. // NSArray *newTitles = @[YZMsg(@"首页"),showName,YZMsg(@"消息"),YZMsg(@"我")];
  1385. // for (int i = 0; i<tabbarArray.count; i++) {
  1386. // UINavigationController *navaaaa = tabbarArray[i];
  1387. // navaaaa.tabBarItem.title = newTitles[i];
  1388. // }
  1389. // [PublicObj currentTabbar].tabbar.itemArr =[NSMutableArray arrayWithArray:newTitles] ;
  1390. // [[PublicObj currentTabbar] setViewControllers:tabbarArray];
  1391. return showName;
  1392. }
  1393. #pragma mark - /** token 验证*/
  1394. +(void)tokenAccess:(TokenAccessBlock)complete;{
  1395. int uid = [minstr([Config getOwnID]) intValue];
  1396. if (uid <= 0) {
  1397. complete(NO);
  1398. [PublicObj tokenExpired:@""];
  1399. return;
  1400. }
  1401. [YBNetworking postWithUrl:@"user.iftoken" Dic:nil Suc:^(int code, id info, NSString *msg) {
  1402. if (code == 0) {
  1403. complete(YES);
  1404. }else {
  1405. complete(NO);
  1406. [MBProgressHUD showPop:msg];
  1407. }
  1408. } Fail:^(id fail) {
  1409. complete(NO);
  1410. }];
  1411. }
  1412. +(void)checkGoodsExistenceWithID:(NSString *)goosID Existence:(GoodsExistenceEvent)existence{
  1413. // NSString *url = [purl stringByAppendingFormat:@"?service=Shop.getGoodExistence"];
  1414. NSDictionary *dic = @{
  1415. @"uid":[Config getOwnID],
  1416. @"goodsid":goosID,
  1417. };
  1418. [YBNetworking postWithUrl:@"Shop.getGoodExistence" Dic:dic Suc:^(int code, id info, NSString *msg) {
  1419. if (existence) {
  1420. existence(code,msg);
  1421. }
  1422. } Fail:^(id fail) {
  1423. }];
  1424. // [YBNetworking postWithUrl:url Dic:dic Suc:^(NSDictionary *data, NSString *code, NSString *msg) {
  1425. // if (existence) {
  1426. // existence(code,msg);
  1427. // }
  1428. // } Fail:^(id fail) {
  1429. // }];
  1430. }
  1431. /**
  1432. 计算字符串宽度
  1433. @param str 字符串
  1434. @param font 字体
  1435. @param height 高度
  1436. @return 宽度
  1437. */
  1438. - (CGFloat)widthOfString:(NSString *)str andFont:(UIFont *)font andHeight:(CGFloat)height{
  1439. return [str boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, height) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil].size.width;
  1440. }
  1441. + (CGFloat)widthOfString:(NSString *)str andFont:(UIFont *)font andHeight:(CGFloat)height{
  1442. return [str boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, height) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil].size.width;
  1443. }
  1444. /**
  1445. 计算字符串的高度
  1446. @param str 字符串
  1447. @param font 字体
  1448. @param width 宽度
  1449. @return 高度
  1450. */
  1451. + (CGFloat)heightOfString:(NSString *)str andFont:(UIFont *)font andWidth:(CGFloat)width{
  1452. return [str boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil].size.height;
  1453. }
  1454. +(YBButton *)youngAlertBtn {
  1455. YBButton *youngBtn = [YBButton buttonWithType:UIButtonTypeCustom];
  1456. [youngBtn setImage:[UIImage imageNamed:@"青少年-警告"] forState:0];
  1457. [youngBtn setTitle:YZMsg(@"未成年人禁止充值消费") forState:0];
  1458. [youngBtn setTitleColor:Pink_Cor forState:0];
  1459. youngBtn.imageEdgeInsets = UIEdgeInsetsMake(0, -6, 0, 0);
  1460. youngBtn.titleLabel.font = SYS_Font(12);
  1461. return youngBtn;
  1462. }
  1463. #pragma mark - 各类window弹窗层级布局
  1464. +(void)layoutWindowPopLayer;{
  1465. YBInvitationView *inviteV = nil;
  1466. YBAlertView *appUpdate = nil;
  1467. YBAlertView *appMaintain = nil;
  1468. YBAlertView *youngAlert = nil;
  1469. YBYoungSmall *youngSmall = nil;
  1470. for (UIView *view in [UIApplication sharedApplication].delegate.window.subviews) {
  1471. if ([view isKindOfClass:[YBInvitationView class]]) {
  1472. inviteV = (YBInvitationView *)view;
  1473. }else if ([view isKindOfClass:[YBAlertView class]]){
  1474. YBAlertView *selfAlert = (YBAlertView *)view;
  1475. if (selfAlert.alertFrom == AlertFrom_YoungModel) {
  1476. youngAlert = selfAlert;
  1477. }else if (selfAlert.alertFrom == AlertFrom_AppUpdate){
  1478. appUpdate = selfAlert;
  1479. }else if (selfAlert.alertFrom == AlertFrom_Maintain){
  1480. appMaintain = selfAlert;
  1481. }
  1482. }else if ([view isKindOfClass:[YBYoungSmall class]]){
  1483. youngSmall = (YBYoungSmall *)view;
  1484. }
  1485. }
  1486. if (inviteV) {
  1487. [[UIApplication sharedApplication].delegate.window bringSubviewToFront:inviteV];
  1488. }
  1489. if (youngAlert) {
  1490. [[UIApplication sharedApplication].delegate.window bringSubviewToFront:youngAlert];
  1491. }
  1492. if (youngSmall) {
  1493. [[UIApplication sharedApplication].delegate.window bringSubviewToFront:youngSmall];
  1494. }
  1495. if (appUpdate) {
  1496. [[UIApplication sharedApplication].delegate.window bringSubviewToFront:appUpdate];
  1497. }
  1498. if (appMaintain) {
  1499. [[UIApplication sharedApplication].delegate.window bringSubviewToFront:appMaintain];
  1500. }
  1501. }
  1502. #pragma mark - 拒绝协议杀掉app
  1503. +(void)appDestroy {
  1504. // Home键退出后台动画效果,此时后台还是挂起状态
  1505. [[UIApplication sharedApplication] performSelector:@selector(suspend)];
  1506. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  1507. #pragma clang diagnostic push
  1508. #pragma clang diagnostic ignored "-Wundeclared-selector"
  1509. [[UIApplication sharedApplication] performSelector:@selector(terminateWithSuccess)];
  1510. #pragma clang diagnostic pop
  1511. });
  1512. }
  1513. #pragma mark - 美颜
  1514. +(BOOL)isBaseBeauty;{
  1515. if ([PublicObj checkNull:[common getTISDKKey]] ||
  1516. [PublicObj checkNull:[common getTISDKAppid]]) {
  1517. return YES;
  1518. }
  1519. return NO;
  1520. }
  1521. +(YBBaseViewController *)currentViewContorller {
  1522. // UIResponder *next = [[YBAppDelegate sharedAppDelegate].topViewController nextResponder];
  1523. UIResponder *next = (UIResponder *)[YBBaseAppDelegate sharedAppDelegate].topViewController;
  1524. do {if ([next isKindOfClass:[YBBaseViewController class]]) {
  1525. return (YBBaseViewController *)next;
  1526. }
  1527. next = [next nextResponder];
  1528. } while (next !=nil);
  1529. return nil;
  1530. }
  1531. +(NSString *)getDateDisplayString:(NSDate *)date {
  1532. NSDateFormatter *dateFmt = [[NSDateFormatter alloc ] init ];
  1533. dateFmt.dateFormat = @"yyyy-MM-dd HH:mm";
  1534. return [dateFmt stringFromDate:date];
  1535. }
  1536. +(NSString *)getUserDateString:(NSDate *)date{
  1537. NSCalendar *calendar = [ NSCalendar currentCalendar ];
  1538. int unit = NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear ;
  1539. NSDateFormatter *dateFmt = [[NSDateFormatter alloc ] init ];
  1540. dateFmt.dateFormat = @"yyyy-MM-dd HH:mm";
  1541. return [dateFmt stringFromDate:date];
  1542. }
  1543. + (NSString *)getFriendlyDateString:(NSTimeInterval)timeInterval
  1544. forConversation:(BOOL)isShort {
  1545. NSDate* theDate = [NSDate dateWithTimeIntervalSince1970:timeInterval/1000];
  1546. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  1547. NSString * FORMAT_PAST_SHORT = @"MM-dd HH:mm";
  1548. [formatter setDateFormat:FORMAT_PAST_SHORT];
  1549. NSString *dateStr = [formatter stringFromDate:theDate];
  1550. return dateStr;
  1551. }
  1552. #pragma mark - data转字符串
  1553. +(NSString *)transformToStringWithData:(id)originData; {
  1554. if (!originData) {
  1555. return @"";
  1556. }
  1557. NSString *getStr = @"not data";
  1558. if ([originData isKindOfClass:[NSData class]]) {
  1559. getStr = [[NSString alloc] initWithData:originData encoding:NSUTF8StringEncoding];
  1560. }
  1561. return getStr;
  1562. }
  1563. + (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString
  1564. {
  1565. if (jsonString == nil) {
  1566. return nil;
  1567. }
  1568. NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
  1569. NSError *err;
  1570. NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
  1571. options:NSJSONReadingMutableContainers
  1572. error:&err];
  1573. if(err)
  1574. {
  1575. NSLog(@"json解析失败:%@",err);
  1576. return nil;
  1577. }
  1578. return dic;
  1579. }
  1580. + (BOOL)isUrlString:(NSString *)string {
  1581. NSString *emailRegex = @"[a-zA-z]+://.*";
  1582. NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
  1583. return [emailTest evaluateWithObject:string];
  1584. }
  1585. #pragma mark - tabbar消息未读
  1586. +(void)setTabbarBadgeValue:(int)value; {
  1587. UIApplication *app =[UIApplication sharedApplication];
  1588. AppDelegate *app2 = (AppDelegate*)app.delegate;
  1589. [app2.rtabbar updateNum:value];
  1590. }
  1591. #pragma mark - 数据格式检验、转换
  1592. +(NSArray *)toArrayOfInfo:(id)info; {
  1593. NSArray *infoA;
  1594. if ([info isKindOfClass:[NSArray class]]) {
  1595. infoA = [NSArray arrayWithArray:info];
  1596. }else {
  1597. infoA = @[];
  1598. }
  1599. return infoA;
  1600. }
  1601. +(NSDictionary *)toDicOfInfo:(id)info; {
  1602. NSDictionary *infoDic;
  1603. if ([info isKindOfClass:[NSArray class]]) {
  1604. NSArray *infoA = [NSArray arrayWithArray:info];
  1605. if (infoA.count>0) {
  1606. id firstObj = [infoA firstObject];
  1607. if ([firstObj isKindOfClass:[NSDictionary class]]) {
  1608. infoDic = [NSDictionary dictionaryWithDictionary:firstObj];
  1609. }else {
  1610. infoDic = @{};
  1611. }
  1612. }else {
  1613. infoDic = @{};
  1614. }
  1615. }else if([info isKindOfClass:[NSDictionary class]]){
  1616. infoDic = [NSDictionary dictionaryWithDictionary:info];
  1617. }else {
  1618. infoDic = @{};
  1619. }
  1620. return infoDic;
  1621. }
  1622. @end