AFN3.0集成與二次封裝(手動集成)

摘要

隨著蘋果https的出現,在網絡請求方面蘋果已經拋棄了NSURLConnection,而是采用了使用更為簡單的NSURLSession,最近正在搭一個程序框架,最后還是選擇了AFN3.0,并通過朋友demo的參考,進行了二次封裝,集成方法如下:

準備階段

1.首先下載最新版本的AFN3.0,網址如下:https://github.com/AFNetworking/AFNetworking
2.新建一個工程:名字隨意

集成階段

1.打開下載下來的demo,運行如下(其中紅色箭頭所指的文件是我們拖到項目中的兩個文件):


1678515-d4b859838f96a269.jpg

2.將拖到新建的項目中,在info.plist文件中添加ATS(App Transporty security……),command+B編譯一下,發現沒有問題即可。ATS截圖如下:


1678515-491d06a5ac337984.jpg

到目前來說,AFN3.0已經集成完畢,但是有些細心的朋友會發現,AFN3.0的工程中出現了好多SSL證書,如圖所示:

1678515-8c1a0bd2a9d03cfe.jpg

這種情況下:自己也爬網查了一些東西,提供兩個網址以供參考:
http://www.cnblogs.com/jys509/p/5001566.html
http://oncenote.com/2014/10/21/Security-1-HTTPS/
講的很專業,希望對讀到的朋友有幫助!

二次封裝

主要是新建了一個NSObject的子類,對AFN的功能進行了集成:
LHAFNetWork.h
#import <Foundation/Foundation.h>
#import "AFNetworking/AFNetworking.h"

/**
 *  宏定義請求成功的block
 *
 *  @param response 請求成功返回的數據
 */
typedef void (^LHResponseSuccess)(NSURLSessionDataTask * task,id responseObject);

/**
 *  宏定義請求失敗的block
 *
 *  @param error 報錯信息
 */
typedef void (^LHResponseFail)(NSURLSessionDataTask * task, NSError * error);

/**
 *  上傳或者下載的進度
 *
 *  @param progress 進度
 */
 typedef void (^LHProgress)(NSProgress *progress);

@interface LHAFNetWork : NSObject
/**
 *  普通get方法請求網絡數據
 *
 *  @param url     請求網址路徑
 *  @param params  請求參數
 *  @param success 成功回調
 *  @param fail    失敗回調
 */
+(void)GET:(NSString *)url
params:(NSDictionary *)params success:(LHResponseSuccess)success
  fail:(LHResponseFail)fail;
/**
 *  含有baseURL的get方法
 *
 *  @param url     請求網址路徑
 *  @param baseUrl 請求網址根路徑
 *  @param params  請求參數
 *  @param success 成功回調
 *  @param fail    失敗回調
 */
+(void)GET:(NSString *)url baseURL:(NSString *)baseUrl
params:(NSDictionary *)params success:(LHResponseSuccess)success fail:(LHResponseFail)fail;

/**
 *  普通post方法請求網絡數據
 *
 *  @param url     請求網址路徑
 *  @param params  請求參數
 *  @param success 成功回調
 *  @param fail    失敗回調
 */
  +(void)POST:(NSString *)url
 params:(NSDictionary *)params
success:(LHResponseSuccess)success
   fail:(LHResponseFail)fail;

/**
 *  含有baseURL的post方法
 *
 *  @param url     請求網址路徑
 *  @param baseUrl 請求網址根路徑
 *  @param params  請求參數
 *  @param success 成功回調
 *  @param fail    失敗回調
 */
+(void)POST:(NSString *)url
baseURL:(NSString *)baseUrl
 params:(NSDictionary *)params
success:(LHResponseSuccess)success
   fail:(LHResponseFail)fail;

/**
 *  普通路徑上傳文件
 *
 *  @param url      請求網址路徑
 *  @param params   請求參數
 *  @param filedata 文件
 *  @param name     指定參數名
 *  @param filename 文件名(要有后綴名)
 *  @param mimeType 文件類型
 *  @param progress 上傳進度
 *  @param success  成功回調
 *  @param fail     失敗回調
 */
+(void)uploadWithURL:(NSString *)url
          params:(NSDictionary *)params
        fileData:(NSData *)filedata
            name:(NSString *)name
        fileName:(NSString *)filename
        mimeType:(NSString *) mimeType
        progress:(LHProgress)progress
         success:(LHResponseSuccess)success
            fail:(LHResponseFail)fail;
/**
 *  含有跟路徑的上傳文件
 *
 *  @param url      請求網址路徑
 *  @param baseurl  請求網址根路徑
 *  @param params   請求參數
 *  @param filedata 文件
 *  @param name     指定參數名
 *  @param filename 文件名(要有后綴名)
 *  @param mimeType 文件類型
 *  @param progress 上傳進度
 *  @param success  成功回調
 *  @param fail     失敗回調
 */
 +(void)uploadWithURL:(NSString *)url
         baseURL:(NSString *)baseurl
          params:(NSDictionary *)params
        fileData:(NSData *)filedata
            name:(NSString *)name
        fileName:(NSString *)filename
        mimeType:(NSString *) mimeType
        progress:(LHProgress)progress
         success:(LHResponseSuccess)success
            fail:(LHResponseFail)fail;

/**
 *  下載文件
 *
 *  @param url      請求網絡路徑
 *  @param fileURL  保存文件url
 *  @param progress 下載進度
 *  @param success  成功回調
 *  @param fail     失敗回調
 *
 *  @return 返回NSURLSessionDownloadTask實例,可用于暫停繼續,暫停調用suspend方法,重新開啟下載調用resume方法
 */
+(NSURLSessionDownloadTask *)downloadWithURL:(NSString *)url
                             savePathURL:(NSURL *)fileURL
                                progress:(LHProgress )progress
                                 success:(void (^)(NSURLResponse *, NSURL *))success
                                    fail:(void (^)(NSError *))fail;
