NetworkRequestManager.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. //
  2. // NetworkRequestManager.m
  3. // MingMen
  4. //
  5. // Created by 罗云飞 on 2017/3/13.
  6. // Copyright © 2017年 罗云飞. All rights reserved.
  7. //
  8. #import "NetworkRequestManager.h"
  9. #include <netinet/in.h>
  10. #import "AFNetworking.h"
  11. #import "AFNetworkActivityIndicatorManager.h"
  12. #import "NewUtils.h"
  13. #import "NewLoginViewController.h"
  14. @implementation NetworkRequestManager
  15. static BOOL isNetwork;
  16. #pragma mark - 有无网络
  17. +(BOOL) connectedToNetwork
  18. {
  19. return isNetwork;
  20. /* 感觉sockaddr_in 不兼容IPV6 也不会写sockaddr_in6
  21. struct sockaddr_in zeroAddress;
  22. bzero(&zeroAddress, sizeof(zeroAddress));
  23. zeroAddress.sin_len = sizeof(zeroAddress);
  24. zeroAddress.sin_family = AF_INET;
  25. SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
  26. SCNetworkReachabilityFlags flags;
  27. BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
  28. CFRelease(defaultRouteReachability);
  29. if (!didRetrieveFlags)
  30. {
  31. printf("Error. Could not recover network reachability flags\n");
  32. return NO;
  33. }
  34. BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
  35. BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
  36. return (isReachable && !needsConnection) ? YES : NO;
  37. */
  38. }
  39. #pragma mark - 观察网络状态
  40. + (void)observeNetworkStatus
  41. {
  42. AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
  43. [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  44. switch (status)
  45. {
  46. case AFNetworkReachabilityStatusUnknown:
  47. isNetwork = YES;
  48. NSLog(@"未知网络");
  49. break;
  50. case AFNetworkReachabilityStatusNotReachable:
  51. isNetwork = NO;
  52. NSLog(@"无网络");
  53. break;
  54. case AFNetworkReachabilityStatusReachableViaWWAN:
  55. isNetwork = YES;
  56. NSLog(@"正在使用手机流量");
  57. break;
  58. case AFNetworkReachabilityStatusReachableViaWiFi:
  59. isNetwork = YES;
  60. NSLog(@"正在使用手机WIFI");
  61. break;
  62. }
  63. }];
  64. [manager startMonitoring];
  65. }
  66. #pragma mark - GET请求
  67. + (void)requestGetWithInterfacePrefix:(NSString*)_ifPrefix parameters:(id)parameters onSuccess:(ResponseTask)succeed onFailure:(CallbackTask)failed
  68. {
  69. //接入参数由协议参数和业务参数共同组成,业务接口中会介绍每个业务接口的输入/输出参数
  70. //为了确保数据传输过程中的数据真实性和完整性,我们需要对数据进行签名校验。
  71. //HTTP请求中传递的参数中,需要对token、安全码、设备编号进行MD5加密处理,构成待签名数据 appKey
  72. /*
  73. NSString *token = [NewUtils sharedInstance].token;
  74. NSString *securityCode = [NewUtils sharedInstance].securityCode;
  75. NSString *appKey =[NewUtils md5:[NSString stringWithFormat:@"%@%@%@",token,securityCode,deviceNumber]];
  76. [parameters safeSetObject:@"json" forKey:@"format"];
  77. [parameters safeSetObject:VersionNumber forKey:@"v"];
  78. [parameters safeSetObject:[NewUtils get_publicInterface_time] forKey:@"timestamp"];
  79. [parameters safeSetObject:appKey forKey:@"appKey"];
  80. [parameters safeSetObject:securityCode forKey:@"securityCode"];
  81. */
  82. /*
  83. //字符串进行UTF-8编码:输出str字符串的UTF-8格式
  84. [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  85. //解码:把str字符串以UTF-8规则进行解码
  86. [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  87. */
  88. NSString *serverUrl = [NSString stringWithFormat:@"%@%@",SERVER_URL,_ifPrefix];
  89. // if ([UserEntity sharedInstance].token.length>0 && ![[UserEntity sharedInstance].token isKindOfClass:[NSNull class]]) {
  90. // [parameters safeSetObject:[UserEntity sharedInstance].token forKey:@"token"];
  91. // }
  92. //NSLog(@"上传参数: %@",parameters);
  93. AFHTTPSessionManager *manager = [self createAFHTTPSessionManager];
  94. [manager GET:serverUrl parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
  95. //这里面是进度
  96. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  97. if ([NewLogSwitch isEqualToString:@"0"] && [SERVER_URL isEqualToString:@"http://192.168.1.109:8080/"]) {
  98. /*
  99. 这段代码写在AFNetWorking库里 那里面打印不了值 故用NSUserDefaults那边存 这边取
  100. if ([[mutableRequest.URL absoluteString] rangeOfString:@"http://119.23.152.19/mmapp/"].location!=NSNotFound)
  101. {
  102. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  103. [defaults setValue:[mutableRequest.URL absoluteString] forKey:@"NewNetworkRequestLink"];
  104. [defaults synchronize];
  105. }
  106. */
  107. NSLog(@"接口链接: %@",[[NSUserDefaults standardUserDefaults] valueForKey:@"NewNetworkRequestLink"]);
  108. }
  109. if (succeed) {
  110. if (responseObject) {
  111. //本来AF直接返回的就是NSDictionary了,因为之前写的代码直接是解Data,所以为了兼容转成Data然后使用的时候又转成NSDictionary
  112. for (NSDictionary *dic in responseObject[@"error"]) {
  113. NSString *currVersion = [NSString getMyApplicationVersion];
  114. NSString *oldVersion = [NewUtils userDefaultsStringKey:NewAPPVersion];
  115. if (oldVersion.length > 0 && [oldVersion isEqualToString:currVersion]) {
  116. if ([dic[@"field"] isEqualToString:@"403"]) {
  117. [[AppDelegate shareDelegate] forceLogoutLogin];
  118. }
  119. }else{
  120. if ([dic[@"field"] isEqualToString:@"403"]) {
  121. [[AppDelegate shareDelegate] forceLogoutLogin];
  122. }
  123. }
  124. }
  125. // if ([_ifPrefix isEqualToString:JT_userInfo]) {
  126. // //由于APP自动登录慢 只能这么处理~
  127. // [[AppDelegate shareDelegate] forceLogoutLogin];
  128. // }
  129. succeed(responseObject);
  130. }else{
  131. if (failed) {
  132. failed();
  133. }
  134. }
  135. }
  136. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  137. if (failed) {
  138. failed();
  139. }
  140. }];
  141. }
  142. #pragma mark - Post请求
  143. + (void)requestPostWithInterfacePrefix:(NSString*)_ifPrefix parameters:(id)parameters onSuccess:(ResponseTask)succeed onFailure:(CallbackTask)failed
  144. {
  145. NSString *serverUrl = [NSString stringWithFormat:@"%@%@",SERVER_URL,_ifPrefix];
  146. // NSString *serverUrl = [NSString stringWithFormat:@"%@%@",@"http://192.168.0.101:8080/mmapp/",_ifPrefix];
  147. //NSLog(@"上传参数: %@",parameters);
  148. AFHTTPSessionManager *manager = [self createAFHTTPSessionManager];
  149. [manager POST:serverUrl parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
  150. //这里面是进度
  151. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  152. if ([NewLogSwitch isEqualToString:@"1"] && [SERVER_URL isEqualToString:@"http://uat.jishutao.com/"]) {
  153. /*
  154. 这段代码写在AFNetWorking库里 那里面打印不了值 故用NSUserDefaults那边存 这边取
  155. if ([[mutableRequest.URL absoluteString] rangeOfString:@"http://119.23.152.19/mmapp/"].location!=NSNotFound)
  156. {
  157. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  158. [defaults setValue:[mutableRequest.URL absoluteString] forKey:@"NewNetworkRequestLink"];
  159. [defaults synchronize];
  160. }
  161. */
  162. NSLog(@"接口链接: %@",[[NSUserDefaults standardUserDefaults] valueForKey:@"NewNetworkRequestLink"]);
  163. }
  164. if (succeed) {
  165. if (responseObject) {
  166. //本来AF直接返回的就是NSDictionary了,因为之前写的代码直接是解Data,所以为了兼容转成Data然后使用的时候又转成NSDictionary
  167. // NSData *responseData = [NSJSONSerialization dataWithJSONObject:responseObject options:NSJSONWritingPrettyPrinted error:nil];
  168. for (NSDictionary *dic in responseObject[@"error"]) {
  169. NSString *currVersion = [NSString getMyApplicationVersion];
  170. NSString *oldVersion = [NewUtils userDefaultsStringKey:NewAPPVersion];
  171. if (oldVersion.length > 0 && [oldVersion isEqualToString:currVersion]) {
  172. if ([dic[@"field"] isEqualToString:@"403"]) {
  173. [[AppDelegate shareDelegate] forceLogoutLogin];
  174. }
  175. }else{
  176. if ([dic[@"field"] isEqualToString:@"403"]) {
  177. [[AppDelegate shareDelegate] forceLogoutLogin];
  178. }
  179. }
  180. }
  181. succeed(responseObject);
  182. }else{
  183. if (failed) {
  184. failed();
  185. }
  186. }
  187. }
  188. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  189. if (failed) {
  190. failed();
  191. }
  192. }];
  193. }
  194. #pragma mark - 设置AFHTTPSessionManager相关属性
  195. + (AFHTTPSessionManager *)createAFHTTPSessionManager
  196. {
  197. //打开状态栏的等待菊花
  198. [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
  199. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  200. //设置请求参数的类型:HTTP (AFJSONRequestSerializer,AFHTTPRequestSerializer)
  201. manager.requestSerializer = [AFHTTPRequestSerializer serializer];
  202. //设置服务器返回结果的类型:JSON (AFJSONResponseSerializer,AFHTTPResponseSerializer)
  203. manager.responseSerializer = [AFJSONResponseSerializer serializer];
  204. //NSURLRequest添加请求头
  205. [manager.requestSerializer setValue:@"AFT" forHTTPHeaderField:@"User-Agent"];
  206. manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json",
  207. @"text/html",
  208. @"text/json",
  209. @"text/plain",
  210. @"text/javascript",
  211. @"text/xml",
  212. @"image/*"]];
  213. //设置请求的超时时间
  214. [manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
  215. manager.requestSerializer.timeoutInterval = 60.f;
  216. [manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
  217. return manager;
  218. }
  219. #pragma mark - Post请求 Body上传参数
  220. + (void)requestPostWithInterfacePrefix:(NSString*)prefix parameters:(id)parameters bodyParameters:(id)bodyParameters onSuccess:(ResponseTask)succeed onFailure:(CallbackTask)failed
  221. {
  222. //NSLog(@"上传参数: %@",parameters);
  223. NSString *serverUrl = [NSString stringWithFormat:@"%@%@",SERVER_URL,prefix];
  224. AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
  225. NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:serverUrl parameters:parameters error:nil];
  226. [request setValue:@"AFT" forHTTPHeaderField:@"User-Agent"];
  227. [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
  228. //设置请求的超时时间
  229. [request willChangeValueForKey:@"timeoutInterval"];
  230. request.timeoutInterval = 60.f;
  231. [request didChangeValueForKey:@"timeoutInterval"];
  232. NSError *error = nil;
  233. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:bodyParameters options:NSJSONWritingPrettyPrinted error:&error];
  234. NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  235. NSData* bodyData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
  236. [request setHTTPBody:bodyData];
  237. AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer];
  238. responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",
  239. @"text/html",
  240. @"text/json",
  241. @"text/javascript",
  242. @"text/plain",
  243. nil];
  244. manager.responseSerializer = responseSerializer;
  245. manager.responseSerializer = [AFJSONResponseSerializer serializer];//服务器返回JSON数据
  246. [[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
  247. // if ([NewLogSwitch isEqualToString:@"1"] && [SERVER_URL isEqualToString:Log_SERVER_URL]) {
  248. NSLog(@"POST接口链接: %@",[[NSUserDefaults standardUserDefaults] valueForKey:@"NewNetworkRequestLink"]);
  249. // }
  250. if (succeed) {
  251. if (responseObject) {
  252. succeed(responseObject);
  253. // if ([responseObject[@"error"] isEqualToString:@"000"]) {
  254. // [[AppDelegate shareDelegate] forceLogoutLogin];
  255. // }
  256. }else{
  257. if (failed) {
  258. failed();
  259. }
  260. }
  261. }
  262. }] resume];
  263. }
  264. #pragma mark - Post请求 上传图片
  265. + (void)requestPostWithInterfacePrefix:(NSString*)prefix serverFileName:(NSString *)serverFileName parameters:(id)parameters arrayParameters:(id)arrayParameters imagetype:(NSString *)imagetype onSuccess:(ResponseTask)succeed onFailure:(CallbackTask)failed
  266. {
  267. NSString *serverUrl = [NSString stringWithFormat:@"%@%@",SERVER_URL,prefix];
  268. //if ([arrayParameters isEqual:[NSArray class]]) {}
  269. NSArray *array = [NSArray arrayWithArray:arrayParameters];
  270. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  271. //设置请求的超时时间
  272. manager.requestSerializer.timeoutInterval = 60.f;
  273. //设置请求参数的类型:HTTP (AFJSONRequestSerializer,AFHTTPRequestSerializer)
  274. manager.requestSerializer = [AFHTTPRequestSerializer serializer];
  275. //设置服务器返回结果的类型:JSON (AFJSONResponseSerializer,AFHTTPResponseSerializer)
  276. manager.responseSerializer = [AFJSONResponseSerializer serializer];
  277. //NSURLRequest添加请求头
  278. [manager.requestSerializer setValue:@"AFT" forHTTPHeaderField:@"User-Agent"];
  279. //设置ContentType
  280. manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:
  281. @"text/plain",
  282. @"multipart/form-data",
  283. @"application/json",
  284. @"text/html",
  285. @"image/jpeg",
  286. @"image/png",
  287. @"application/octet-stream",
  288. @"text/json", nil];
  289. // 在parameters里存放照片以外的对象
  290. // [parameters safeSetObject:[UserEntity sharedInstance].token forKey:@"token"];//公共参数token
  291. [manager POST:serverUrl parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  292. // formData: 专门用于拼接需要上传的数据,在此位置生成一个要上传的数据体
  293. // 这里的_photoArr是你存放图片的数组
  294. for (int i = 0; i < array.count; i++) {
  295. NSData *imageData = [NSData dataWithData:array[i]];
  296. // 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
  297. // 要解决此问题,
  298. // 可以在上传时使用当前的系统事件作为文件名
  299. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  300. // 设置时间格式
  301. [formatter setDateFormat:@"yyyyMMddHHmmss"];
  302. NSString *dateString = [formatter stringFromDate:[NSDate date]];
  303. //拼接图片名称 当前时间+4位随机数
  304. NSString *fileName = [NSString stringWithFormat:@"%@_%@.%@", dateString,[NewUtils randomCount:4],imagetype];
  305. //该方法的参数
  306. //1. appendPartWithFileData:要上传的照片[二进制流]
  307. //2. name:对应网站上[upload.php中]处理文件的字段(比如upload)
  308. //3. fileName:要保存在服务器上的文件名
  309. //4. mimeType:上传的文件的类型
  310. [formData appendPartWithFileData:imageData name:serverFileName fileName:fileName mimeType:@"image/jpeg"]; //
  311. }
  312. } progress:^(NSProgress * _Nonnull uploadProgress) {
  313. NSLog(@"```上传进度```%f",uploadProgress.fractionCompleted);
  314. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  315. if (succeed) {
  316. if (responseObject) {
  317. succeed(responseObject);
  318. }else{
  319. if (failed) {
  320. failed();
  321. }
  322. }
  323. }
  324. NSLog(@"```上传成功```");
  325. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  326. if (failed) {
  327. failed();
  328. }
  329. NSLog(@"```上传失败```");
  330. }];
  331. }
  332. @end