基於iOS提供API實現上傳文件和斷點續傳的思路php
經常使用iOS第三方網路框架簡介git
AFNetworking(AFN)github
ASIHTTPRequest(ASI)編程
另一個經常使用框架數組
SSZipArchive緩存
Cocoa層(NSURL,Bonjour,Game Kit,WebKit)服務器
Core Foundation層(基於 C 的 CFNetwork 和 CFNetServices)網絡
OS層(基於 C 的 BSD socket)數據結構
Cocoa層:是最上層的基於OC的API,好比URL訪問,NSStream,Bonjour,GameKit等,這是大多數狀況下咱們經常使用的 API。Cocoa層是基於Core Foundation實現的併發
Core Foundation層:基於C語言的框架,由於直接使用socket須要更多的編程工做,因此蘋果對OS層的socket進行簡單的封裝以簡化編程任務。該層提供了CFNetwork和CFNetServices,其中CFNetwork又是基於CFStream和CFSocket
OS層:最底層的BSD socket提供了對網絡編程最大程度的控制,可是編程工做也是最多的。蘋果建議咱們使用Core Foundation及以上層的API進行編程。BSD是UNIX系統中通用的網絡接口,它不只支持各類不一樣的網絡類型,並且也是一種內部進程之間的通訊機制
AFN:
官方推薦的使用方法:爲一系列相關的請求定義一個HTTPClient,共用一個BaseURL。每次請求把URL中除BaseURL的Path部分作爲參數傳給HTTPClient的靜態方法,並註冊一個Block用於回調
基於NSURL,性能和穩定性略差
AFN只封裝了一些經常使用功能,知足基本需求,而直接忽略了不少擴展功能
針對JSON、XML、PList和Image四種數據結構封裝了各自處理器,開發者能夠把處理器註冊到操做隊列中,直接在回調方法中得到格式化之後的數據
ASI:
推薦使用方法:每個請求都由構造方法初始化一個(共享)實例,經過這個實例配置參數併發起請求。ASI最初使用delegate模式回調,在iOS SDK支持Block以後也提供了註冊Block的實例方法(注:ASI的Block不易使用)
基於CFNetwork,性能和穩定性略高
ASI的擴展功能很是豐富
ASI沒有針對任何數據類型作特別封裝,只是預留了各類接口和工具供開發者自行擴展
AFN適合邏輯簡單的應用,或者更適合開發資源尚不豐富的團隊,由於AFN的易用性要比ASI好不少,而這樣的應用(或團隊)對底層網絡控件的定製化要求也很是低。
ASI更適合已經發展了一段時間的應用,或者開發資源相對豐富的團隊,由於每每這些團隊(或他們的應用)已經積累了必定的經驗,不管是產品上仍是技術上的。需求複雜度就是在這種時候高起來,並且底層訂製的需求也愈來愈多,此時AFN就很難知足需求,須要犧牲必定的易用性,使用ASI做爲網絡底層控件。
下載地址
https://github.com/AFNetworking/AFNetworking
AFNetworking官網地址:
1. 將框架程序拖拽進項目
2. 添加iOS框架引用
SystemConfiguration.framework
MobileCoreServices.framework
3. 修改xxx-Prefix.pch文件
#import <MobileCoreServices/MobileCoreServices.h>
#import <SystemConfiguration/SystemConfiguration.h>
1. 創建NSURLRequest
建立GET、HEAD、PUT、DELETE方法請求
requestWithMethod:path:parameters:
建立POST方法請求
multipartFormRequestWithMethod:path:parameters: constructingBodyWithBlock:
2. 檢測網路鏈接狀態
setReachabilityStatusChangeBlock
AFHttpRequestOperation HTTP請求操做
AFJSONRequestOperation 對JSON請求的封裝
AFXMLRequestOperation 對XML請求的封裝
AFPropertyListRequestOperation 對Plist請求的封裝
AFImageRequestOperation 對圖像請求的封裝
塊代碼操做
setCompletionBlockWithSuccess 設置請求完成塊代碼
setUploadProgressBlock 設置上傳進度塊代碼
setDownloadProgressBlock 設置下載進度塊代碼
下載操做須要設置outputStream
針對請求的操做pause(暫停)resume(繼續)
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://www.baidu.com"]];
[client setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
}];
AFJSONRequestOperation *op = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"%@", JSON);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"%@", JSON);
}];
NSURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:@"/~liufan9/itcast/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:imageData name:@"file" fileName:@"update.png" mimeType:@"image/png"];
}];
// 定義操做
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];
// 設置上傳
// 設置下載進度
下載地址:https://github.com/samsoffes/ssziparchive
注意:須要引入libz.dylib框架
// Unzipping
NSString *zipPath = @"path_to_your_zip_file";
NSString *destinationPath = @"path_to_the_folder_where_you_want_it_unzipped";
[SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath];
// Zipping
NSString *zippedPath = @"path_where_you_want_the_file_created";
NSArray *inputPaths = [NSArray arrayWithObjects:
[[NSBundle mainBundle] pathForResource:@"photo1" ofType:@"jpg"],
[[NSBundle mainBundle] pathForResource:@"photo2" ofType:@"jpg"]
nil];
[SSZipArchive createZipFileAtPath:zippedPath withFilesAtPaths:inputPaths];
使用ASI的兩點注意事項
ASI框架是不支持ARC的
ASI框架是基於iOS5.0的,若是選擇iOS6.0會有一些蘋果官方再也不維護的方法
// 1. 指定下載文件地址
NSString *string = @"http://localhost/~liufan9/itcast/download/iTunesConnect_DeveloperGuide_CN.zip";
NSURL *url = [NSURL URLWithString:string];
// 2. 設定文件保存路徑及緩存路徑
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *downloadPath = [documents[0]stringByAppendingPathComponent:@"book.zip"];
NSString *tempPath = [documents[0]stringByAppendingPathComponent:@"book.tmp"];
// 3. 建立ASIHTTPRequest
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 4. 設置代理——ASI是經過代理回調的方式處理網絡請求的
[request setDelegate:self];
// 5. 設置下載路徑
[request setDownloadDestinationPath:downloadPath];
// 6. 設置緩存路徑
[request setTemporaryFileDownloadPath:tempPath];
// 7. 設置斷點續傳
[request setAllowResumeForFileDownloads:YES];
// 8. 設置下載進程代理
[request setDownloadProgressDelegate:self];
// 9. 啓動異步請求——用戶想知道下載的實際進展狀況
[request start];
// 服務器開始返回數據
(void)connection:didReceiveResponse:
// 收到服務器返回的數據,本方法會被調用屢次
- (void)connection:didReceiveData:
// 數據接收完畢
(void)connectionDidFinishLoading:
// 網絡鏈接錯誤
- (void)connection:didFailWithError:
// 發送數據給服務器,POST 請求使用此方法
- (void)connection:didSendBodyData:totalBytesWritten: totalBytesExpectedToWrite:
// 請求開始
- (void)requestStarted:(ASIHTTPRequest *)request
// 請求接收到響應的頭部,包括文件大小信息
- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders
// 請求完成
- (void)requestFinished:(ASIHTTPRequest *)request
// 請求失敗
- (void)requestFailed:(ASIHTTPRequest *)request
對比結果:
ASIRequest不須要處理中間數據
可是請求開始拆分紅了兩部分
ASIHTTPRequestDelegate
ASIProgressDelegate
下載地址:https://github.com/samsoffes/ssziparchive
注意:須要引入libz.dylib框架
// Unzipping
NSString *zipPath = @"path_to_your_zip_file";
NSString *destinationPath = @"path_to_the_folder_where_you_want_it_unzipped";
[SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath];
// Zipping
NSString *zippedPath = @"path_where_you_want_the_file_created";
NSArray *inputPaths = [NSArray arrayWithObjects:
[[NSBundle mainBundle] pathForResource:@"photo1" ofType:@"jpg"],
[[NSBundle mainBundle] pathForResource:@"photo2" ofType:@"jpg"]
nil];
[SSZipArchive createZipFileAtPath:zippedPath withFilesAtPaths:inputPaths];
NSLog(@"請求完成");
// 需求:
// 1. 知道文件保存路徑(運行,發現文件已經下載完成了)
// 2. 解壓縮文件(導入SSZipArchive框架)
// 根據SSZipArchive框架用法寫思路
// 2.1 設置壓縮文件路徑
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *downloadPath = [documents[0]stringByAppendingPathComponent:@"book.zip"];
// 2.2 設置解壓縮文件路徑,保存在當前路徑
NSString *unzipPath = documents[0];
// 2.3 解壓縮
[SSZipArchive unzipFileAtPath:downloadPath toDestination:unzipPath];
// 3. 刪除壓縮文件
[[NSFileManager defaultManager]removeItemAtPath:downloadPath error:nil];
ASIProgressDelegate——setProgress
#pragma mark - 下載進度代理方法
- (void)setProgress:(float)newProgress
{
// 經過Log發現傳入的是一個百分比的數組
// 如今須要一個文件大小,並提示用戶文件的大小
NSLog(@"%f", newProgress);
}
1. ASIRequest響應頭部的代碼實現
// 1. NSLOG看看頭部是什麼內容
NSLog(@"%@", responseHeaders);
// 2. 發現其中有一個"Content-Length" = 6105204;
// 貌似是和文件下載進度有關的工做能夠在這裏進行
// 將文件大小轉換成M爲單位 字節-K-M
_fileLength = request.contentLength / 1024.0 / 1024.0;
NSLog(@"%.2fM", _fileLength);
2. setProgress方法
NSLog(@"%.2f", newProgress * _fileLength);