AFNetworking是為iOS和Mac OS X系統(tǒng)提供的一個簡單方便的網(wǎng)絡庫扮叨。它是建立在基礎URL加載系統(tǒng)沉桌,擴展為非常高級的網(wǎng)絡抽象,成為Cocoa的組成部分浴滴。它有一個設計完美的模塊化架構(gòu)拓萌,有個很多方便使用并功能多樣的接口。也許最重要的特色升略,無論如何微王,應該是為每天使用AFNetworking或給AFNetworking提供幫助的開發(fā)者提供令人驚喜的社區(qū)屡限。AFNetworking在iPhone,iPad和Mac上被一些最受歡迎和受人好評的應用使用炕倘。
在你的下一個項目或移植你的當前項目選擇使用AFNetworking钧大,你將會非常高興你現(xiàn)在的選擇。
怎么開始
- 下載AFNetworking和試用其中包含的Mac和iPhone的樣例應用
- 閱讀[“開始”指南](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking ""開始"指南")罩旋,FAQ或其他在wiki上的文章
- 看看關于AFNetworking全面的接口的文檔
- 閱讀從2.0到3.0架構(gòu)改變的AFNetworking 3.0 遷移指南
交流
- 如果你需要幫助啊央,使用Stack Overflow。(標簽‘a(chǎn)fnetworking’)
- 如果你想問問題涨醋,使用Stack Overflow瓜饥。
- 如果你發(fā)現(xiàn)bug并且能夠提供重現(xiàn)的步驟,請新開一個issue浴骂。
- 如果你有一個新特性請求乓土,請新開一個issue。
- 如果你想為AFNetworking添磚加瓦溯警,請?zhí)峤灰粋€pull請求趣苏。
安裝
在工程中使用AFNetworking庫,AFNetworking提供了多種安裝方法梯轻。
PODFILE
使用CocoaPods繼承AFNetworking到你的Xcode工程中拦键,在你的Podfile中添加以下內(nèi)容:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
pod 'AFNetworking', '~> 3.0'
然后,執(zhí)行以下命令:
pod install
要求
AFNetworking版本 | iOS最低版本 | OS X最低版本 | watchOS最低版本 | tvOS最低版本 | 注意 |
---|---|---|---|---|---|
3.x | iOS 7 | OSX 10.9 | watchOS 2.0 | tvOS 9.0 | 必須使用Xcode7及以上.NSURLConnectionOperation已經(jīng)移除 |
2.6->2.6.3 | iOS 7 | OS X 10.9 | watchOS 2.0 | n/a | 必須使用Xcode7及以上 |
2.0->2.5.4 | iOS 6 | OS X10.8 | n/a | n/a | 必須使用Xcode5及以上檩淋。NSURLSession需要iOS 7 或 OS X10.9 |
1.x | iOS 5 | Mac OS X 10.7 | n/a | n/a | 無 |
0.10.x | iOS 4 | Mac OS X 10.6 | n/a | n/a | 無 |
(OS X必須支持64位的Cocoa runtime)如果項目是使用Swift編寫,請嘗試使用Alamofire.
架構(gòu)
NSURLSession
- AFURLSessionManager
- AFHTTPSessionManager
序列化
<AFURLRequestSerialization>
- AFHTTPRequestSerializer
- AFJSONRequestSerializer
- AFPropertyListRequestSerializer
<AFURLResponseSerialization>
- AFHTTPResponseSerializer
- AFJSONResponseSerializer
- AFXMLParserResponseSerializer
- AFXMLDocumentResponseSerializer (Mac OS X)
- AFPropertyListResponseSerializer
- AFImageResponseSerializer
- AFCompoundResponseSerializer
額外方法
- AFSecurityPolicy
- AFNetworkReachabilityManager
使用
AFURLSessionManager
AFURLSessionManager創(chuàng)建和管理一個在NSURLSeesionConfigutarion對象基礎上的NSURLSession對象萄金,并遵循<NSURLSessionTaskDelegate>蟀悦,<NSURLSessionDataDelegate>,<NSURLSessionDownloadDelegate>和 <NSURLSessionDelegate>協(xié)議氧敢。
創(chuàng)建一個下載任務
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];
創(chuàng)建一個上傳任務
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"Success: %@ %@", response, responseObject);
}
}];
[uploadTask resume];
創(chuàng)建一個上傳多重部分請求的任務日戈,并顯示上傳進度
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil];
} error:nil];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
uploadTaskWithStreamedRequest:request
progress:^(NSProgress * _Nonnull uploadProgress) {
// This is not called back on the main queue.
// You are responsible for dispatching to the main queue for UI updates
dispatch_async(dispatch_get_main_queue(), ^{
//Update the progress view
[progressView setProgress:uploadProgress.fractionCompleted];
});
}
completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"%@ %@", response, responseObject);
}
}];
[uploadTask resume];
創(chuàng)建一個獲取數(shù)據(jù)的任務
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://httpbin.org/get"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"%@ %@", response, responseObject);
}
}];
[dataTask resume];
請求序列化
請求序列化從URL字符串創(chuàng)建請求,編碼參數(shù)成為一個查詢字符串或HTTP內(nèi)容孙乖。
NSString *URLString = @"http://example.com";
NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]};
查詢字符串參數(shù)編碼
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil];
編碼后為
GET http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3
URL格式參數(shù)編碼
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];
編碼后為
POST http://example.com/
Content-Type: application/x-www-form-urlencoded
foo=bar&baz[]=1&baz[]=2&baz[]=3
JSON參數(shù)編碼
[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];
編碼后為
POST http://example.com/
Content-Type: application/json
{"foo": "bar", "baz": [1,2,3]}
網(wǎng)絡可達性管理
AFNetworkReachabilityManager監(jiān)控域和IP地址通過WWAN和WiFi網(wǎng)絡是否可達浙炼。
- 不要使用可達性去判斷原始請求是否需要發(fā)送。(應該嘗試的發(fā)送)
- 你可以使用可達性去判斷唯袄,一個請求是否應該自動重發(fā)弯屈。(雖然它可能仍然失敗,但是收到網(wǎng)絡連接可用的可達性通知后恋拷,非常合適再去重試發(fā)送)
- 網(wǎng)絡可達性是判斷一個請求失敗的原因的最好工具资厉。(當一個網(wǎng)絡請求失敗后,告訴用戶已經(jīng)離線了比顯示一個比如“請求超時”的技術(shù)信息好蔬顾,所以提示很正確)
你也可以看WWDC 2012 706講 “網(wǎng)絡最好實踐”.
共享的網(wǎng)絡可達性
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
安全策略
AFSecurityPolicy通過X.509證書和公共密鑰安全連接宴偿,來評估服務器的可靠性湘捎。
添加固定的SSL證書到你的應用中,幫忙保護中間人攻擊和其他弱點窄刘。應用處理敏感的用戶數(shù)據(jù)或財務信息窥妇,強烈建議所有的通訊通過SSL固定證書并且已經(jīng)使能的HTTPS鏈接。
允許無效的SSL證書
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.securityPolicy.allowInvalidCertificates = YES; // not recommended for production
單元測試
AFNetworking在Tests子目錄中包含一系列的單元測試娩践。這些單元測試可以很方便的運行活翩,你會喜歡在framework平臺上可以執(zhí)行測試事件。
信用
Alamofire軟件基金會擁有和維護AFNetworking欺矫。
GowallaiPhone開發(fā)部門的Scott Raymond和Mattt Thompson創(chuàng)建了最初的AFNetworking版本纱新。
Alan Defibaugh設計了AFNetworking的圖標。
總之穆趴,感謝AFNetworking的貢獻者.
安全公開
如果你確信你已經(jīng)鑒定AFNetworking存在安全缺陷脸爱,請盡快的發(fā)送通過郵件發(fā)送到security@alamofire.org. 請不要將它發(fā)送為一個公開的問題跟蹤。
許可證
AFNetworking遵守MIT許可證未妹。詳見LICENSE簿废。
類說明
- AFAutoPurgingImageCache
- AFCompoundResponseSerializer
- AFHTTPRequestSerializer
- AFHTTPResponseSerializer
- AFHTTPSessionManager
- AFImageDownloadReceipt
- AFImageDownloader
- AFImageResponseSerializer
- AFJSONRequestSerializer
- AFJSONResponseSerializer
- AFNetworkActivityIndicatorManager
- AFNetworkReachabilityManager
- AFPropertyListRequestSerializer
- AFSecurityPolicy
- AFURLSessionManager
- AFXMLDocumentResponseSerializer
- AFXMLParserResponseSerializer
協(xié)議說明
- AFImageCache
- AFImageRequestCache
- AFMultipartFormData
- AFURLRequestSerialization
- AFURLResponseSerialization
擴展說明
- UIActivityIndicatorView(AFNetworking)
- UIButton(AFNetworking)
- UIImage(AFNetworking)
- UIImageView(AFNetworking)
- UIProgressView(AFNetworking)
- UIRefreshControl(AFNetworking)
- UIWebview(AFNetworking)
常量說明
- AFHTTPRequestQueryStringSerializationStyle
- AFImageDownloadPrioritization
- AFNetworkReachabilityStatus
- AFSSLPinningMode
// END 2017年7月18日 中午