NetworkRequestManager.m 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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. @implementation NetworkRequestManager
  13. static BOOL isNetwork;
  14. #pragma mark - 有无网络
  15. +(BOOL) connectedToNetwork
  16. {
  17. return isNetwork;
  18. /* 感觉sockaddr_in 不兼容IPV6 也不会写sockaddr_in6
  19. struct sockaddr_in zeroAddress;
  20. bzero(&zeroAddress, sizeof(zeroAddress));
  21. zeroAddress.sin_len = sizeof(zeroAddress);
  22. zeroAddress.sin_family = AF_INET;
  23. SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
  24. SCNetworkReachabilityFlags flags;
  25. BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
  26. CFRelease(defaultRouteReachability);
  27. if (!didRetrieveFlags)
  28. {
  29. printf("Error. Could not recover network reachability flags\n");
  30. return NO;
  31. }
  32. BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
  33. BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
  34. return (isReachable && !needsConnection) ? YES : NO;
  35. */
  36. }
  37. #pragma mark - 观察网络状态
  38. + (void)observeNetworkStatus
  39. {
  40. AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
  41. [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  42. switch (status)
  43. {
  44. case AFNetworkReachabilityStatusUnknown:
  45. isNetwork = YES;
  46. NSLog(@"未知网络");
  47. break;
  48. case AFNetworkReachabilityStatusNotReachable:
  49. isNetwork = NO;
  50. NSLog(@"无网络");
  51. break;
  52. case AFNetworkReachabilityStatusReachableViaWWAN:
  53. isNetwork = YES;
  54. NSLog(@"正在使用手机流量");
  55. break;
  56. case AFNetworkReachabilityStatusReachableViaWiFi:
  57. isNetwork = YES;
  58. NSLog(@"正在使用手机WIFI");
  59. break;
  60. }
  61. }];
  62. [manager startMonitoring];
  63. }
  64. #pragma mark - GET请求
  65. + (void)requestGetWithInterfacePrefix:(NSString*)_ifPrefix parameters:(id)parameters onSuccess:(ResponseTask)succeed onFailure:(CallbackTask)failed
  66. {
  67. //接入参数由协议参数和业务参数共同组成,业务接口中会介绍每个业务接口的输入/输出参数
  68. //为了确保数据传输过程中的数据真实性和完整性,我们需要对数据进行签名校验。
  69. //HTTP请求中传递的参数中,需要对token、安全码、设备编号进行MD5加密处理,构成待签名数据 appKey
  70. /*
  71. NSString *token = [NewUtils sharedInstance].token;
  72. NSString *securityCode = [NewUtils sharedInstance].securityCode;
  73. NSString *appKey =[NewUtils md5:[NSString stringWithFormat:@"%@%@%@",token,securityCode,deviceNumber]];
  74. [parameters safeSetObject:@"json" forKey:@"format"];
  75. [parameters safeSetObject:VersionNumber forKey:@"v"];
  76. [parameters safeSetObject:[NewUtils get_publicInterface_time] forKey:@"timestamp"];
  77. [parameters safeSetObject:appKey forKey:@"appKey"];
  78. [parameters safeSetObject:securityCode forKey:@"securityCode"];
  79. */
  80. /*
  81. //字符串进行UTF-8编码:输出str字符串的UTF-8格式
  82. [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  83. //解码:把str字符串以UTF-8规则进行解码
  84. [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  85. */
  86. NSString *serverUrl = [NSString stringWithFormat:@"%@%@",SERVER_URL,_ifPrefix];
  87. if ([UserEntity sharedInstance].token.length>0 && ![[UserEntity sharedInstance].token isKindOfClass:[NSNull class]]) {
  88. [parameters safeSetObject:[UserEntity sharedInstance].token forKey:@"token"];
  89. }
  90. //NSLog(@"上传参数: %@",parameters);
  91. AFHTTPSessionManager *manager = [self createAFHTTPSessionManager];
  92. [manager GET:serverUrl parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
  93. //这里面是进度
  94. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  95. if ([NewLogSwitch isEqualToString:@"0"] && [SERVER_URL isEqualToString:@"http://119.23.152.19/mmapp/"]) {
  96. /*
  97. 这段代码写在AFNetWorking库里 那里面打印不了值 故用NSUserDefaults那边存 这边取
  98. if ([[mutableRequest.URL absoluteString] rangeOfString:@"http://119.23.152.19/mmapp/"].location!=NSNotFound)
  99. {
  100. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  101. [defaults setValue:[mutableRequest.URL absoluteString] forKey:@"NewNetworkRequestLink"];
  102. [defaults synchronize];
  103. }
  104. */
  105. NSLog(@"接口链接: %@",[[NSUserDefaults standardUserDefaults] valueForKey:@"NewNetworkRequestLink"]);
  106. }
  107. if (succeed) {
  108. if (responseObject) {
  109. //本来AF直接返回的就是NSDictionary了,因为之前写的代码直接是解Data,所以为了兼容转成Data然后使用的时候又转成NSDictionary
  110. NSData *responseData = [NSJSONSerialization dataWithJSONObject:responseObject options:NSJSONWritingPrettyPrinted error:nil];
  111. succeed(responseData);
  112. }else{
  113. if (failed) {
  114. failed();
  115. }
  116. }
  117. }
  118. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  119. if (failed) {
  120. failed();
  121. }
  122. }];
  123. }
  124. #pragma mark - Post请求
  125. + (void)requestPostWithInterfacePrefix:(NSString*)_ifPrefix parameters:(id)parameters onSuccess:(ResponseTask)succeed onFailure:(CallbackTask)failed
  126. {
  127. NSString *serverUrl = [NSString stringWithFormat:@"%@%@",SERVER_URL,_ifPrefix];
  128. // NSString *serverUrl = [NSString stringWithFormat:@"%@%@",@"http://192.168.0.101:8080/mmapp/",_ifPrefix];
  129. //NSLog(@"上传参数: %@",parameters);
  130. AFHTTPSessionManager *manager = [self createAFHTTPSessionManager];
  131. [manager POST:serverUrl parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
  132. //这里面是进度
  133. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  134. if ([NewLogSwitch isEqualToString:@"0"] && [SERVER_URL isEqualToString:@"http://119.23.152.19/mmapp/"]) {
  135. /*
  136. 这段代码写在AFNetWorking库里 那里面打印不了值 故用NSUserDefaults那边存 这边取
  137. if ([[mutableRequest.URL absoluteString] rangeOfString:@"http://119.23.152.19/mmapp/"].location!=NSNotFound)
  138. {
  139. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  140. [defaults setValue:[mutableRequest.URL absoluteString] forKey:@"NewNetworkRequestLink"];
  141. [defaults synchronize];
  142. }
  143. */
  144. NSLog(@"接口链接: %@",[[NSUserDefaults standardUserDefaults] valueForKey:@"NewNetworkRequestLink"]);
  145. }
  146. if (succeed) {
  147. if (responseObject) {
  148. //本来AF直接返回的就是NSDictionary了,因为之前写的代码直接是解Data,所以为了兼容转成Data然后使用的时候又转成NSDictionary
  149. NSData *responseData = [NSJSONSerialization dataWithJSONObject:responseObject options:NSJSONWritingPrettyPrinted error:nil];
  150. succeed(responseData);
  151. }else{
  152. if (failed) {
  153. failed();
  154. }
  155. }
  156. }
  157. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  158. if (failed) {
  159. failed();
  160. }
  161. }];
  162. }
  163. #pragma mark - 设置AFHTTPSessionManager相关属性
  164. + (AFHTTPSessionManager *)createAFHTTPSessionManager
  165. {
  166. //打开状态栏的等待菊花
  167. [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
  168. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  169. //设置请求的超时时间
  170. manager.requestSerializer.timeoutInterval = 60.f;
  171. //设置请求参数的类型:HTTP (AFJSONRequestSerializer,AFHTTPRequestSerializer)
  172. manager.requestSerializer = [AFHTTPRequestSerializer serializer];
  173. //设置服务器返回结果的类型:JSON (AFJSONResponseSerializer,AFHTTPResponseSerializer)
  174. manager.responseSerializer = [AFJSONResponseSerializer serializer];
  175. //NSURLRequest添加请求头
  176. //[manager.requestSerializer setValue:@"" forHTTPHeaderField:@"token"];
  177. manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json",
  178. @"text/html",
  179. @"text/json",
  180. @"text/plain",
  181. @"text/javascript",
  182. @"text/xml",
  183. @"image/*"]];
  184. return manager;
  185. }
  186. @end