美文网首页iOS专题
iOS AFNetworking 源码解析

iOS AFNetworking 源码解析

作者: Zhen斌iOS | 来源:发表于2020-06-01 22:28 被阅读0次

    https://github.com/AFNetworking/AFNetworking

    一、AFNetworking主要分为四大模块:

    • NSURLSession(会话管理器)
    • Reachability(网络管理器)
    • Security(安全策略)
    • Serialization(请求序列化与响应)

    二、AFSecurityPolicy.m

    AFN提供的三种安全策略:

    typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
    
        AFSSLPinningModeNone,//无校验
    
        AFSSLPinningModePublicKey,//公钥校验
    
        AFSSLPinningModeCertificate,//证书校验
    
    };
    

    三个类方法初始化安全策略:

    • 1、默认的安全策略,不允许无效的证书,需要验证域名,不会对固定的证书和公钥做校验;
    + (instancetype)defaultPolicy;
    
    • 2、创建并返回一个指定安全模式的策略;
    + (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode;
    

    3、创建并返回一个指定安全模式并绑定证书的安全策略。

    + (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode withPinnedCertificates:(NSSet <NSData *> *)pinnedCertificates;
    

    三、AFNetworkReachabilityManager.m

    AFN提供的四种网络状态:

    typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
    
        AFNetworkReachabilityStatusUnknown          = -1,//未知网络
    
        AFNetworkReachabilityStatusNotReachable    = 0,//没网络
    
        AFNetworkReachabilityStatusReachableViaWWAN = 1,//蜂窝网络
    
        AFNetworkReachabilityStatusReachableViaWiFi = 2,//wifi
    
    };
    

    五种初始化方式:

    //返回有默认套接字地址的网络管理器单例;
    
    + (instancetype)sharedManager;
    
    //返回有默认套接字地址的网络管理器;
    
    + (instancetype)manager;
    
    //返回有指定域的网络管理器;
    
    + (instancetype)managerForDomain:(NSString *)domain;
    
    //创建并返回具有自定义套接字地址的网络管理器
    
    + (instancetype)managerForAddress:(const void *)address;
    
    //通过系统的网络检测对象初始化网络管理器
    
    + (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability NS_DESIGNATED_INITIALIZER;
    
    

    网络状态改变时,block回调:

    - (void)setReachabilityStatusChangeBlock:(nullable void (^)(AFNetworkReachabilityStatus status))block;
    

    四、AFURLRequestSerialization.m

    暂定一种HTTP请求序列化类型:

    typedef NS_ENUM(NSUInteger, AFHTTPRequestQueryStringSerializationStyle) {
    
        AFHTTPRequestQueryStringDefaultStyle = 0,
    
    };
    

    AFURLRequestSerialization协议:返回一个带指定参数的序列化请求。

    AFHTTPRequestSerializer类(遵守AFURLRequestSerialization协议):

    对序列化参数进行编码、是否可以用手机流量创建网络、创建请求的缓存策略、创建cookies处理方式、是否在接收请求响应之前继续发送请求、设置超时时间、设置获取请求头信息、设置清除http auth信息、默认和自定义查询字符串序列化方法。

    三种创建并返回可变url请求的方法:

    //默认方法
    
    - (NSMutableURLRequest *)requestWithMethod:(NSString *)method
    
                                    URLString:(NSString *)URLString
    
                                    parameters:(nullable id)parameters
    
                                        error:(NSError * _Nullable __autoreleasing *)error;
    
    //自定义block方法
    
    - (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method
    
                                                  URLString:(NSString *)URLString
    
                                                parameters:(nullable NSDictionary <NSString *, id> *)parameters
    
                                  constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block
    
                                                      error:(NSError * _Nullable __autoreleasing *)error;
    
    //删除HTTPBodySteam
    
    - (NSMutableURLRequest *)requestWithMultipartFormRequest:(NSURLRequest *)request
    
                                writingStreamContentsToFile:(NSURL *)fileURL
    
                                          completionHandler:(nullable void (^)(NSError * _Nullable error))handler;
    

    AFJSONRequestSerializer:专门用来处理类型为json的请求。

    AFPropertyListRequestSerializer:专门用来处理类型为x-plist的请求。

    五、AFURLResponseSerialization.m

    1、AFURLResponseSerialization协议:返回一个带指定参数的序列化响应协议。
    2、AFHTTPResponseSerializer类:初始化响应类、设置响应可接受的状态码、设置响应可接受的Content - Type类型、是否返回有效的响应。
    3、AFJSONResponseSerializer:检验和解码application/json、text/json、text/javascript类型的响应。
    4、AFXMLParserResponseSerializer:检验和解码application/xml、text/xml类型的响应。
    5、AFXMLDocumentResponseSerializer:检验和解码application/xml、text/xml文档类型的响应。
    6、AFPropertyListResponseSerializer:检验和解码x-plist类型的响应。
    7、AFImageResponseSerializer:检验和解码UIImage和NSImage类型的响应。
    8、AFCompoundResponseSerializer:检验和解码多种潜在类型的响应

    六、AFURLSessionManager.m

    两种初始化方法:

    //根据配置信息初始化网络会话
    
    - (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration;
    
    //配置信息为nil,初始化网络会话
    
    - (instancetype)init;
    

    取消网络操作:

    //是否取消任务,使网络会话失效
    
    - (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks;
    

    创建普通网络会话:

    //根据请求信息创建网络会话
    
    - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
    
                                completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject,  NSError * _Nullable error))completionHandler DEPRECATED_ATTRIBUTE;
    
    //根据请求信息创建可以查询上传、下载进度的网络会话                           
    
    - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
    
                                  uploadProgress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
    
                                downloadProgress:(nullable void (^)(NSProgress *downloadProgress))downloadProgressBlock
    
                                completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject,  NSError * _Nullable error))completionHandler;
    
    

    创建上传网络会话:

    //根据请求信息和文件url创建可以查询上传进度的网络会话
    
    - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
    
                                            fromFile:(NSURL *)fileURL
    
                                            progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
    
                                    completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError  * _Nullable error))completionHandler;
    
    //根据请求信息和要上传的数据创建可以查询上传进度的网络会话           
    
    - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
    
                                            fromData:(nullable NSData *)bodyData
    
                                            progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
    
                                    completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;
    
    //根据请求和输入流创建可以查询上传进度的网络会话
    
    - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request
    
                                                    progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
    
                                            completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;
    
    

    设置网络请求的回调:

    //设置会话失效时回调的block
    
    - (void)setSessionDidBecomeInvalidBlock:(nullable void (^)(NSURLSession *session, NSError *error))block;
    
    //设置对接收到的http auth进行校验时,回调的block。
    
    - (void)setSessionDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * _Nullable __autoreleasing * _Nullable credential))block;
    
    //设置新的输入流时,回调的block。
    
    - (void)setTaskNeedNewBodyStreamBlock:(nullable NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block;
    
    //设置HTTP重定向时,回调的block。
    
    - (void)setTaskWillPerformHTTPRedirectionBlock:(nullable NSURLRequest * _Nullable (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block;
    
    //设置对接收到的http auth进行校验时,回调的block。
    
    - (void)setTaskDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * _Nullable __autoreleasing * _Nullable credential))block;
    
    //设置发送的数据时,回调的block。
    
    - (void)setTaskDidSendBodyDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block;
    
    //完成网络任务时进行设置
    
    - (void)setTaskDidCompleteBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, NSError * _Nullable error))block;
    
    //接收到响应时,回调block
    
    - (void)setDataTaskDidReceiveResponseBlock:(nullable NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block;
    
    //当下载任务完成时,设置网络任务
    
    - (void)setDataTaskDidBecomeDownloadTaskBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block;
    
    //当数据接收到时,设置网络任务
    
    - (void)setDataTaskDidReceiveDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block;
    
    //临时缓存时设置任务
    
    - (void)setDataTaskWillCacheResponseBlock:(nullable NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block;
    
    //当所有的任务发送出去以后,回调block
    
    - (void)setDidFinishEventsForBackgroundURLSessionBlock:(nullable void (^)(NSURLSession *session))block;
    
    //当下载任务完成时,回调block
    
    - (void)setDownloadTaskDidFinishDownloadingBlock:(nullable NSURL * _Nullable  (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block;
    
    //下载时,写入数据的回调block
    
    - (void)setDownloadTaskDidWriteDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block;
    
    //设置断点续传的block
    
    - (void)setDownloadTaskDidResumeBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block;
    

    七、AFHTTPSessionManager.m

    四种初始化方法:

    //url和配置信息都是nil
    
    + (instancetype)manager;
    
    //url和配置信息都是nil
    
    + (instancetype)init;
    
    //配置信息是nil
    
    - (instancetype)initWithBaseURL:(nullable NSURL *)url;
    
    //url是nil
    
    - (instancetype)initWithBaseURL:(nullable NSURL *)url
    
              sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration;
    
    //url和配置信息都是nil
    
    + (instancetype)manager;
    
    //url和配置信息都是nil
    
    + (instancetype)init;
    
    //配置信息是nil
    
    - (instancetype)initWithBaseURL:(nullable NSURL *)url;
    
    //url是nil
    
    - (instancetype)initWithBaseURL:(nullable NSURL *)url
    
              sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration;
    
    

    网络请求方法[Get,Post,Put,Patch,Delete,Head]:

    //GET请求
    
    - (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
    
                      parameters:(nullable id)parameters
    
                          success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                          failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //可查询下载进度的GET请求
    
    - (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
    
                                parameters:(nullable id)parameters
    
                                  progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress
    
                                  success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                                  failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //HEAD请求
    
    - (nullable NSURLSessionDataTask *)HEAD:(NSString *)URLString
    
                        parameters:(nullable id)parameters
    
                          success:(nullable void (^)(NSURLSessionDataTask *task))success
    
                          failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //POST请求
    
    - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
    
                        parameters:(nullable id)parameters
    
                          success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                          failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;
    
    //可查询上传进度的POST请求
    
    - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
    
                                parameters:(nullable id)parameters
    
                                  progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
    
                                    success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                                    failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //根据表单类型,构建POST网络请求
    
    - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
    
                        parameters:(nullable id)parameters
    
        constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block
    
                          success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                          failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;
    
    //PUT请求
    
    - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
    
                                parameters:(nullable id)parameters
    
                  constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block
    
                                  progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
    
                                    success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                                    failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;//根据表单类型,构建POST网络请求,可查询上传进度
    
    - (nullable NSURLSessionDataTask *)PUT:(NSString *)URLString
    
                      parameters:(nullable id)parameters
    
                          success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                          failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //PATCH请求
    
    - (nullable NSURLSessionDataTask *)PATCH:(NSString *)URLString
    
                        parameters:(nullable id)parameters
    
                            success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                            failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //DELETE请求
    
    - (nullable NSURLSessionDataTask *)DELETE:(NSString *)URLString
    
                          parameters:(nullable id)parameters
    
                            success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                            failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //GET请求
    
    - (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
    
                      parameters:(nullable id)parameters
    
                          success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                          failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //可查询下载进度的GET请求
    
    - (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
    
                                parameters:(nullable id)parameters
    
                                  progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress
    
                                  success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                                  failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //HEAD请求
    
    - (nullable NSURLSessionDataTask *)HEAD:(NSString *)URLString
    
                        parameters:(nullable id)parameters
    
                          success:(nullable void (^)(NSURLSessionDataTask *task))success
    
                          failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //POST请求
    
    - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
    
                        parameters:(nullable id)parameters
    
                          success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                          failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;
    
    //可查询上传进度的POST请求
    
    - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
    
                                parameters:(nullable id)parameters
    
                                  progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
    
                                    success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                                    failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //根据表单类型,构建POST网络请求
    
    - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
    
                        parameters:(nullable id)parameters
    
        constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block
    
                          success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                          failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;
    
    //PUT请求
    
    - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
    
                                parameters:(nullable id)parameters
    
                  constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block
    
                                  progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
    
                                    success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                                    failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;//根据表单类型,构建POST网络请求,可查询上传进度
    
    - (nullable NSURLSessionDataTask *)PUT:(NSString *)URLString
    
                      parameters:(nullable id)parameters
    
                          success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                          failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //PATCH请求
    
    - (nullable NSURLSessionDataTask *)PATCH:(NSString *)URLString
    
                        parameters:(nullable id)parameters
    
                            success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                            failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    //DELETE请求
    
    - (nullable NSURLSessionDataTask *)DELETE:(NSString *)URLString
    
                          parameters:(nullable id)parameters
    
                            success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    
                            failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
    
    

    相关文章

      网友评论

        本文标题:iOS AFNetworking 源码解析

        本文链接:https://www.haomeiwen.com/subject/jyyezhtx.html