@end

LHAFNetWork.m
#import "LHAFNetWork.h"
@implementation LHAFNetWork
+(void)GET:(NSString *)url params:(NSDictionary *)params
success:(LHResponseSuccess)success fail:(LHResponseFail)fail{

AFHTTPSessionManager *manager = [LHAFNetWork managerWithBaseURL:nil sessionConfiguration:NO];
[manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    id dic = [LHAFNetWork responseConfiguration:responseObject];
    
    success(task,dic);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    fail(task,error);
}];
}

+(void)GET:(NSString *)url baseURL:(NSString *)baseUrl params:(NSDictionary *)params
 success:(LHResponseSuccess)success fail:(LHResponseFail)fail{

AFHTTPSessionManager *manager = [LHAFNetWork managerWithBaseURL:baseUrl sessionConfiguration:NO];
[manager GET:url parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {
    
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    
    id dic = [LHAFNetWork responseConfiguration:responseObject];
    
    success(task,dic);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    fail(task,error);
}];

}

+(void)POST:(NSString *)url params:(NSDictionary *)params
success:(LHResponseSuccess)success fail:(LHResponseFail)fail{

AFHTTPSessionManager *manager = [LHAFNetWork managerWithBaseURL:nil sessionConfiguration:NO];

[manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    id dic = [LHAFNetWork responseConfiguration:responseObject];
    
    success(task,dic);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    fail(task,error);
}];
}

+(void)POST:(NSString *)url baseURL:(NSString *)baseUrl params:(NSDictionary *)params
success:(LHResponseSuccess)success fail:(LHResponseFail)fail{

AFHTTPSessionManager *manager = [LHAFNetWork managerWithBaseURL:baseUrl sessionConfiguration:NO];
[manager POST:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
    
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    id dic = [LHAFNetWork responseConfiguration:responseObject];
    
    success(task,dic);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    fail(task,error);
}];
}

+(void)uploadWithURL:(NSString *)url params:(NSDictionary *)params fileData:(NSData *)filedata name:(NSString *)name fileName:(NSString *)filename mimeType:(NSString *) mimeType progress:(LHProgress)progress success:(LHResponseSuccess)success fail:(LHResponseFail)fail{

AFHTTPSessionManager *manager = [LHAFNetWork managerWithBaseURL:nil sessionConfiguration:NO];

[manager POST:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    
    [formData appendPartWithFileData:filedata name:name fileName:filename mimeType:mimeType];
    
} progress:^(NSProgress * _Nonnull uploadProgress) {
    
    progress(uploadProgress);
    
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    id dic = [LHAFNetWork responseConfiguration:responseObject];
    success(task,dic);
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    fail(task,error);
}];
}

+(void)uploadWithURL:(NSString *)url
         baseURL:(NSString *)baseurl
          params:(NSDictionary *)params
        fileData:(NSData *)filedata
            name:(NSString *)name
        fileName:(NSString *)filename
        mimeType:(NSString *) mimeType
        progress:(LHProgress)progress
         success:(LHResponseSuccess)success
            fail:(LHResponseFail)fail{

AFHTTPSessionManager *manager = [LHAFNetWork managerWithBaseURL:baseurl sessionConfiguration:YES];

[manager POST:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    [formData appendPartWithFileData:filedata name:name fileName:filename mimeType:mimeType];
} progress:^(NSProgress * _Nonnull uploadProgress) {
    progress(uploadProgress);
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    id dic = [LHAFNetWork responseConfiguration:responseObject];
    
    success(task,dic);
    
    
    success(task,responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    fail(task,error);
}];
}

+(NSURLSessionDownloadTask *)downloadWithURL:(NSString *)url
                             savePathURL:(NSURL *)fileURL
                                progress:(LHProgress )progress
                                 success:(void (^)(NSURLResponse *, NSURL *))success
                                    fail:(void (^)(NSError *))fail{
AFHTTPSessionManager *manager = [self managerWithBaseURL:nil sessionConfiguration:YES];

NSURL *urlpath = [NSURL URLWithString:url];
NSURLRequest *request = [NSURLRequest requestWithURL:urlpath];

NSURLSessionDownloadTask *downloadtask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
    progress(downloadProgress);
    
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
    
    return [fileURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
    
    if (error) {
        fail(error);
    }else{
        
        success(response,filePath);
    }
}];

[downloadtask resume];

return downloadtask;
}

#pragma mark - Private

+(AFHTTPSessionManager *)managerWithBaseURL:(NSString *)baseURL  sessionConfiguration:(BOOL)isconfiguration{

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFHTTPSessionManager *manager =nil;

NSURL *url = [NSURL URLWithString:baseURL];

if (isconfiguration) {
    
    manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url sessionConfiguration:configuration];
}else{
    manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
}

manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

return manager;
}

+(id)responseConfiguration:(id)responseObject{

NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
string = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""];
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
return dic;
}
@end

到此為止本人的第一篇博客已經寫完,后續還會有更多高含量的博客發表……
轉載:http://www.lxweimin.com/p/986f51578e96

歡迎關注我的個人微信公眾號,免費送計算機各種最新視頻資源!你想象不到的精彩!


0.jpg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • 很可能你的應用是與一個支持HTTPS傳輸數據的服務器交互,但是并沒有使用TLS 1.2或更高。在這種情況下,你定義...
    Www劉閱讀 3,112評論 0 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,076評論 25 708
  • 為了自己
    yuky閱讀 178評論 0 0
  • 不知怎的,用了半年多的用戶名,突然想換一個 so: 修改了/etc/passwd 和/etc/shadow 文件里...
    海狩閱讀 1,285評論 0 2