JCHATStringUtils.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. //
  2. // Created by Javen on 15/5/11.
  3. // Copyright (c) 2015 HXHG. All rights reserved.
  4. //
  5. #import "JCHATStringUtils.h"
  6. #import "NSDate+Utilities.h"
  7. #import "sys/utsname.h"
  8. @implementation JCHATStringUtils {
  9. }
  10. static NSString * const FORMAT_PAST_SHORT = @"yyyy/MM/dd";
  11. static NSString * const FORMAT_PAST_TIME = @"ahh:mm";
  12. static NSString * const FORMAT_THIS_WEEK = @"eee ahh:mm";
  13. static NSString * const FORMAT_THIS_WEEK_SHORT = @"eee";
  14. static NSString * const FORMAT_YESTERDAY = @"ahh:mm";
  15. static NSString * const FORMAT_TODAY = @"ahh:mm";
  16. + (NSString *)errorAlert:(NSError *)error {
  17. NSString *errorAlert = nil;
  18. switch (error.code) {
  19. // case JMSG_ERROR_NETWORK_REQUEST_TIMEOUT:
  20. // errorAlert = @"服务器返回超时";
  21. // break;
  22. // case JMSG_ERROR_NETWORK_REQUEST_FAIL:
  23. // errorAlert = @"服务器请求失败";
  24. // break;
  25. // case JMSG_ERROR_NETWORK_SERVER_FAIL:
  26. // errorAlert = @"服务端错误";
  27. // break;
  28. // case JMSG_ERROR_NETWORK_HOST_UNKNOWN:
  29. // errorAlert = @"地址错误";
  30. // break;
  31. case kJMSGErrorSDKNetworkDownloadFailed:
  32. errorAlert = @"下载失败";
  33. break;
  34. case kJMSGErrorSDKNetworkUploadFailed:
  35. errorAlert = @"上传资源文件失败";
  36. break;
  37. case kJMSGErrorSDKNetworkUploadTokenVerifyFailed:
  38. errorAlert = @"上传资源文件Token验证失败";
  39. break;
  40. case kJMSGErrorSDKNetworkUploadTokenGetFailed:
  41. errorAlert = @"获取服务器Token失败";
  42. break;
  43. // case kJMSGErrorNetworkDataFormatInvalid:
  44. // errorAlert = @"数据格式错误";
  45. // break;
  46. case kJMSGErrorSDKDBDeleteFailed:
  47. errorAlert = @"数据库删除失败";
  48. break;
  49. case kJMSGErrorSDKDBUpdateFailed:
  50. errorAlert = @"数据库更新失败";
  51. break;
  52. case kJMSGErrorSDKDBSelectFailed:
  53. errorAlert = @"数据库查询失败";
  54. break;
  55. case kJMSGErrorSDKDBInsertFailed:
  56. errorAlert = @"数据库插入失败";
  57. break;
  58. case kJMSGErrorSDKParamAppkeyInvalid:
  59. errorAlert = @"appkey不合法";
  60. break;
  61. // case kJMSGErrorPartyQiniuUnknown:
  62. // errorAlert = @"七牛出错";
  63. // break;
  64. case kJMSGErrorSDKParamUsernameInvalid:
  65. errorAlert = @"用户名不合法";
  66. break;
  67. case kJMSGErrorSDKParamPasswordInvalid:
  68. errorAlert = @"用户密码不合法";
  69. break;
  70. // case kJMSGErrorSDKParamAvatarNil:
  71. // errorAlert = @"用户头像属性为空";
  72. // break;
  73. case kJMSGErrorSDKUserNotLogin:
  74. errorAlert = @"用户没有登录";
  75. break;
  76. case kJMSGErrorSDKNotMediaMessage:
  77. errorAlert = @"这不是一条媒体消息";
  78. break;
  79. case kJMSGErrorSDKMediaResourceMissing:
  80. errorAlert = @"下载媒体资源路径或者数据意外丢失";
  81. break;
  82. case kJMSGErrorSDKMediaCrcCodeIllegal:
  83. errorAlert = @"媒体CRC码无效";
  84. break;
  85. case kJMSGErrorSDKMediaCrcVerifyFailed:
  86. errorAlert = @"媒体CRC校验失败";
  87. break;
  88. case kJMSGErrorSDKMediaUploadEmptyFile:
  89. errorAlert = @"上传媒体文件时, 发现文件不存在";
  90. break;
  91. case kJMSGErrorSDKParamContentInvalid:
  92. errorAlert = @"无效的消息内容";
  93. break;
  94. case kJMSGErrorSDKParamMessageNil:
  95. errorAlert = @"空消息";
  96. break;
  97. case kJMSGErrorSDKMessageNotPrepared:
  98. errorAlert = @"消息不符合发送的基本条件检查";
  99. break;
  100. case kJMSGErrorSDKParamConversationTypeUnknown:
  101. errorAlert = @"未知的会话类型";
  102. break;
  103. case kJMSGErrorSDKParamConversationUsernameInvalid:
  104. errorAlert = @"会话 username 无效";
  105. break;
  106. case kJMSGErrorSDKParamConversationGroupIdInvalid:
  107. errorAlert = @"会话 groupId 无效";
  108. break;
  109. case kJMSGErrorSDKParamGroupGroupIdInvalid:
  110. errorAlert = @"groupId 无效";
  111. break;
  112. case kJMSGErrorSDKParamGroupGroupInfoInvalid:
  113. errorAlert = @"group 相关字段无效";
  114. break;
  115. case kJMSGErrorSDKMessageNotInGroup:
  116. errorAlert = @"你已不在该群,无法发送消息";
  117. break;
  118. case 810009:
  119. errorAlert = @"超出群上限";
  120. break;
  121. case kJMSGErrorHttpServerInternal:
  122. errorAlert = @"服务器端内部错误";
  123. break;
  124. case kJMSGErrorHttpUserExist:
  125. errorAlert = @"用户已经存在";
  126. break;
  127. case kJMSGErrorHttpUserNotExist:
  128. errorAlert = @"用户不存在";
  129. break;
  130. case kJMSGErrorHttpPrameterInvalid:
  131. errorAlert = @"参数无效";
  132. break;
  133. case kJMSGErrorHttpPasswordError:
  134. errorAlert = @"密码错误";
  135. break;
  136. case kJMSGErrorHttpUidInvalid:
  137. errorAlert = @"内部UID 无效";
  138. break;
  139. case kJMSGErrorHttpMissingAuthenInfo:
  140. errorAlert = @"Http 请求没有验证信息";
  141. break;
  142. case kJMSGErrorHttpAuthenticationFailed:
  143. errorAlert = @"Http 请求验证失败";
  144. break;
  145. case kJMSGErrorHttpAppkeyNotExist:
  146. errorAlert = @"Appkey 不存在";
  147. break;
  148. case kJMSGErrorHttpTokenExpired:
  149. errorAlert = @"Http 请求 token 过期";
  150. break;
  151. case kJMSGErrorHttpServerResponseTimeout:
  152. errorAlert = @"服务器端响应超时";
  153. break;
  154. case kJMSGErrorTcpUserNotRegistered:
  155. errorAlert = @"用户名还没有被注册过";
  156. break;
  157. case kJMSGErrorTcpUserPasswordError:
  158. errorAlert = @"密码错误";
  159. break;
  160. default:
  161. errorAlert = nil;
  162. break;
  163. }
  164. return errorAlert;
  165. }
  166. + (NSString *)getFriendlyDateString:(NSTimeInterval)timeInterval {
  167. return [JCHATStringUtils getFriendlyDateString:timeInterval forConversation:NO];
  168. }
  169. /**
  170. 下午11:56 (是今天的)
  171. 会话:同样以上字符 - 下午11:56
  172. 昨天 上午10:22 (昨天的)
  173. 会话:只显示 - 昨天
  174. 星期二 上午08:21 (今天昨天之前的一周显示星期)
  175. 会话:只显示 - 星期二
  176. 2015年1月22日 上午11:58 (一周之前显示具体的日期了)
  177. 会话:显示 - 2015/04/18
  178. */
  179. //设置格式 年yyyy 月 MM 日dd 小时hh(HH) 分钟 mm 秒 ss MMM单月 eee周几 eeee星期几 a上午下午
  180. + (NSString *)getFriendlyDateString:(NSTimeInterval)timeInterval
  181. forConversation:(BOOL)isShort {
  182. NSString *output = nil;
  183. NSDate* theDate = [NSDate dateWithTimeIntervalSince1970:timeInterval/1000];
  184. NSDateFormatter *rk_formatter = [[NSDateFormatter alloc] init];
  185. NSLocale *rk_locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
  186. [rk_formatter setLocale:rk_locale];
  187. [rk_formatter setDateFormat:@"MM-dd HH:mm"];
  188. output = [rk_formatter stringFromDate:theDate];
  189. return output;
  190. /*
  191. //转为现在时间
  192. NSDate* theDate = [NSDate dateWithTimeIntervalSince1970:timeInterval/1000];
  193. NSString *output = nil;
  194. NSTimeInterval theDiff = -theDate.timeIntervalSinceNow;
  195. //上述时间差输出不同信息
  196. if (theDiff < 60) {
  197. output = @"刚刚";
  198. } else if (theDiff < 60 * 60) {
  199. int minute = (int) (theDiff / 60);
  200. output = [NSString stringWithFormat:@"%d分钟前", minute];
  201. } else {
  202. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  203. NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
  204. [formatter setLocale:locale];
  205. BOOL isTodayYesterday = NO;
  206. BOOL isPastLong = NO;
  207. if ([theDate isToday]) {
  208. [formatter setDateFormat:FORMAT_TODAY];
  209. } else if ([theDate isYesterday]) {
  210. [formatter setDateFormat:FORMAT_YESTERDAY];
  211. isTodayYesterday = YES;
  212. } else if ([theDate isThisWeek]) {
  213. if (isShort) {
  214. [formatter setDateFormat:FORMAT_THIS_WEEK_SHORT];
  215. } else {
  216. [formatter setDateFormat:FORMAT_THIS_WEEK];
  217. }
  218. } else {
  219. if (isShort) {
  220. [formatter setDateFormat:FORMAT_PAST_SHORT];
  221. } else {
  222. [formatter setDateFormat:FORMAT_PAST_TIME];
  223. isPastLong = YES;
  224. }
  225. }
  226. if (isTodayYesterday) {
  227. NSString *todayYesterday = [JCHATStringUtils getTodayYesterdayString:theDate];
  228. if (isShort) {
  229. output = todayYesterday;
  230. } else {
  231. output = [formatter stringFromDate:theDate];
  232. output = [NSString stringWithFormat:@"%@ %@", todayYesterday, output];
  233. }
  234. } else {
  235. output = [formatter stringFromDate:theDate];
  236. if (isPastLong) {
  237. NSString *thePastDate = [JCHATStringUtils getPastDateString:theDate];
  238. output = [NSString stringWithFormat:@"%@ %@", thePastDate, output];
  239. }
  240. }
  241. }
  242. return output;
  243. */
  244. }
  245. + (NSString *)getTodayYesterdayString:(NSDate *)theDate {
  246. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  247. NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
  248. [formatter setLocale:locale];
  249. formatter.dateStyle = NSDateFormatterShortStyle;
  250. formatter.timeStyle = NSDateFormatterNoStyle;
  251. formatter.doesRelativeDateFormatting = YES;
  252. return [formatter stringFromDate:theDate];
  253. }
  254. + (NSString *)getPastDateString:(NSDate *)theDate {
  255. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  256. NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
  257. [formatter setLocale:locale];
  258. formatter.dateStyle = NSDateFormatterLongStyle;
  259. formatter.timeStyle = NSDateFormatterNoStyle;
  260. return [formatter stringFromDate:theDate];
  261. }
  262. + (NSString *)dictionary2String:(NSDictionary *)dictionary {
  263. if (![dictionary count]) {
  264. return nil;
  265. }
  266. NSString *tempStr1 = [[dictionary description] stringByReplacingOccurrencesOfString:@"\\u" withString:@"\\U"];
  267. NSString *tempStr2 = [tempStr1 stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
  268. NSString *tempStr3 = [[@"\"" stringByAppendingString:tempStr2] stringByAppendingString:@"\""];
  269. NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding];
  270. NSString *str = [NSPropertyListSerialization propertyListFromData:tempData
  271. mutabilityOption:NSPropertyListImmutable
  272. format:NULL
  273. errorDescription:NULL];
  274. return str;
  275. }
  276. - (NSString *)deviceString {
  277. struct utsname systemInfo;
  278. uname(&systemInfo);
  279. NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
  280. if ([deviceString isEqualToString:@"iPhone1,1"]) return @"iPhone 1G";
  281. if ([deviceString isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
  282. if ([deviceString isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
  283. if ([deviceString isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
  284. if ([deviceString isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
  285. if ([deviceString isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
  286. if ([deviceString isEqualToString:@"iPhone3,2"]) return @"Verizon iPhone 4";
  287. if ([deviceString isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
  288. if ([deviceString isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
  289. if ([deviceString isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G";
  290. if ([deviceString isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G";
  291. if ([deviceString isEqualToString:@"iPad1,1"]) return @"iPad";
  292. if ([deviceString isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)";
  293. if ([deviceString isEqualToString:@"iPad2,2"]) return @"iPad 2 (GSM)";
  294. if ([deviceString isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)";
  295. if ([deviceString isEqualToString:@"i386"]) return @"Simulator";
  296. if ([deviceString isEqualToString:@"x86_64"]) return @"Simulator";
  297. NSLog(@"NOTE: Unknown device type: %@", deviceString);
  298. return deviceString;
  299. }
  300. + (BOOL)isValidatIP:(NSString *)ipAddress {
  301. NSString *urlRegEx =@"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
  302. "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
  303. "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
  304. "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
  305. NSError *error;
  306. NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error];
  307. if (regex != nil) {
  308. NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])];
  309. if (firstMatch) {
  310. NSRange resultRange = [firstMatch rangeAtIndex:0];
  311. NSString *result=[ipAddress substringWithRange:resultRange];
  312. //输出结果
  313. NSLog(@"%@",result);
  314. return YES;
  315. }
  316. }
  317. return NO;
  318. }
  319. + (NSString *)conversationIdWithConversation:(JMSGConversation *)conversation {
  320. NSString *conversationId = nil;
  321. if (conversation.conversationType == kJMSGConversationTypeSingle) {
  322. JMSGUser *user = conversation.target;
  323. conversationId = [NSString stringWithFormat:@"%@_%ld",user.username, kJMSGConversationTypeSingle];
  324. } else {
  325. JMSGGroup *group = conversation.target;
  326. conversationId = [NSString stringWithFormat:@"%@_%ld",group.gid,kJMSGConversationTypeGroup];
  327. }
  328. return conversationId;
  329. }
  330. + (CGSize)stringSizeWithWidthString:(NSString *)string withWidthLimit:(CGFloat)width withFont:(UIFont *)font {
  331. CGSize maxSize = CGSizeMake(width, 2000);
  332. // UIFont *font =[UIFont systemFontOfSize:18];
  333. NSMutableParagraphStyle *paragraphStyle= [[NSMutableParagraphStyle alloc] init];
  334. CGSize realSize = [string boundingRectWithSize:maxSize options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font,NSParagraphStyleAttributeName:paragraphStyle} context:nil].size;
  335. return realSize;
  336. }
  337. @end