YHUtils.m 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. //
  2. // HHUtils.m
  3. // HipHopBattle
  4. //
  5. // Created by samuelandkevin on 14-6-26.
  6. // Copyright (c) 2014年 Dope Beats Co.,Ltd. All rights reserved.
  7. //
  8. #import "YHUtils.h"
  9. #import <AVFoundation/AVFoundation.h>
  10. #import <CommonCrypto/CommonCrypto.h>
  11. #import <sys/utsname.h>
  12. #import "AppDelegate.h"
  13. #import <CommonCrypto/CommonDigest.h>
  14. #import "NSDate+LYXCategory.h"
  15. #define FileHashDefaultChunkSizeForReadingData 1024*512
  16. #define kCommonAlertTag 10
  17. CFStringRef FileMD5HashCreateWithPath(CFStringRef filePath,size_t chunkSizeForReadingData) {
  18. // Declare needed variables
  19. CFStringRef result = NULL;
  20. CFReadStreamRef readStream = NULL;
  21. // Get the file URL
  22. CFURLRef fileURL =
  23. CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
  24. (CFStringRef)filePath,
  25. kCFURLPOSIXPathStyle,
  26. (Boolean)false);
  27. if (!fileURL) goto done;
  28. // Create and open the read stream
  29. readStream = CFReadStreamCreateWithFile(kCFAllocatorDefault,
  30. (CFURLRef)fileURL);
  31. if (!readStream) goto done;
  32. bool didSucceed = (bool)CFReadStreamOpen(readStream);
  33. if (!didSucceed) goto done;
  34. // Initialize the hash object
  35. CC_MD5_CTX hashObject;
  36. CC_MD5_Init(&hashObject);
  37. // Make sure chunkSizeForReadingData is valid
  38. if (!chunkSizeForReadingData) {
  39. chunkSizeForReadingData = FileHashDefaultChunkSizeForReadingData;
  40. }
  41. // Feed the data to the hash object
  42. bool hasMoreData = true;
  43. while (hasMoreData) {
  44. uint8_t buffer[chunkSizeForReadingData];
  45. CFIndex readBytesCount = CFReadStreamRead(readStream,(UInt8 *)buffer,(CFIndex)sizeof(buffer));
  46. if (readBytesCount == -1) break;
  47. if (readBytesCount == 0) {
  48. hasMoreData = false;
  49. continue;
  50. }
  51. CC_MD5_Update(&hashObject,(const void *)buffer,(CC_LONG)readBytesCount);
  52. }
  53. // Check if the read operation succeeded
  54. didSucceed = !hasMoreData;
  55. // Compute the hash digest
  56. unsigned char digest[CC_MD5_DIGEST_LENGTH];
  57. CC_MD5_Final(digest, &hashObject);
  58. // Abort if the read operation failed
  59. if (!didSucceed) goto done;
  60. // Compute the string result
  61. char hash[ 2 * sizeof(digest) + 1 ];
  62. for (size_t i = 0; i < sizeof(digest); ++i) {
  63. snprintf(hash + (2 * i), 3, "%02x", (int)(digest[i]));
  64. }
  65. hash[ 2 * sizeof(digest) ] = '\0';
  66. result = CFStringCreateWithCString(kCFAllocatorDefault,(const char *)hash,kCFStringEncodingUTF8);
  67. done:
  68. if (readStream) {
  69. CFReadStreamClose(readStream);
  70. CFRelease(readStream);
  71. }
  72. if (fileURL) {
  73. CFRelease(fileURL);
  74. }
  75. return result;
  76. }
  77. @interface AssistObject : NSObject
  78. @property (nonatomic, copy) HHAlertCallback callbackForAlert;
  79. @property (nonatomic, copy) NSString *title;
  80. @property (nonatomic, copy) NSString *message;
  81. @property (nonatomic, weak) id alertView;
  82. //@property (nonatomic, strong) NSMutableArray *alertViews;
  83. @end
  84. @interface HHUIAlertView : UIAlertView
  85. @property (nonatomic, strong) HHAlertCallback dismissCallback;
  86. @end
  87. @implementation HHUIAlertView
  88. @end
  89. static AssistObject *g_assistObj = nil;
  90. @interface YHUtils ()<UIAlertViewDelegate>
  91. {
  92. }
  93. @end
  94. @implementation YHUtils
  95. + (long long)freeDiskSpaceInBytes{
  96. struct statfs buf;
  97. long long freespace = -1;
  98. if(statfs("/var", &buf) >= 0){
  99. freespace = (long long)(buf.f_bsize * buf.f_bfree);
  100. }
  101. return freespace;
  102. }
  103. +(NSString*)getFileMD5WithPath:(NSString*)path
  104. {
  105. return (__bridge_transfer NSString *)FileMD5HashCreateWithPath((__bridge CFStringRef)path,FileHashDefaultChunkSizeForReadingData);
  106. }
  107. + (NSString *)getFileMD5WithData:(NSData *)data {
  108. unsigned char digest[CC_MD5_DIGEST_LENGTH];
  109. // MD5_CTX smd5;
  110. // MD5_Init(&smd5);
  111. // MD5_Update(&smd5, data.bytes, data.length);
  112. // MD5_Final(digest, &smd5);
  113. CC_MD5( data.bytes, (UInt32)data.length, digest );
  114. NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
  115. for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
  116. [result appendFormat:@"%02x", digest[i]];
  117. return result;
  118. }
  119. + (UIView *)rotate360DegreeWithView:(UIImageView *)imageView {
  120. [imageView.layer removeAnimationForKey:@"rotateView"];
  121. CABasicAnimation *animation = [ CABasicAnimation
  122. animationWithKeyPath: @"transform.rotation.z" ];
  123. // animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
  124. animation.fromValue = @(0.0);
  125. //围绕Z轴旋转,垂直与屏幕
  126. animation.toValue = @(-M_PI);
  127. // [ NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0.0, 0.0, 1.0) ];
  128. animation.duration = 0.5;
  129. //旋转效果累计,先转180度,接着再旋转180度,从而实现360旋转
  130. animation.cumulative = YES;
  131. animation.repeatCount = HUGE_VALF;
  132. [imageView.layer addAnimation:animation forKey:@"rotateView"];
  133. return imageView;
  134. }
  135. + (void)showAlertWithTitle:(NSString *)title message:(NSString *)msg dismiss:(HHAlertCallback)callback {
  136. return [self showAlertWithTitle:title message:msg okTitle:@"确定" cancelTitle:@"取消" dismiss:callback];
  137. }
  138. + (void)showSingleButtonAlertWithTitle:(NSString *)title message:(NSString *)msg okTitle:(NSString *)okString dismiss:(HHAlertCallback)callback {
  139. return [self showAlertWithTitle:title message:msg okTitle:okString cancelTitle:nil inViewController:[UIApplication sharedApplication].keyWindow.rootViewController dismiss:callback];
  140. }
  141. + (void)showAlertWithTitle:(NSString *)title message:(NSString *)msg okTitle:(NSString *)okString cancelTitle:(NSString *)cancelString dismiss:(HHAlertCallback)callback {
  142. return [self showAlertWithTitle:title message:msg okTitle:okString cancelTitle:cancelString inViewController:[UIApplication sharedApplication].keyWindow.rootViewController dismiss:callback];
  143. }
  144. + (void)showAlertWithTitle:(NSString *)title message:(NSString *)msg okTitle:(NSString *)okString cancelTitle:(NSString *)cancelString inViewController:(UIViewController *)vc dismiss:(HHAlertCallback)callback
  145. {
  146. if (!g_assistObj) {
  147. g_assistObj = [AssistObject new];
  148. }
  149. NSString *titleString = title?title:@"提示";
  150. if ([[UIDevice currentDevice].systemVersion floatValue]< 8.0) {
  151. HHUIAlertView *alert = [[HHUIAlertView alloc] initWithTitle:titleString message:msg delegate:g_assistObj cancelButtonTitle:cancelString otherButtonTitles:okString, nil];
  152. alert.dismissCallback = callback;
  153. alert.tag = kCommonAlertTag;
  154. [alert show];
  155. g_assistObj.alertView = alert;
  156. }
  157. else {
  158. UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
  159. if (cancelString) {
  160. UIAlertAction *cancel = [UIAlertAction actionWithTitle:cancelString style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
  161. dispatch_async(dispatch_get_main_queue(), ^{
  162. if (callback) {
  163. callback( NO );
  164. }
  165. // g_assistObj.callbackForAlert(NO);
  166. // g_assistObj.callbackForAlert = nil;
  167. });
  168. }];
  169. [alert addAction:cancel];
  170. }
  171. UIAlertAction *ok = [UIAlertAction actionWithTitle:okString style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
  172. dispatch_async(dispatch_get_main_queue(), ^{
  173. if (callback) {
  174. callback( YES );
  175. }
  176. // g_assistObj.callbackForAlert(YES);
  177. // g_assistObj.callbackForAlert = nil;
  178. });
  179. }];
  180. [alert addAction:ok];
  181. dispatch_async(dispatch_get_main_queue(), ^ {
  182. [vc presentViewController:alert animated:YES completion:nil];
  183. });
  184. g_assistObj.alertView = alert;
  185. }
  186. }
  187. + (void)dismissAlertWithClickedButtonIndex:(NSInteger)buttonIndex
  188. animated:(BOOL)animated {
  189. if (g_assistObj.alertView) {
  190. if ([g_assistObj.alertView isKindOfClass:[UIAlertView class]]) {
  191. [g_assistObj.alertView dismissWithClickedButtonIndex:buttonIndex animated:animated];
  192. }
  193. else if ([g_assistObj.alertView isKindOfClass:[UIAlertController class]]) {
  194. [g_assistObj.alertView dismissViewControllerAnimated:animated completion:nil];
  195. }
  196. }
  197. }
  198. + (NSDictionary *)parseUrlParameters:(NSURL *)url {
  199. NSMutableDictionary *retMd = [NSMutableDictionary dictionary];
  200. NSString *query = [url query];
  201. if (!query || query.length == 0) {
  202. return retMd;
  203. }
  204. NSArray *parameters = [query componentsSeparatedByString:@"&"];
  205. for (NSString *str in parameters) {
  206. NSArray *keyValue = [str componentsSeparatedByString:@"="];
  207. [retMd setObject:keyValue[1] forKey:keyValue[0]];
  208. }
  209. return retMd;
  210. }
  211. + (void)postTip:(NSString *)tipsTitle RGB16:(int)rgbValue complete:(void(^)())completeCallback {
  212. [self postTip:tipsTitle RGBcolorRed:((float)((rgbValue & 0xFF0000) >> 16)) \
  213. green:((float)((rgbValue & 0xFF00) >> 8)) \
  214. blue:((float)(rgbValue & 0xFF)) \
  215. keepTime:1.0 \
  216. complete:completeCallback];
  217. }
  218. + (void)postTip:(NSString *)tipsTitle RGB16:(int)rgbValue keepTime:(NSTimeInterval)interval complete:(void(^)())completeCallback {
  219. [self postTip:tipsTitle RGBcolorRed:((float)((rgbValue & 0xFF0000) >> 16)) \
  220. green:((float)((rgbValue & 0xFF00) >> 8)) \
  221. blue:((float)(rgbValue & 0xFF)) \
  222. keepTime:interval \
  223. complete:completeCallback];
  224. }
  225. + (void)postTip:(NSString *)tipsTitle RGBcolorRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue keepTime:(NSTimeInterval)time complete:(void(^)())completeCallback {
  226. UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
  227. UILabel *labelBanner = [[UILabel alloc] initWithFrame:CGRectMake(0, -20, keyWindow.frame.size.width, 20)];
  228. labelBanner.font = [UIFont systemFontOfSize:10.0f];
  229. labelBanner.text = tipsTitle;
  230. labelBanner.textAlignment = NSTextAlignmentCenter;
  231. labelBanner.backgroundColor = [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1];
  232. labelBanner.textColor = [UIColor colorWithRed:239/255.0 green:239/255.0 blue:239/255.0 alpha:1];
  233. keyWindow.windowLevel = UIWindowLevelStatusBar + 1.0f;
  234. [keyWindow addSubview:labelBanner];
  235. [UIView animateWithDuration:0.3 animations:^{
  236. //显示出来
  237. labelBanner.transform = CGAffineTransformMakeTranslation(0, 20);
  238. } completion:^(BOOL finished) {
  239. //停留0.5
  240. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(time * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  241. //回去
  242. [UIView animateWithDuration:0.5 animations:^{
  243. labelBanner.transform = CGAffineTransformIdentity;
  244. } completion:^(BOOL finished) {
  245. keyWindow.windowLevel = UIWindowLevelNormal;
  246. if (completeCallback) {
  247. completeCallback();
  248. }
  249. }];
  250. });
  251. }];
  252. }
  253. + (NSString *)md5HexDigest:(NSString*)input{
  254. const char *cStr = [input UTF8String];
  255. unsigned char digest[CC_MD5_DIGEST_LENGTH];
  256. CC_MD5( cStr, (CC_LONG)input.length, digest );
  257. NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
  258. for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
  259. [result appendFormat:@"%02x", digest[i]];
  260. return result;
  261. }
  262. + (NSString *)getDeviceVersion {
  263. NSString *deviceType;
  264. struct utsname systemInfo;
  265. uname(&systemInfo);
  266. deviceType = [NSString stringWithCString:systemInfo.machine
  267. encoding:NSUTF8StringEncoding];
  268. return deviceType;
  269. }
  270. + (NSString*)phoneType
  271. {
  272. NSString *platform = getDeviceVersion();
  273. //iPhone
  274. if ([platform isEqualToString:@"iPhone1,1"]) return@"iPhone 1G";
  275. if ([platform isEqualToString:@"iPhone1,2"]) return@"iPhone 3G";
  276. if ([platform isEqualToString:@"iPhone2,1"]) return@"iPhone 3GS";
  277. if ([platform isEqualToString:@"iPhone3,1"]) return@"iPhone 4";
  278. if ([platform isEqualToString:@"iPhone3,2"]) return@"Verizon iPhone 4";
  279. if ([platform isEqualToString:@"iPhone3,3"]) return@"iPhone 4 (CDMA)";
  280. if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4s";
  281. if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5 (GSM/WCDMA)";
  282. if ([platform isEqualToString:@"iPhone4,2"]) return @"iPhone 5 (CDMA)";
  283. if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5S";
  284. if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5S";
  285. if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6";
  286. if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6 Plus";
  287. if ([platform isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
  288. if ([platform isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
  289. //iPot Touch
  290. if ([platform isEqualToString:@"iPod1,1"]) return@"iPod Touch 1G";
  291. if ([platform isEqualToString:@"iPod2,1"]) return@"iPod Touch 2G";
  292. if ([platform isEqualToString:@"iPod3,1"]) return@"iPod Touch 3G";
  293. if ([platform isEqualToString:@"iPod4,1"]) return@"iPod Touch 4G";
  294. if ([platform isEqualToString:@"iPod5,1"]) return@"iPod Touch 5G";
  295. //iPad
  296. if ([platform isEqualToString:@"iPad1,1"]) return@"iPad";
  297. if ([platform isEqualToString:@"iPad2,1"]) return@"iPad 2 (WiFi)";
  298. if ([platform isEqualToString:@"iPad2,2"]) return@"iPad 2 (GSM)";
  299. if ([platform isEqualToString:@"iPad2,3"]) return@"iPad 2 (CDMA)";
  300. if ([platform isEqualToString:@"iPad2,4"]) return@"iPad 2 New";
  301. if ([platform isEqualToString:@"iPad2,5"]) return@"iPad Mini (WiFi)";
  302. if ([platform isEqualToString:@"iPad3,1"]) return@"iPad 3 (WiFi)";
  303. if ([platform isEqualToString:@"iPad3,2"]) return@"iPad 3 (CDMA)";
  304. if ([platform isEqualToString:@"iPad3,3"]) return@"iPad 3 (GSM)";
  305. if ([platform isEqualToString:@"iPad3,4"]) return@"iPad 4 (WiFi)";
  306. if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"]) return@"Simulator";
  307. return platform;
  308. }
  309. + (NSString *)phoneSystem{
  310. return [NSString stringWithFormat:@"%@%@",[UIDevice currentDevice].systemName,[UIDevice currentDevice].systemVersion];
  311. }
  312. + (NSString *)appStoreNumber{
  313. return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  314. }
  315. + (NSString *)appBulidNumber{
  316. return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
  317. }
  318. + (BOOL)compareWithBeginDateString:(NSString *)beginDateString andEndDateString:(NSString *)endDateString
  319. {
  320. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  321. [dateFormatter setDateFormat:@"yyyy-MM"];
  322. NSDate *beginDate = [dateFormatter dateFromString:beginDateString];
  323. NSDate *endDate = [dateFormatter dateFromString:endDateString];
  324. NSComparisonResult result = [beginDate compare:endDate];
  325. if (result == NSOrderedAscending)
  326. {
  327. return YES;
  328. }
  329. return NO;
  330. }
  331. ///**
  332. // * 格式化日期
  333. // *
  334. // * @param dateFormat 日期格式,etg:@"yyyy-MM-dd HH:mm:ss"
  335. // *
  336. // * @return 字符串
  337. // */
  338. //- (NSString *)toStringByformat:(NSString *)dateFormat
  339. //{
  340. // NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  341. // [formatter setDateFormat:dateFormat];
  342. // NSString *returnString = [formatter stringFromDate:self];
  343. // ARC_RELEASE(dateFormatter);
  344. // return returnString;
  345. //}
  346. #pragma mark - 格式化显示时间 4月12日
  347. + (NSDate *)dateFromString:(NSString *)dateString{
  348. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  349. [dateFormatter setDateFormat: @"yyyy-MM-dd HH:mm:ss"];
  350. NSDate *destDate= [dateFormatter dateFromString:dateString];
  351. return destDate;
  352. }
  353. + (NSString *)getNormalShowDateString:(NSString *)dateString
  354. {
  355. NSDate *nowDate = [NSDate date];
  356. NSString *dateStr = [dateString substringToIndex:9];
  357. NSString *curDateStr = [nowDate toStringByformat:@"yyyy-MM-dd"];
  358. if ([dateStr isEqualToString:curDateStr])
  359. {
  360. //当天信息
  361. NSString *hourString = [dateString substringWithRange:NSMakeRange(11, 2)];
  362. NSInteger hour = [hourString integerValue];
  363. NSString *strMonment = @"";
  364. if(hour < 6){
  365. strMonment = @"凌晨";
  366. }
  367. else if (hour < 12){
  368. strMonment = @"上午";
  369. }
  370. else if (hour < 18){
  371. strMonment = @"下午";
  372. }
  373. else{
  374. strMonment = @"晚上";
  375. }
  376. NSString *timeString = [dateString substringWithRange:NSMakeRange(11, 5)];
  377. return [NSString stringWithFormat:@"%@%@",strMonment,timeString];
  378. }
  379. else
  380. {
  381. NSDate *yesterday = [NSDate dateWithTimeIntervalSince1970:[nowDate timeIntervalSince1970]-(24*60*60)];
  382. NSString* yesterdatStr = [yesterday toStringByformat:@"yyyy-MM-dd"];
  383. if ([dateStr isEqualToString:yesterdatStr])//昨天
  384. {
  385. NSString *timeString = [dateString substringWithRange:NSMakeRange(11, 5)];
  386. return [NSString stringWithFormat:@"昨天%@",timeString];
  387. }
  388. else
  389. {
  390. NSString *dateStr = [dateString substringToIndex:4];
  391. NSString *curDateStr = [nowDate toStringByformat:@"yyyy"];
  392. if ([dateStr isEqualToString:curDateStr])//当年
  393. {
  394. //MM月dd日
  395. return [dateString substringWithRange:NSMakeRange(5, 5)];
  396. }
  397. else//超过一年
  398. {
  399. //yyyy年MM月dd日
  400. return [dateString substringWithRange:NSMakeRange(0, 10)];
  401. }
  402. }
  403. }
  404. }
  405. @end
  406. @implementation AssistObject
  407. #pragma mark - AlertDelegate
  408. - (void)alertView:(HHUIAlertView *)alertView
  409. didDismissWithButtonIndex:(NSInteger)buttonIndex {
  410. if (alertView.tag == kCommonAlertTag) {
  411. dispatch_async(dispatch_get_main_queue(), ^{
  412. if (buttonIndex == 1) {
  413. // _callbackForAlert( YES );
  414. alertView.dismissCallback( YES );
  415. }
  416. else {
  417. alertView.dismissCallback( NO );
  418. // _callbackForAlert( NO );
  419. }
  420. // _callbackForAlert = NULL;
  421. });
  422. }
  423. }
  424. @end
  425. int getFileSize(NSString *path)
  426. {
  427. NSFileManager * filemanager = [[NSFileManager alloc]init];
  428. if([filemanager fileExistsAtPath:path]){
  429. NSDictionary * attributes = [filemanager attributesOfItemAtPath:path error:nil];
  430. NSNumber *theFileSize;
  431. if ( (theFileSize = [attributes objectForKey:NSFileSize]) )
  432. return [theFileSize intValue];
  433. else
  434. return -1;
  435. }
  436. else
  437. {
  438. return -1;
  439. }
  440. }
  441. NSString* getDeviceVersion()
  442. {
  443. NSString *deviceType;
  444. struct utsname systemInfo;
  445. uname(&systemInfo);
  446. deviceType = [NSString stringWithCString:systemInfo.machine
  447. encoding:NSUTF8StringEncoding];
  448. return deviceType;
  449. }
  450. NSString * platformString ()
  451. {
  452. NSString *platform = getDeviceVersion();
  453. //iPhone
  454. if ([platform isEqualToString:@"iPhone1,1"]) return@"iPhone 1G";
  455. if ([platform isEqualToString:@"iPhone1,2"]) return@"iPhone 3G";
  456. if ([platform isEqualToString:@"iPhone2,1"]) return@"iPhone 3GS";
  457. if ([platform isEqualToString:@"iPhone3,1"]) return@"iPhone 4";
  458. if ([platform isEqualToString:@"iPhone3,2"]) return@"Verizon iPhone 4";
  459. if ([platform isEqualToString:@"iPhone3,3"]) return@"iPhone 4 (CDMA)";
  460. if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4s";
  461. if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5 (GSM/WCDMA)";
  462. if ([platform isEqualToString:@"iPhone4,2"]) return @"iPhone 5 (CDMA)";
  463. //iPot Touch
  464. if ([platform isEqualToString:@"iPod1,1"]) return@"iPod Touch 1G";
  465. if ([platform isEqualToString:@"iPod2,1"]) return@"iPod Touch 2G";
  466. if ([platform isEqualToString:@"iPod3,1"]) return@"iPod Touch 3G";
  467. if ([platform isEqualToString:@"iPod4,1"]) return@"iPod Touch 4G";
  468. if ([platform isEqualToString:@"iPod5,1"]) return@"iPod Touch 5G";
  469. //iPad
  470. if ([platform isEqualToString:@"iPad1,1"]) return@"iPad";
  471. if ([platform isEqualToString:@"iPad2,1"]) return@"iPad 2 (WiFi)";
  472. if ([platform isEqualToString:@"iPad2,2"]) return@"iPad 2 (GSM)";
  473. if ([platform isEqualToString:@"iPad2,3"]) return@"iPad 2 (CDMA)";
  474. if ([platform isEqualToString:@"iPad2,4"]) return@"iPad 2 New";
  475. if ([platform isEqualToString:@"iPad2,5"]) return@"iPad Mini (WiFi)";
  476. if ([platform isEqualToString:@"iPad3,1"]) return@"iPad 3 (WiFi)";
  477. if ([platform isEqualToString:@"iPad3,2"]) return@"iPad 3 (CDMA)";
  478. if ([platform isEqualToString:@"iPad3,3"]) return@"iPad 3 (GSM)";
  479. if ([platform isEqualToString:@"iPad3,4"]) return@"iPad 4 (WiFi)";
  480. if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"]) return@"Simulator";
  481. return platform;
  482. }
  483. BOOL compareStringIdsDiff( NSArray *allphones, NSString *phonesCacheFilePath, NSArray **addlist, NSArray **removelist ) {
  484. NSMutableArray *cachephones = [NSMutableArray arrayWithContentsOfFile:phonesCacheFilePath];
  485. NSMutableArray *sortedAllPhones = [NSMutableArray arrayWithArray:allphones];
  486. [sortedAllPhones sortUsingSelector:@selector(compare:)];
  487. NSMutableArray *maAddList = [NSMutableArray array];
  488. NSMutableArray *maRemoveList = [NSMutableArray array];
  489. BOOL hasChange = NO;
  490. if (cachephones) {
  491. // 有过记录
  492. NSMutableIndexSet *shouldRemoveIndex = [NSMutableIndexSet indexSet];
  493. int lindx, rindx; lindx = rindx = 0;
  494. do {
  495. if ( lindx >= cachephones.count) {
  496. // 左边没有了,右边全部增加到addlist
  497. NSArray *subarray = [sortedAllPhones subarrayWithRange:NSMakeRange(rindx, sortedAllPhones.count - rindx)];
  498. [maAddList addObjectsFromArray:subarray];
  499. break;
  500. }
  501. if ( rindx >= sortedAllPhones.count) {
  502. // 右边没有了,左边全部回到removelist
  503. NSArray *subarray = [cachephones subarrayWithRange:NSMakeRange(lindx, cachephones.count - lindx)];
  504. [maRemoveList addObjectsFromArray:subarray];
  505. break;
  506. }
  507. long long lv = [cachephones[lindx] longLongValue];
  508. long long rv = [sortedAllPhones[rindx] longLongValue];
  509. if ( lv > rv ) {
  510. [maAddList addObject:sortedAllPhones[rindx]];
  511. rindx++;
  512. }
  513. else if (lv == rv) {
  514. lindx++;
  515. rindx++;
  516. }
  517. else {
  518. [maRemoveList addObject:cachephones[lindx]];
  519. [shouldRemoveIndex addIndex:lindx];
  520. lindx++;
  521. }
  522. } while (1);
  523. if (maAddList.count > 0 || maRemoveList.count > 0) {
  524. hasChange = YES;
  525. }
  526. }
  527. else {
  528. }
  529. [sortedAllPhones writeToFile:phonesCacheFilePath atomically:NO];
  530. if (addlist) {
  531. *addlist = maAddList;
  532. }
  533. if (removelist) {
  534. *removelist = maRemoveList;
  535. }
  536. return hasChange;
  537. }