源碼閱讀學習:
參考源碼解讀:http://www.lxweimin.com/p/c36159094e24
底層原理分析:
- AFNetWorking是對NSURLSession的封裝
- AFHTTPRequestOperationManager :內部封裝的是 NSUrlConnection,負責發送網絡請求,使用最多的一個類.(3.0廢棄)
- AFHTTPSessionManager :內部封裝是 NSUrlSession ,負責發送網絡請求,使用最多的一個類.
- AFHTTPRequestOperationManager 和 AFHTTPSessionManager :定義的 API(方法名稱)是一模一樣,沒有任何區別.
- AFNetworkReachabilityManager :實時監測網絡狀態的工具類.當前的網絡環境發生改變之后,這個工具類就可以檢測到.
- AFSecurityPolicy :網絡安全的工具類, 主要是針對 HTTPS 服務.
- AFURLRequestSerialization :序列化工具類,基類.上傳的數據轉換成JSON格式(AFJSONRequestSerializer).使用不多.
- AFURLResponseSerialization :反序列化工具類;基類.使用比較多:
AFJSONResponseSerializer; JSON解析器,默認的解析器. - AFHTTPResponseSerializer; 萬能解析器; JSON和XML之外的數據類型,直接返回二進制數據.對服務器返回的數據不做任何處理.
AFXMLParserResponseSerializer; XML解析器;
AFM默認超時時長是:60秒
斷點續傳:
- 檢查服務器文件信息
- 檢查本地文件
- 如果本地比服務器文件小,斷點續傳,利用HTTP請求頭的Range實現斷點續傳
- 如果比服務器文件大,重新下載
- 大小一致,下載完成
文檔參考
AFNetworking Docs
Apple - URL Session Programming Guide
由 NSURLConnection 轉為 NSURLSession 了;
使用 session task 來進行數據請求;
代碼結構
AFHTTPSessionManager :AFURLSessionManager
默認使用request與response的序列化方式是: HTTP Serializer與JSON Serializer,用于在POST multipart時候使用;//發送及接收數據前的處理;
是對NSURLSession的封裝處理,提供設置回調函數接口;
處理session的delegate,處理session task的delegate;
how to use AFHTTPSessionManager?
GET --> create NSURLSessionDataTask -> dataTask resumeSecurityPolicy
AFSecurityPolicy
evaluates server trust against pinned X.509 certificates and public keys over secure connections.
使用 Security系統庫
用于HTTPS的secure連接請求;
判斷請求的證書是否可信;分為 證書/公鑰 兩種:
AFSSLPinningModePublicKey 、AFSSLPinningModeCertificate
evaluateServerTrust 流程:
讀取本地公鑰的key文件;
提取pulickey 或者 certificate 信息;
檢查域名有效,創建policy,檢測server是否值得信任;
如果是None模式:檢測證書可信性;
如果是證書模式:檢測證書是否與設置過的相匹配;
如果是公鑰模式:提取發送過來的公鑰,檢查是否與本地的key有相同的,如果有相同就返回YES;
--> 驗證證書成功后,URLSession會使用證書進行下一步通信處理;Reachability
是對系統SystemConfiguration庫中的SCNetWorkReachability的封裝;
提供監聽網絡狀態,判斷網絡是否連接的接口;
設計:將網絡狀態轉換為wifi與wwan兩種形式,并對網絡變化提供消息通知處理;
在main loop中,schedule一個任務,用于網絡狀態監控;
網絡狀態變化,發送通知消息;
區分ipv4/ipv6的參數創建;Request/Response Serializer
根據不同子類的serializer實現,對請求數據進行重新組織,行程字典格式或者json格式等參數內容;
對請求數據進行處理,編碼
對請求的header及類型等http信息就行處理
multipart請求的處理(要上傳文件需要使用)
Response serializer對返回數據進行解析(JSON/XML/PropertyList/Image/Compound)處理,檢查有效性并提取數據進行分裝;
example 示例 使用結構設計:
model模塊,負責請求及處理數據
controller模塊,負責控制view顯示數據及協議實現,用戶交互
view模塊,負責顯示數據UIWebView+AFNetworking
UIWebView 類別,使用了runtime
一個運行時屬性變量,使用了objc_set/getAssociateObject對屬性進行讀寫;
一個session manager屬性變量,也使用運行時函數進行讀寫;//使用了dispatch_once創建靜態變量
二個load request函數
__weak __typeof(self) weakSelf = self;
session請求的返回及狀態進度都是用代理模式處理;
每一個session task對應一個delegate;get 請求流程
使用request serializer創建一個NSMutableURLRequest(設置NSURLRequest的參數及header,httpbody信息);
使用NSURLRequest創建一個NSURLSessionDataTask(創建一個session task,設置delegate函數實現,根據task的identify存儲對應的delegate對象);
處理NSURLSession相關的delegate函數,調用task對應的代理對象對返回數據、錯誤、進度等信息進行回調處理;data task 創建流程
POST data task:
- 使用request searializer 創建post的 NSURLRequest;
- NSURLSession 調用 uploadTaskWithStreamedRequest 創建 NSURLSessionUploadTask;
- 給task添加對應的delegate并存到到字典中,用于task狀態返回的處理;
- task resume 開始執行task;
NSURLSesssion task種類
data task:
upload task:
download task:后臺下載機制如何使用?
當應用退出后,崩潰或者進程被關掉還是會運行;
使用后臺session配置,[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier];
在NSURLSessionDownloadDelegate的didFinsh函數中,移動臨時目錄文件到應用的存儲中;
使用相關技術
單例 dispatch_once
Core Foundation 使用,需要手動retain與release管理;
background task
runtime method swizzle
NSOperationQueue
遞歸鎖 NSRecursiveLock
信號量 dispatch_semphore_t (signal +1, wait -1);
手動調用KVO通知,KVO的依賴
消息通知