286 lines
12 KiB
C
286 lines
12 KiB
C
|
|
//
|
|||
|
|
// MLNetWorkHelper.h
|
|||
|
|
// HuiBao
|
|||
|
|
//
|
|||
|
|
// Created by 玛丽 on 2017/11/22.
|
|||
|
|
// Copyright © 2017年 玛丽. All rights reserved.
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
#import <Foundation/Foundation.h>
|
|||
|
|
#import <UIKit/UIKit.h>
|
|||
|
|
#import "MLNetworkCache.h"
|
|||
|
|
|
|||
|
|
typedef NS_ENUM(NSUInteger, MLNetworkStatusType) {
|
|||
|
|
/// 未知网络
|
|||
|
|
MLNetworkStatusUnknown,
|
|||
|
|
/// 无网络
|
|||
|
|
MLNetworkStatusNotReachable,
|
|||
|
|
/// 手机网络
|
|||
|
|
MLNetworkStatusReachableViaWWAN,
|
|||
|
|
/// WIFI网络
|
|||
|
|
MLNetworkStatusReachableViaWiFi
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
typedef NS_ENUM(NSUInteger, MLRequestSerializer) {
|
|||
|
|
/// 设置请求数据为JSON格式
|
|||
|
|
MLRequestSerializerJSON,
|
|||
|
|
/// 设置请求数据为二进制格式
|
|||
|
|
MLRequestSerializerHTTP,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
typedef NS_ENUM(NSUInteger, MLResponseSerializer) {
|
|||
|
|
/// 设置响应数据为JSON格式
|
|||
|
|
MLResponseSerializerJSON,
|
|||
|
|
/// 设置响应数据为二进制格式
|
|||
|
|
MLResponseSerializerHTTP,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/// 请求成功的Block
|
|||
|
|
typedef void(^MLHttpRequestSuccess)(id responseObject);
|
|||
|
|
/// 请求失败的Block
|
|||
|
|
typedef void(^MLHttpRequestFailed)(NSError *error);
|
|||
|
|
/// 缓存的Block
|
|||
|
|
typedef void(^MLHttpRequestCache)(id responseCache);
|
|||
|
|
/// 上传或者下载的进度, Progress.completedUnitCount:当前大小 - Progress.totalUnitCount:总大小
|
|||
|
|
typedef void (^MLHttpProgress)(NSProgress *progress);
|
|||
|
|
/// 网络状态的Block
|
|||
|
|
typedef void(^MLNetworkStatus)(MLNetworkStatusType status);
|
|||
|
|
|
|||
|
|
|
|||
|
|
@class AFHTTPSessionManager;
|
|||
|
|
@interface MLNetWorkHelper : NSObject
|
|||
|
|
|
|||
|
|
/// 有网YES, 无网:NO
|
|||
|
|
+ (BOOL)isNetwork;
|
|||
|
|
/// 手机网络:YES, 反之:NO
|
|||
|
|
+ (BOOL)isWWANNetwork;
|
|||
|
|
/// WiFi网络:YES, 反之:NO
|
|||
|
|
+ (BOOL)isWiFiNetwork;
|
|||
|
|
/// 取消所有HTTP请求
|
|||
|
|
+ (void)cancelAllRequest;
|
|||
|
|
/// 实时获取网络状态,通过Block回调实时获取(此方法可多次调用)
|
|||
|
|
+ (void)networkStatusWithBlock:(MLNetworkStatus)networkStatus;
|
|||
|
|
/// 取消指定URL的HTTP请求
|
|||
|
|
+ (void)cancelRequestWithURL:(NSString *)URL;
|
|||
|
|
/// 开启日志打印 (Debug级别)
|
|||
|
|
+ (void)openLog;
|
|||
|
|
/// 关闭日志打印,默认关闭
|
|||
|
|
+ (void)closeLog;
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GET请求,无缓存
|
|||
|
|
*
|
|||
|
|
* @param URL 请求地址
|
|||
|
|
* @param parameters 请求参数
|
|||
|
|
* @param success 请求成功的回调
|
|||
|
|
* @param failure 请求失败的回调
|
|||
|
|
*
|
|||
|
|
* @return 返回的对象可取消请求,调用cancel方法
|
|||
|
|
*/
|
|||
|
|
+ (__kindof NSURLSessionTask *)GET:(NSString *)URL
|
|||
|
|
parameters:(id)parameters
|
|||
|
|
success:(MLHttpRequestSuccess)success
|
|||
|
|
failure:(MLHttpRequestFailed)failure;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GET请求,自动缓存
|
|||
|
|
*
|
|||
|
|
* @param URL 请求地址
|
|||
|
|
* @param parameters 请求参数
|
|||
|
|
* @param responseCache 缓存数据的回调
|
|||
|
|
* @param success 请求成功的回调
|
|||
|
|
* @param failure 请求失败的回调
|
|||
|
|
*
|
|||
|
|
* @return 返回的对象可取消请求,调用cancel方法
|
|||
|
|
*/
|
|||
|
|
+ (__kindof NSURLSessionTask *)GET:(NSString *)URL
|
|||
|
|
parameters:(id)parameters
|
|||
|
|
responseCache:(MLHttpRequestCache)responseCache
|
|||
|
|
success:(MLHttpRequestSuccess)success
|
|||
|
|
failure:(MLHttpRequestFailed)failure;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* POST请求,无缓存
|
|||
|
|
* @return 返回的对象可取消请求,调用cancel方法
|
|||
|
|
*/
|
|||
|
|
+ (__kindof NSURLSessionTask *)POST:(NSString *)URL
|
|||
|
|
parameters:(id)parameters
|
|||
|
|
success:(MLHttpRequestSuccess)success
|
|||
|
|
failure:(MLHttpRequestFailed)failure;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* POST请求,自动缓存
|
|||
|
|
* @return 返回的对象可取消请求,调用cancel方法
|
|||
|
|
*/
|
|||
|
|
+ (__kindof NSURLSessionTask *)POST:(NSString *)URL
|
|||
|
|
parameters:(id)parameters
|
|||
|
|
responseCache:(MLHttpRequestCache)responseCache
|
|||
|
|
success:(MLHttpRequestSuccess)success
|
|||
|
|
failure:(MLHttpRequestFailed)failure;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 上传文件
|
|||
|
|
* @return 返回的对象可取消请求,调用cancel方法
|
|||
|
|
*/
|
|||
|
|
+ (__kindof NSURLSessionTask *)uploadFileWithURL:(NSString *)URL
|
|||
|
|
parameters:(id)parameters
|
|||
|
|
name:(NSString *)name
|
|||
|
|
filePath:(NSString *)filePath
|
|||
|
|
progress:(MLHttpProgress)progress
|
|||
|
|
success:(MLHttpRequestSuccess)success
|
|||
|
|
failure:(MLHttpRequestFailed)failure;
|
|||
|
|
|
|||
|
|
#pragma mark - 上传GIF
|
|||
|
|
+ (NSURLSessionTask *)uploadGIFWithURL:(NSString *)URL
|
|||
|
|
parameters:(id)parameters
|
|||
|
|
name:(NSString *)name
|
|||
|
|
gifData:(NSData *)gifData
|
|||
|
|
success:(MLHttpRequestSuccess)success
|
|||
|
|
failure:(MLHttpRequestFailed)failure;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 上传单/多张图片
|
|||
|
|
*
|
|||
|
|
* @param URL 请求地址
|
|||
|
|
* @param parameters 请求参数
|
|||
|
|
* @param name 图片对应服务器上的字段
|
|||
|
|
* @param images 图片数组
|
|||
|
|
* @param fileNames 图片文件名数组, 可以为nil, 数组内的文件名默认为当前日期时间"yyyyMMddHHmmss"
|
|||
|
|
* @param imageScale 图片文件压缩比 范围 (0.f ~ 1.f)
|
|||
|
|
* @param imageType 图片文件的类型,例:png、jpg(默认类型)....
|
|||
|
|
* @param progress 上传进度信息
|
|||
|
|
* @param success 请求成功的回调
|
|||
|
|
* @param failure 请求失败的回调
|
|||
|
|
*
|
|||
|
|
* @return 返回的对象可取消请求,调用cancel方法
|
|||
|
|
*/
|
|||
|
|
+ (__kindof NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL
|
|||
|
|
parameters:(id)parameters
|
|||
|
|
name:(NSString *)name
|
|||
|
|
images:(NSArray<UIImage *> *)images
|
|||
|
|
fileNames:(NSArray<NSString *> *)fileNames
|
|||
|
|
imageScale:(CGFloat)imageScale
|
|||
|
|
imageType:(NSString *)imageType
|
|||
|
|
progress:(MLHttpProgress)progress
|
|||
|
|
success:(MLHttpRequestSuccess)success
|
|||
|
|
failure:(MLHttpRequestFailed)failure;
|
|||
|
|
/**
|
|||
|
|
* 上传单/多张图片
|
|||
|
|
*
|
|||
|
|
* @param URL 请求地址
|
|||
|
|
* @param parameters 请求参数
|
|||
|
|
* @param name 图片对应服务器上的字段
|
|||
|
|
* @param images 图片数组
|
|||
|
|
* @param fileNames 图片文件名数组, 可以为nil, 数组内的文件名默认为当前日期时间"yyyyMMddHHmmss"
|
|||
|
|
* @param imageScale 图片文件压缩比 范围 (0.f ~ 1.f)
|
|||
|
|
* @param imageType 图片文件的类型,例:png、jpg(默认类型)....
|
|||
|
|
* @param audiofilePath 音频本地地址
|
|||
|
|
* @param progress 上传进度信息
|
|||
|
|
* @param success 请求成功的回调
|
|||
|
|
* @param failure 请求失败的回调
|
|||
|
|
*
|
|||
|
|
* @return 返回的对象可取消请求,调用cancel方法
|
|||
|
|
*/
|
|||
|
|
+ (NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL
|
|||
|
|
parameters:(id)parameters
|
|||
|
|
name:(NSString *)name
|
|||
|
|
images:(NSArray<UIImage *> *)images
|
|||
|
|
fileNames:(NSArray<NSString *> *)fileNames
|
|||
|
|
imageScale:(CGFloat)imageScale
|
|||
|
|
imageType:(NSString *)imageType
|
|||
|
|
audio:(NSString *)audiofilePath
|
|||
|
|
progress:(MLHttpProgress)progress
|
|||
|
|
success:(MLHttpRequestSuccess)success
|
|||
|
|
failure:(MLHttpRequestFailed)failure;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 下载文件
|
|||
|
|
*
|
|||
|
|
* @param URL 请求地址
|
|||
|
|
* @param fileDir 文件存储目录(默认存储目录为Download)
|
|||
|
|
* @param progress 文件下载的进度信息
|
|||
|
|
* @param success 下载成功的回调(回调参数filePath:文件的路径)
|
|||
|
|
* @param failure 下载失败的回调
|
|||
|
|
*
|
|||
|
|
* @return 返回NSURLSessionDownloadTask实例,可用于暂停继续,暂停调用suspend方法,开始下载调用resume方法
|
|||
|
|
*/
|
|||
|
|
+ (__kindof NSURLSessionTask *)downloadWithURL:(NSString *)URL
|
|||
|
|
fileDir:(NSString *)fileDir
|
|||
|
|
progress:(MLHttpProgress)progress
|
|||
|
|
success:(void(^)(NSString *filePath))success
|
|||
|
|
failure:(MLHttpRequestFailed)failure;
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
************************************** 说明 **********************************************
|
|||
|
|
*
|
|||
|
|
* 在一开始设计接口的时候就想着方法接口越少越好,越简单越好,只有GET,POST,上传,下载,监测网络状态就够了.
|
|||
|
|
*
|
|||
|
|
* 无奈的是在实际开发中,每个APP与后台服务器的数据交互都有不同的请求格式,如果要修改请求格式,就要在此封装
|
|||
|
|
* 内修改,再加上此封装在支持CocoaPods后,如果使用者pod update最新MLNetworkHelper,那又要重新修改此
|
|||
|
|
* 封装内的相关参数.
|
|||
|
|
*
|
|||
|
|
* 依个人经验,在项目的开发中,一般都会将网络请求部分封装 2~3 层,第2层配置好网络请求工具的在本项目中的各项
|
|||
|
|
* 参数,其暴露出的方法接口只需留出请求URL与参数的入口就行,第3层就是对整个项目请求API的封装,其对外暴露出的
|
|||
|
|
* 的方法接口只留出请求参数的入口.这样如果以后项目要更换网络请求库或者修改请求URL,在单个文件内完成配置就好
|
|||
|
|
* 了,大大降低了项目的后期维护难度
|
|||
|
|
*
|
|||
|
|
* 综上所述,最终还是将设置参数的接口暴露出来,如果通过CocoaPods方式使用MLNetworkHelper,在设置项目网络
|
|||
|
|
* 请求参数的时候,强烈建议开发者在此基础上再封装一层,通过以下方法配置好各种参数与请求的URL,便于维护
|
|||
|
|
*
|
|||
|
|
************************************** 说明 **********************************************
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#pragma mark - 设置AFHTTPSessionManager相关属性
|
|||
|
|
#pragma mark 注意: 因为全局只有一个AFHTTPSessionManager实例,所以以下设置方式全局生效
|
|||
|
|
/**
|
|||
|
|
在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置
|
|||
|
|
(注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌)
|
|||
|
|
@param sessionManager AFHTTPSessionManager的实例
|
|||
|
|
*/
|
|||
|
|
+ (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 设置网络请求参数的格式:默认为二进制格式
|
|||
|
|
*
|
|||
|
|
* @param requestSerializer MLRequestSerializerJSON(JSON格式),MLRequestSerializerHTTP(二进制格式),
|
|||
|
|
*/
|
|||
|
|
+ (void)setRequestSerializer:(MLRequestSerializer)requestSerializer;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 设置服务器响应数据格式:默认为JSON格式
|
|||
|
|
*
|
|||
|
|
* @param responseSerializer MLResponseSerializerJSON(JSON格式),MLResponseSerializerHTTP(二进制格式)
|
|||
|
|
*/
|
|||
|
|
+ (void)setResponseSerializer:(MLResponseSerializer)responseSerializer;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 设置请求超时时间:默认为30S
|
|||
|
|
*
|
|||
|
|
* @param time 时长
|
|||
|
|
*/
|
|||
|
|
+ (void)setRequestTimeoutInterval:(NSTimeInterval)time;
|
|||
|
|
|
|||
|
|
/// 设置请求头
|
|||
|
|
+ (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 是否打开网络状态转圈菊花:默认打开
|
|||
|
|
*
|
|||
|
|
* @param open YES(打开), NO(关闭)
|
|||
|
|
*/
|
|||
|
|
+ (void)openNetworkActivityIndicator:(BOOL)open;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
配置自建证书的Https请求, 参考链接: http://blog.csdn.net/syg90178aw/article/details/52839103
|
|||
|
|
|
|||
|
|
@param cerPath 自建Https证书的路径
|
|||
|
|
@param validatesDomainName 是否需要验证域名,默认为YES. 如果证书的域名与请求的域名不一致,需设置为NO; 即服务器使用其他可信任机构颁发
|
|||
|
|
的证书,也可以建立连接,这个非常危险, 建议打开.validatesDomainName=NO, 主要用于这种情况:客户端请求的是子域名, 而证书上的是另外
|
|||
|
|
一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com, 那么mail.google.com是无法验证通过的.
|
|||
|
|
*/
|
|||
|
|
+ (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;
|
|||
|
|
|
|||
|
|
@end
|