JXHttpRequet.m 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. //
  2. // JXHttpRequet.m
  3. // share
  4. //
  5. // Created by 1 on 2019/3/21.
  6. // Copyright © 2019年 Reese. All rights reserved.
  7. //
  8. #import "JXHttpRequet.h"
  9. #import "JXCustomShareVC.h"
  10. @interface JXHttpRequet ()<JXNetworkDelegate>
  11. @property (nonatomic, strong) NSString *urlPath;
  12. @end
  13. @implementation JXHttpRequet
  14. static JXHttpRequet *_httpRequet = nil;
  15. + (instancetype)shareInstance {
  16. static dispatch_once_t onceToken;
  17. dispatch_once(&onceToken, ^{
  18. _httpRequet = [[JXHttpRequet alloc] init];
  19. });
  20. return _httpRequet;
  21. }
  22. - (instancetype)init {
  23. if (self = [super init]) {
  24. self.access_token = [share_defaults objectForKey:kMY_ShareExtensionToken];
  25. self.userId = [share_defaults objectForKey:kMY_ShareExtensionUserId];
  26. self.apiUrl = [share_defaults objectForKey:kApiUrl];
  27. self.uploadUrl = [share_defaults objectForKey:kUploadUrl];
  28. self.timeDifference = [[share_defaults objectForKey:kShare_timeDifference] doubleValue];
  29. self.httpKey = [share_defaults objectForKey:kMY_ShareExtensionHttpKey];
  30. }
  31. return self;
  32. }
  33. //上传文件到服务器(传路径)
  34. -(void)uploadFile:(NSString*)file validTime:(NSString *)validTime messageId:(NSString *)messageId toView:(id)toView{
  35. if(!file)
  36. return;
  37. if(![[NSFileManager defaultManager] fileExistsAtPath:file])
  38. return;
  39. JXNetwork* p = [self addTask:act_UploadFile param:nil toView:toView];
  40. [p setPostValue:self.userId forKey:@"userId"];
  41. if (!validTime) {
  42. validTime = @"-1";
  43. }
  44. [p setPostValue:validTime forKey:@"validTime"];
  45. [p setData:[NSData dataWithContentsOfFile:file] forKey:[file lastPathComponent] messageId:nil];
  46. p.userData = [file lastPathComponent];
  47. p.messageId = messageId;
  48. [p go];
  49. }
  50. // 发送消息
  51. - (void)sendMsgToUserId:(NSString *)jid chatType:(int)chatType type:(int)type content:(NSString *)content fileName:(NSString *)fileName toView:(id)toView{
  52. JXNetwork* p = [self addTask:act_SendMsg param:nil toView:toView];
  53. [p setPostValue:jid forKey:@"jid"];
  54. [p setPostValue:[NSNumber numberWithInt:chatType] forKey:@"chatType"];
  55. [p setPostValue:[NSNumber numberWithInt:type] forKey:@"type"];
  56. [p setPostValue:content forKey:@"content"];
  57. [p setPostValue:fileName forKey:@"fileName"];
  58. [p setPostValue:self.access_token forKey:@"access_token"];
  59. [p go];
  60. }
  61. // 发送生活圈
  62. -(void)addMessage:(NSString*)text type:(int)type data:(NSDictionary*)dict flag:(int)flag toView:(id)toView{
  63. NSMutableArray* array;
  64. NSString * jsonFiles=nil;
  65. // NSMutableArray* a=[[NSMutableArray alloc]init];
  66. SBJsonWriter * OderJsonwriter = [SBJsonWriter new];
  67. array = [dict objectForKey:@"images"];
  68. NSString * jsonImages = nil;
  69. if([array count]>0){
  70. [self doCheckUploadResult:array];
  71. jsonImages = [OderJsonwriter stringWithObject:array];
  72. jsonFiles = jsonImages;
  73. }
  74. array = [dict objectForKey:@"videos"];
  75. NSString * jsonVideos=nil;
  76. if([array count]>0){
  77. [self doCheckUploadResult:array];
  78. jsonVideos = [OderJsonwriter stringWithObject:array];
  79. jsonFiles = jsonVideos;
  80. // for(int i =0;i<[array count];i++)
  81. // [a addObject:[[array objectAtIndex:i] objectForKey:@"oUrl"]];
  82. // jsonVideos = [OderJsonwriter stringWithObject:a];
  83. }
  84. array = [dict objectForKey:@"audios"];
  85. NSString * jsonAudios=nil;
  86. if([array count]>0){
  87. [self doCheckUploadResult:array];
  88. jsonAudios = [OderJsonwriter stringWithObject:array];
  89. jsonFiles = jsonAudios;
  90. // for(int i =0;i<[array count];i++)
  91. // [a addObject:[[array objectAtIndex:i] objectForKey:@"oUrl"]];
  92. // jsonAudios = [OderJsonwriter stringWithObject:a];
  93. }
  94. array = [dict objectForKey:@"files"];
  95. if([array count]>0){
  96. [self doCheckUploadResult:array];
  97. jsonFiles = [OderJsonwriter stringWithObject:array];
  98. // for(int i =0;i<[array count];i++)
  99. // [a addObject:[[array objectAtIndex:i] objectForKey:@"oUrl"]];
  100. // jsonAudios = [OderJsonwriter stringWithObject:a];
  101. }
  102. array = nil;
  103. JXNetwork* p = [self addTask:act_MsgAdd param:nil toView:toView];
  104. [p setPostValue:[NSNumber numberWithInt:type] forKey:@"type"];
  105. [p setPostValue:[NSNumber numberWithInt:flag] forKey:@"flag"];
  106. // [p setPostValue:[NSNumber numberWithInt:visible] forKey:@"visible"];
  107. [p setPostValue:[NSNumber numberWithInt:1] forKey:@"cityId"];
  108. [p setPostValue:self.access_token forKey:@"access_token"];
  109. [p setPostValue:text forKey:@"text"];
  110. if (type == 5) {
  111. [p setPostValue:jsonFiles forKey:@"files"];
  112. }else if (type == 6) {
  113. [p setPostValue:[dict objectForKey:@"sdkUrl"] forKey:@"sdkUrl"];
  114. [p setPostValue:[dict objectForKey:@"sdkIcon"] forKey:@"sdkIcon"];
  115. [p setPostValue:[dict objectForKey:@"sdkTitle"] forKey:@"sdkTitle"];
  116. }
  117. else {
  118. [p setPostValue:jsonImages forKey:@"images"];
  119. [p setPostValue:jsonAudios forKey:@"audios"];
  120. [p setPostValue:jsonVideos forKey:@"videos"];
  121. }
  122. // [p setPostValue:myself.model forKey:@"model"];
  123. // [p setPostValue:myself.osVersion forKey:@"osVersion"];
  124. // [p setPostValue:myself.serialNumber forKey:@"serialNumber"];
  125. // [p setPostValue:lable forKey:@"lable"];
  126. //
  127. // if (location.length > 0) {
  128. // [p setPostValue:[NSNumber numberWithDouble:coor.latitude] forKey:@"latitude"];
  129. // [p setPostValue:[NSNumber numberWithDouble:coor.longitude] forKey:@"longitude"];
  130. // [p setPostValue:location forKey:@"location"];
  131. // }
  132. // if (lookArray.count >0 && (visible == 3 || visible == 4)) {
  133. // NSString * lookStr = [lookArray componentsJoinedByString:@","];
  134. // NSString * arrayTitle = nil;
  135. // switch (visible) {
  136. // case 3:
  137. // arrayTitle = @"userLook";
  138. // break;
  139. // case 4:
  140. // arrayTitle = @"userNotLook";
  141. // break;
  142. // default:
  143. // arrayTitle = @"";
  144. // break;
  145. // }
  146. // [p setPostValue:lookStr forKey:arrayTitle];
  147. // }
  148. // if (remindArray.count > 0) {
  149. // [p setPostValue:[remindArray componentsJoinedByString:@","] forKey:@"userRemindLook"];
  150. // }
  151. [p go];
  152. }
  153. -(void)doCheckUploadResult:(NSMutableArray*)a{
  154. NSMutableDictionary* p;
  155. for(NSInteger i=[a count]-1;i>=0;i--){
  156. p = [a objectAtIndex:i];
  157. if([[p objectForKey:@"status"]intValue]!=1){
  158. [a removeObjectAtIndex:i];
  159. continue;
  160. }
  161. [p removeObjectForKey:@"status"];
  162. }
  163. }
  164. -(JXNetwork*)addTask:(NSString*)action param:(id)param toView:(id)delegate{
  165. if([action length]<=0)
  166. return nil;
  167. if(param==nil)
  168. param = @"";
  169. NSString* url=nil;
  170. NSString* s=@"";
  171. JXNetwork *task = [[JXNetwork alloc] init];
  172. if([action rangeOfString:@"http://"].location == NSNotFound){
  173. if([action isEqualToString:act_UploadFile]){
  174. s = self.uploadUrl;
  175. }else {
  176. NSRange range = [self.apiUrl rangeOfString:@"config"];
  177. if (range.location != NSNotFound) {
  178. s = [self.apiUrl substringToIndex:range.location];
  179. }else {
  180. s = self.apiUrl;
  181. }
  182. }
  183. }
  184. url = [NSString stringWithFormat:@"%@%@%@",s,action,param];
  185. task.url = url;
  186. task.param = param;
  187. task.delegate = self;
  188. task.action = action;
  189. task.toView = delegate;
  190. // [url1 release];
  191. if([task.toView respondsToSelector:@selector(didServerNetworkStart:)])
  192. [task.toView didServerNetworkStart:task];
  193. if([task isImage] || [task isAudio] || [task isVideo])
  194. [task go];
  195. // [_arrayConnections addObject:task];
  196. // [task release];
  197. return task;
  198. }
  199. - (void)requestSuccess:(JXNetwork *)task {
  200. @autoreleasepool {
  201. NSString* string = task.responseData;
  202. // NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  203. NSString* error=nil;
  204. SBJsonParser * resultParser = [[SBJsonParser alloc] init] ;
  205. NSDictionary *resultObject = [resultParser objectWithString:string];
  206. // id resultObject = [resultParser objectWithData:task.responseData];
  207. // [resultParser release];
  208. if( [resultObject isKindOfClass:[NSDictionary class]] ){
  209. int resultCode = [[resultObject objectForKey:@"resultCode"] intValue];
  210. if(resultCode != 1)
  211. {
  212. error = [resultObject objectForKey:@"resultMsg"];
  213. // if([error length]<=0)
  214. // error = @"出错拉";
  215. }
  216. }else{
  217. error = @"不能识别返回值";
  218. if([string length]>=6){
  219. if([[string substringToIndex:6] isEqualToString:@"<html>"])
  220. error = @"服务器好像有点问题";
  221. }
  222. }
  223. if(error){
  224. [self doError:task dict:resultObject resultMsg:string errorMsg:error];
  225. }else{
  226. // NSLog(@"%@成功:%@",task.action,string);
  227. resultObject = [resultObject objectForKey:@"data"];
  228. NSDictionary * dict = nil;
  229. NSArray* array = nil;
  230. if( [resultObject isKindOfClass:[NSDictionary class]] )
  231. dict = resultObject;
  232. if( [resultObject isKindOfClass:[NSArray class]] )
  233. array = resultObject;
  234. if( [task.toView respondsToSelector:@selector(didServerNetworkResultSucces:dict:array:)] )
  235. [task.toView didServerNetworkResultSucces:task dict:dict array:array];
  236. dict = nil;
  237. array = nil;
  238. }
  239. resultObject = nil;
  240. // [pool release];
  241. // [_arrayConnections removeObject:task];
  242. }
  243. }
  244. - (void)requestError:(JXNetwork *)task {
  245. if([task.toView respondsToSelector:@selector(didServerNetworkError:error:)] ){
  246. [task.toView didServerNetworkError:task error:task.error];
  247. }
  248. }
  249. -(void) doError:(JXNetwork*)task dict:(NSDictionary*)dict resultMsg:(NSString*)string errorMsg:(NSString*)errorMsg{
  250. if ([task.toView respondsToSelector:@selector(didServerNetworkResultFailed:dict:)])
  251. [task.toView didServerNetworkResultFailed:task dict:dict];
  252. }
  253. - (NSString *)getDataUrlWithImage:(UIImage *)image {
  254. NSData *data = UIImagePNGRepresentation(image);
  255. NSString *fileName = [self generateUUID];
  256. NSFileManager *manager = [NSFileManager defaultManager];
  257. NSURL *groupURL = [manager containerURLForSecurityApplicationGroupIdentifier:APP_GROUP_ID];
  258. NSString *filePath = [NSString stringWithFormat:@"%@.jpg",fileName];
  259. NSURL *fileURL = [groupURL URLByAppendingPathComponent:filePath];
  260. NSString *path = [fileURL.absoluteString substringFromIndex:7];
  261. [data writeToFile:path atomically:YES];
  262. return path;
  263. }
  264. - (NSString *)getDataUrlWithVideo:(NSData *)video {
  265. NSString *fileName = [self generateUUID];
  266. NSFileManager *manager = [NSFileManager defaultManager];
  267. NSURL *groupURL = [manager containerURLForSecurityApplicationGroupIdentifier:APP_GROUP_ID];
  268. NSString *filePath = [NSString stringWithFormat:@"%@.mp4",fileName];
  269. NSURL *fileURL = [groupURL URLByAppendingPathComponent:filePath];
  270. NSString *path = [fileURL.absoluteString substringFromIndex:7];
  271. [video writeToFile:path atomically:YES];
  272. return path;
  273. }
  274. - (NSString *)generateUUID
  275. {
  276. return [NSUUID UUID].UUIDString;
  277. }
  278. -(UIImage*)getFirstImageFromVideo:(NSString*)video {
  279. NSFileManager *manager = [NSFileManager defaultManager];
  280. NSURL *groupURL = [manager containerURLForSecurityApplicationGroupIdentifier:APP_GROUP_ID];
  281. NSString *path = [groupURL.absoluteString substringFromIndex:7];
  282. NSString *filePath = [NSString stringWithFormat:@"%@%@.jpg",path,[[video lastPathComponent] stringByDeletingPathExtension]];
  283. if([[NSFileManager defaultManager] fileExistsAtPath:filePath])
  284. return [UIImage imageWithContentsOfFile:filePath];
  285. NSURL* url;
  286. if( [video rangeOfString:@"http://"].location == NSNotFound && [video rangeOfString:@"https://"].location == NSNotFound)
  287. url = [NSURL fileURLWithPath:video];
  288. else
  289. url = [NSURL URLWithString:video];
  290. //获取视频的首帧作为缩略图
  291. AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
  292. NSParameterAssert(asset);
  293. AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
  294. generator.appliesPreferredTrackTransform = YES;
  295. generator.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
  296. NSError *error = nil;
  297. CGImageRef cgImage = [generator copyCGImageAtTime:CMTimeMakeWithSeconds(0.8, 600) actualTime:nil error:&error];
  298. if (!cgImage) {
  299. NSLog(@"获取视频第一帧图片失败:%@",error);
  300. return nil;
  301. }
  302. //保存图片到本地
  303. NSData * imageData = UIImageJPEGRepresentation([UIImage imageWithCGImage:cgImage], 1);
  304. NSError *imageerror =nil;
  305. BOOL isSuccess = [imageData writeToFile:filePath atomically:YES];
  306. if (!isSuccess) {
  307. NSLog(@"获取视频第一帧图片写入失败,%@",imageerror);
  308. }
  309. return [UIImage imageWithCGImage:cgImage];
  310. }
  311. // 获取视频时长
  312. - (CGFloat)getVideoLength:(NSURL *)url{
  313. AVURLAsset *avUrl = [AVURLAsset assetWithURL:url];
  314. CMTime time = [avUrl duration];
  315. int second = ceil(time.value/time.timescale);
  316. return second;
  317. }
  318. //压缩
  319. - (NSString *)compressionVideoWithUlr:(NSURL *)url{
  320. // NSLog(@"压缩前大小 %f MB",[self fileSize:url]);
  321. NSFileManager *manager = [NSFileManager defaultManager];
  322. NSURL *groupURL = [manager containerURLForSecurityApplicationGroupIdentifier:APP_GROUP_ID];
  323. NSString *fileName = [self generateUUID];
  324. NSString* path1 = [[groupURL.absoluteString substringFromIndex:7] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp4",fileName]];
  325. NSString *bakPath= path1; //新路径不能存在文件 如果存在是不能压缩成功的
  326. AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil];
  327. AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPreset1280x720];
  328. exportSession.outputURL = [NSURL fileURLWithPath:bakPath];
  329. exportSession.outputFileType = AVFileTypeMPEG4;
  330. exportSession.shouldOptimizeForNetworkUse= YES;
  331. [exportSession exportAsynchronouslyWithCompletionHandler:^(void)
  332. {
  333. // BOOL goToUploadFile=NO;
  334. switch (exportSession.status) {
  335. case AVAssetExportSessionStatusCancelled:
  336. NSLog(@"AVAssetExportSessionStatusCancelled");
  337. break;
  338. case AVAssetExportSessionStatusUnknown:
  339. NSLog(@"AVAssetExportSessionStatusUnknown");
  340. break;
  341. case AVAssetExportSessionStatusWaiting:
  342. NSLog(@"AVAssetExportSessionStatusWaiting");
  343. break;
  344. case AVAssetExportSessionStatusExporting:
  345. NSLog(@"AVAssetExportSessionStatusExporting");
  346. break;
  347. case AVAssetExportSessionStatusCompleted:{
  348. //压缩成功
  349. self.urlPath = bakPath;
  350. }
  351. break;
  352. case AVAssetExportSessionStatusFailed:
  353. {
  354. NSError *error=exportSession.error;
  355. if (error) {
  356. }
  357. }
  358. break;
  359. default:
  360. break;
  361. }
  362. }];
  363. if (self.urlPath.length > 0) {
  364. return self.urlPath;
  365. }
  366. return nil;
  367. }
  368. //计算压缩大小
  369. - (CGFloat)fileSize:(NSURL *)path
  370. {
  371. return [[NSData dataWithContentsOfURL:path] length]/1024.00 /1024.00;
  372. }
  373. @end