PPNetworkHelper調(diào)用和實現(xiàn)

![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 文件扣甲。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末篮赢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子琉挖,更是在濱河造成了極大的恐慌启泣,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件示辈,死亡現(xiàn)場離奇詭異寥茫,居然都是意外死亡,警方通過查閱死者的電腦和手機矾麻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門纱耻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人险耀,你說我怎么就攤上這事弄喘。” “怎么了甩牺?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵蘑志,是天一觀的道長。 經(jīng)常有香客問我贬派,道長卖漫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任赠群,我火速辦了婚禮,結果婚禮上旱幼,老公的妹妹穿的比我還像新娘查描。我一直安慰自己,他們只是感情好柏卤,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布冬三。 她就那樣靜靜地躺著,像睡著了一般缘缚。 火紅的嫁衣襯著肌膚如雪勾笆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天桥滨,我揣著相機與錄音窝爪,去河邊找鬼弛车。 笑死,一個胖子當著我的面吹牛蒲每,可吹牛的內(nèi)容都是我干的纷跛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼邀杏,長吁一口氣:“原來是場噩夢啊……” “哼贫奠!你這毒婦竟也來了?” 一聲冷哼從身側響起望蜡,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤唤崭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后脖律,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谢肾,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年状您,在試婚紗的時候發(fā)現(xiàn)自己被綠了勒叠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡膏孟,死狀恐怖眯分,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柒桑,我是刑警寧澤弊决,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站魁淳,受9級特大地震影響飘诗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜界逛,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一昆稿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧息拜,春花似錦溉潭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赞别,卻和暖如春畏陕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仿滔。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工惠毁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犹芹,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓仁讨,卻偏偏與公主長得像羽莺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洞豁,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盐固,服務發(fā)現(xiàn),斷路器丈挟,智...
    卡卡羅2017閱讀 134,626評論 18 139
  • AFHTTPRequestOperationManager 網(wǎng)絡傳輸協(xié)議UDP刁卜、TCP、Http曙咽、Socket蛔趴、X...
    Carden閱讀 4,326評論 0 12
  • 來不及傷心孝情、來不及自責、來不及懺悔洒嗤。方菲菲聽到護士溫柔的對她說:32床病人家屬麻煩你到收費大廳窗口繳費箫荡。護士的聲音...
    淺草櫻落閱讀 290評論 0 0
  • 導語:我在沒錢的時候最愿意做的事情便是去逛街,去看看那些我買不起貴我一臉血的東西渔隶,讓它們刺激一番后羔挡,我便如同打了雞...
    花未眠會幸福閱讀 556評論 2 4