![image](https://github.com/jkpang/PPNetworkHelper/blob/master/Picture/PPNetworkHelper.png)
![](https://img.shields.io/badge/platform-iOS-red.svg) ![](https://img.shields.io/badge/language-Objective--C-orange.svg) ![](https://img.shields.io/cocoapods/v/PPNetworkHelper.svg?style=flat) ![](https://img.shields.io/cocoapods/dt/PPNetworkHelper.svg
) ![](https://img.shields.io/badge/license-MIT%20License-brightgreen.svg)? [![](https://img.shields.io/badge/weibo-jkpang--%E5%BA%9E-red.svg)](http://weibo.com/5743737098/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1)
對AFNetworking 3.x 與YYCache的二次封裝,封裝常見的GET帅掘、POST峡谊、文件上傳/下載界睁、網(wǎng)絡狀態(tài)監(jiān)測的功能如庭、方法接口簡潔明了,并結合YYCache實現(xiàn)對網(wǎng)絡數(shù)據(jù)的緩存,簡單易用,不用再寫FMDB那煩人的SQL語句,一句代碼搞定網(wǎng)絡數(shù)據(jù)的請求與緩存.?
無需設置,無需插件,控制臺可直接打印json中文字符,調(diào)試更方便
### 新建 PP-iOS學習交流群 : 323408051 有關于PP系列封裝的問題和iOS技術可以在此群討論
[簡書地址](http://www.reibang.com/p/c695d20d95cb) ;
![image](https://github.com/jkpang/PPNetworkHelper/blob/master/Picture/network.gif)
## Requirements 要求
*iOS 7+
*Xcode 8+
## Installation 安裝
### 1.手動安裝:
`下載DEMO后,將子文件夾PPNetworkHelper拖入到項目中, 導入頭文件PPNetworkHelper.h開始使用, 注意: 項目中需要有AFN3.x , YYCache第三方庫! 在工程中鏈接sqlite3依賴庫`
### 2.CocoaPods安裝:
first
`pod 'PPNetworkHelper',:git => 'https://github.com/jkpang/PPNetworkHelper.git'`
then
`pod install或pod install --no-repo-update`
如果發(fā)現(xiàn)pod search PPNetworkHelper 不是最新版本,在終端執(zhí)行pod setup命令更新本地spec鏡像緩存(時間可能有點長),重新搜索就OK了
## Usage 使用方法
### 1. 無自動緩存(GET與POST請求用法相同)
#### 1.1 無緩存
```objc
[PPNetworkHelper GET:url parameters:nil success:^(id responseObject) {
? ? ? ? //請求成功
? ? } failure:^(NSError *error) {
? ? ? ? //請求失敗
}];
```
#### 1.2 無緩存,手動緩存
```objc
[PPNetworkHelper GET:url parameters:nil success:^(id responseObject) {
? ? //請求成功
? ? ? ? //手動緩存
? ? [PPNetworkCache setHttpCache:responseObject URL:url parameters:parameters];
? ? } failure:^(NSError *error) {
? ? //請求失敗
}];
```
### 2. 自動緩存(GET與POST請求用法相同)
```objc
[PPNetworkHelper GET:url parameters:nil responseCache:^(id responseCache) {
? ? ? ? //加載緩存數(shù)據(jù)
? ? } success:^(id responseObject) {
? ? ? ? //請求成功
? ? } failure:^(NSError *error) {
? ? ? ? //請求失敗
}];
```
### 3.單/多圖片上傳
```objc
[PPNetworkHelper uploadImagesWithURL:url
parameters:@{@"參數(shù)":@"參數(shù)"}
images:@[@"UIImage數(shù)組"]
? ? ? ? ? ? ? ? ? ? ? ? ? name:@"文件對應服務器上的字段"
? ? ? ? ? ? ? ? ? ? ? fileNames:@"文件名稱數(shù)組"
? ? ? ? ? ? ? ? ? ? ? imageType:@"圖片的類型,png,jpeg"?
? ? ? ? ? ? ? ? ? ? ? imageScale:@"圖片文件壓縮比 范圍 (0.f ~ 1.f)"
? ? ? ? ? ? ? ? ? ? ? progress:^(NSProgress *progress) {
? ? ? ? ? ? ? ? ? ? ? ? ? //上傳進度
? ? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"上傳進度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
? ? ? ? ? ? ? ? ? ? ? } success:^(id responseObject) {
?? ? ? ? ? ? ? ? ? ? ? ? //上傳成功
? ? ? ? ? ? ? ? ? ? ? } failure:^(NSError *error) {
? ? ? ? ? ? ? ? ? ? ? ? //上傳失敗
}];
```
### 4.文件上傳
```objc
[PPNetworkHelper uploadFileWithURL:url
? ? ? ? ? ? ? ? ? ? parameters:@{@"參數(shù)":@"參數(shù)"}
? ? ? ? ? ? ? ? ? ? ? ? ? name:@"文件對應服務器上的字段"
? ? ? ? ? ? ? ? ? ? ? filePath:@"文件本地的沙盒路徑"
? ? ? ? ? ? ? ? ? ? ? progress:^(NSProgress *progress) {
? ? ? ? ? ? ? ? ? ? ? ? ? //上傳進度
? ? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"上傳進度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
? ? ? ? ? ? ? ? ? ? ? } success:^(id responseObject) {
?? ? ? ? ? ? ? ? ? ? ? ? //上傳成功
? ? ? ? ? ? ? ? ? ? ? } failure:^(NSError *error) {
? ? ? ? ? ? ? ? ? ? ? ? //上傳失敗
}];
```
### 5.文件下載
```objc
NSURLSessionTask *task = [PPNetworkHelper downloadWithURL:url fileDir:@"下載至沙盒中的制定文件夾(默認為Download)" progress:^(NSProgress *progress) {
? ? ? ? //下載進度,如果要配合UI進度條顯示,必須在主線程更新UI
? ? ? ? NSLog(@"下載進度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
? ? } success:^(NSString *filePath) {
? ? ? ? //下載成功
? ? } failure:^(NSError *error) {
? ? ? ? //下載失敗
}];
//暫停下載,暫不支持斷點下載
[task suspend];
//開始下載
[task resume];
```
### 6.網(wǎng)絡狀態(tài)監(jiān)測
```objc
// 1.實時獲取網(wǎng)絡狀態(tài),通過Block回調(diào)實時獲取(此方法可多次調(diào)用)
[PPNetworkHelper networkStatusWithBlock:^(PPNetworkStatus status) {
?? switch (status) {
?? ? ? case PPNetworkStatusUnknown:? ? ? ? ? //未知網(wǎng)絡
?? ? ? ? ? break;
?? ? ? case PPNetworkStatusNotReachable:? ? //無網(wǎng)絡
?? ? ? ? ? break;
?? ? ? case PPNetworkStatusReachableViaWWAN://手機網(wǎng)絡
?? ? ? ? ? break;
?? ? ? case PPNetworkStatusReachableViaWiFi://WIFI
?? ? ? ? ? break;
?? }
}];
// 2.一次性獲取當前網(wǎng)絡狀態(tài)
if (kIsNetwork) {? ? ? ? ?
?? NSLog(@"有網(wǎng)絡");
?? if (kIsWWANNetwork) {? ? ? ? ? ? ? ? ? ?
?? ? ? NSLog(@"手機網(wǎng)絡");
?? }else if (kIsWiFiNetwork){
?? ? ? NSLog(@"WiFi網(wǎng)絡");
?? }
} else {
?? NSLog(@"無網(wǎng)絡");
}
```
### 7. 網(wǎng)絡緩存
#### 7.1 自動緩存的邏輯
**1.從本地獲取緩存(不管有無數(shù)據(jù)) --> 2.請求服務器數(shù)據(jù) --> 3.更新本地數(shù)據(jù)**
#### 7.2 獲取緩存總大小
```objc
NSInteger totalBytes = [PPNetworkCache getAllHttpCacheSize];
NSLog(@"網(wǎng)絡緩存大小cache = %.2fMB",totalBytes/1024/1024.f);
```
#### 7.3 刪除所有緩存
```objc
[PPNetworkCache removeAllHttpCache];
```
### 8.網(wǎng)絡參數(shù)設置(附說明)
```objc
/*
?**************************************? 說明? **********************************************
?*
?* 在一開始設計接口的時候就想著方法接口越少越好,越簡單越好,只有GET,POST,上傳,下載,監(jiān)測網(wǎng)絡狀態(tài)就夠了.
?*
?* 無奈的是在實際開發(fā)中,每個APP與后臺服務器的數(shù)據(jù)交互都有不同的請求格式,如果要修改請求格式,就要在此封裝
?* 內(nèi)修改,再加上此封裝在支持CocoaPods后,如果使用者pod update最新PPNetworkHelper,那又要重新修改此
?* 封裝內(nèi)的相關參數(shù).
?*
?* 依個人經(jīng)驗,在項目的開發(fā)中,一般都會將網(wǎng)絡請求部分封裝 2~3 層,第2層配置好網(wǎng)絡請求工具的在本項目中的各項
?* 參數(shù),其暴露出的方法接口只需留出請求URL與參數(shù)的入口就行,第3層就是對整個項目請求API的封裝,其對外暴露出的
?* 的方法接口只留出請求參數(shù)的入口.這樣如果以后項目要更換網(wǎng)絡請求庫或者修改請求URL,在單個文件內(nèi)完成配置就好
?* 了,大大降低了項目的后期維護難度
?*
?* 綜上所述,最終還是將設置參數(shù)的接口暴露出來,如果通過CocoaPods方式使用PPNetworkHelper,在設置項目網(wǎng)絡
?* 請求參數(shù)的時候,強烈建議開發(fā)者在此基礎上再封裝一層,通過以下方法配置好各種參數(shù)與請求的URL,便于維護
?*
?**************************************? 說明? **********************************************
?*/
#pragma mark - 重置AFHTTPSessionManager相關屬性
/**
?*? 設置網(wǎng)絡請求參數(shù)的格式:默認為二進制格式
?*
?*? @param requestSerializer PPRequestSerializerJSON(JSON格式),PPRequestSerializerHTTP(二進制格式),
?*/
+ (void)setRequestSerializer:(PPRequestSerializer)requestSerializer;
/**
?*? 設置服務器響應數(shù)據(jù)格式:默認為JSON格式
?*
?*? @param responseSerializer PPResponseSerializerJSON(JSON格式),PPResponseSerializerHTTP(二進制格式)
?*/
+ (void)setResponseSerializer:(PPResponseSerializer)responseSerializer;
/**
?*? 設置請求超時時間:默認為30S
?*
?*? @param time 時長
?*/
+ (void)setRequestTimeoutInterval:(NSTimeInterval)time;
/**
?*? 設置請求頭
?*/
+ (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
/**
?*? 是否打開網(wǎng)絡狀態(tài)轉圈菊花:默認打開
?*
?*? @param open YES(打開), NO(關閉)
?*/
+ (void)openNetworkActivityIndicator:(BOOL)open;
/**
?配置自建證書的Https請求, 參考鏈接: http://blog.csdn.net/syg90178aw/article/details/52839103
?@param cerPath 自建Https證書的路徑
?@param validatesDomainName 是否需要驗證域名跌榔,默認為YES. 如果證書的域名與請求的域名不一致折剃,需設置為NO; 即服務器使用其他可信任機構頒發(fā)
? ? ? ? 的證書镶奉,也可以建立連接测蹲,這個非常危險, 建議打開.validatesDomainName=NO, 主要用于這種情況:客戶端請求的是子域名, 而證書上的是另外
? ? ? ? 一個域名莹捡。因為SSL證書上的域名是獨立的,假如證書上注冊的域名是www.google.com, 那么mail.google.com是無法驗證通過的.
?*/
+ (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;
```
PPNetworkHelper全部以類方法調(diào)用,使用簡單,麻麻再也不用擔心我一句一句地寫SQLite啦~~~如果你有更好的建議,希望不吝賜教!
### 你的star是我持續(xù)更新的動力!
===
## CocoaPods更新日志
```
? 2017.04.10(tag:0.8.0):
? 1.新增 + (void)setAFHTTPSessionManagerProperty方法,可獲得AFHTTPSessionManager實例進行相關設置;
? 2.關閉日志狀態(tài)下徹底關閉日志的打印;
? 3.Demo中增加對項目中網(wǎng)絡層的構建,拋磚引玉,在工程的PPHTTPRequestLayer文件夾可以看到;
? 2017.02.15(tag:0.7.0):
? 1.新增 日志打印打開/關閉接口;
? 2.修復 單/多圖上傳BUG;
? 3.優(yōu)化代碼規(guī)范;
? 2017.02.06(tag:0.6.0):
? 1.重構 "單/多圖片上傳"部分
? 2.新增 "上傳文件接口
? 2017.01.02(tag:0.5.0):
? 1.添加配置自建證書的Https請求的接口;
? 2.修復一次性網(wǎng)絡判斷需要先調(diào)網(wǎng)絡監(jiān)測方法才能生效的BUG, 現(xiàn)在可直接調(diào)用一次性網(wǎng)絡判斷即可生效!
? 3.修改在POST請求時,請求參數(shù)的默認格式二進制(之前是JSON格式),**注意,如果有同學在升級此版本后導致獲取不到服務器數(shù)據(jù),請將設置請求參數(shù)格式的代碼注釋掉即可!
? 4.將NetworkStatu-->PPNetworkStatus, 避免與其他第三方庫產(chǎn)生沖突!
? 5.修改緩存的讀取為異步讀取,不會阻塞主線程;
? 6.其他一些代碼優(yōu)化與修改.
? 2016.11.22(tag:0.4.0):
? 1.一次性判斷當前網(wǎng)絡狀態(tài)值更加準確;
? 2.添加手機網(wǎng)絡,WiFi的當前網(wǎng)絡狀態(tài).
? 2016.11.18(tag:0.3.1):
? 1.新增取消所有http請求;
? 2.新增取消指定URL請求 的方法.
? 2016.09.26(tag:0.3.0): 控制臺直接打印json中文字符,無需插件
? 2016.09.18(tag:0.2.5):?
? 1.支持單個頁面的多級數(shù)據(jù)緩存;
? 2.簡化網(wǎng)絡狀態(tài)監(jiān)測的方法調(diào)用
? 2016.09.12(tag:0.2.1): 小細節(jié)優(yōu)化
? 2016.09.10(tag:0.2.0): 增加網(wǎng)絡請求設置接口(詳情見:7.網(wǎng)絡參數(shù)設置)
? 2016.09.06(tag:0.1.2): 修復在無網(wǎng)絡進行下載時,會觸發(fā)下載成功回調(diào)的Bug.
? 2016.09.05(tag:0.1.1): 多個請求的情況下采取一個共享的AFHTTPSessionManager;
? 2016.08.26(tag:0.1.0): 初始化到CocoaPods;
```
## 聯(lián)系方式:
* Weibo : [@jkpang-龐](http://weibo.com/5743737098/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1)
*Email : jkpang@outlook.com
*QQ群 : 323408051
*Blog? : https://www.jkpang.cn
![PP-iOS學習交流群群二維碼](https://github.com/jkpang/PPCounter/blob/master/PP-iOS%E5%AD%A6%E4%B9%A0%E4%BA%A4%E6%B5%81%E7%BE%A4%E7%BE%A4%E4%BA%8C%E7%BB%B4%E7%A0%81.png)
##許可證
PPNetworkHelper 使用 MIT 許可證,詳情見 LICENSE 文件扣甲。