
AFNetworking是為iOS和Mac OS X系統(tǒng)提供的一個簡單方便的網(wǎng)絡(luò)庫。它是建立在基礎(chǔ)URL加載系統(tǒng),擴(kuò)展為非常高級的網(wǎng)絡(luò)抽象,成為Cocoa的組成部分。它有一個設(shè)計完美的模塊化架構(gòu),有個很多方便使用并功能多樣的接口。也許最重要的特色,無論如何,應(yīng)該是為每天使用AFNetworking或給AFNetworking提供幫助的開發(fā)者提供令人驚喜的社區(qū)。AFNetworking在iPhone,iPad和Mac上被一些最受歡迎和受人好評的應(yīng)用使用。
在你的下一個項目或移植你的當(dāng)前項目選擇使用AFNetworking,你將會非常高興你現(xiàn)在的選擇。
怎么開始
- 下載AFNetworking和試用其中包含的Mac和iPhone的樣例應(yīng)用
- 閱讀[“開始”指南](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking ""開始"指南"),FAQ或其他在wiki上的文章
- 看看關(guān)于AFNetworking全面的接口的文檔
- 閱讀從2.0到3.0架構(gòu)改變的AFNetworking 3.0 遷移指南
交流
- 如果你需要幫助,使用Stack Overflow。(標(biāo)簽‘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對象基礎(chǔ)上的NSURLSession對象,并遵循<NSURLSessionTaskDelegate>,<NSURLSessionDataDelegate>,<NSURLSessionDownloadDelegate>和 <NSURLSessionDelegate>協(xié)議。
創(chuàng)建一個下載任務(wù)
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)建一個上傳任務(wù)
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)建一個上傳多重部分請求的任務(wù),并顯示上傳進(jìn)度
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ù)的任務(wù)
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)絡(luò)可達(dá)性管理
AFNetworkReachabilityManager監(jiān)控域和IP地址通過WWAN和WiFi網(wǎng)絡(luò)是否可達(dá)。
- 不要使用可達(dá)性去判斷原始請求是否需要發(fā)送。(應(yīng)該嘗試的發(fā)送)
- 你可以使用可達(dá)性去判斷,一個請求是否應(yīng)該自動重發(fā)。(雖然它可能仍然失敗,但是收到網(wǎng)絡(luò)連接可用的可達(dá)性通知后,非常合適再去重試發(fā)送)
- 網(wǎng)絡(luò)可達(dá)性是判斷一個請求失敗的原因的最好工具。(當(dāng)一個網(wǎng)絡(luò)請求失敗后,告訴用戶已經(jīng)離線了比顯示一個比如“請求超時”的技術(shù)信息好,所以提示很正確)
你也可以看WWDC 2012 706講 “網(wǎng)絡(luò)最好實踐”.
共享的網(wǎng)絡(luò)可達(dá)性
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
安全策略
AFSecurityPolicy通過X.509證書和公共密鑰安全連接,來評估服務(wù)器的可靠性。
添加固定的SSL證書到你的應(yīng)用中,幫忙保護(hù)中間人攻擊和其他弱點。應(yīng)用處理敏感的用戶數(shù)據(jù)或財務(wù)信息,強烈建議所有的通訊通過SSL固定證書并且已經(jīng)使能的HTTPS鏈接。
允許無效的SSL證書
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.securityPolicy.allowInvalidCertificates = YES; // not recommended for production
單元測試
AFNetworking在Tests子目錄中包含一系列的單元測試。這些單元測試可以很方便的運行,你會喜歡在framework平臺上可以執(zhí)行測試事件。
信用
Alamofire軟件基金會擁有和維護(hù)AFNetworking。
GowallaiPhone開發(fā)部門的Scott Raymond和Mattt Thompson創(chuàng)建了最初的AFNetworking版本。
Alan Defibaugh設(shè)計了AFNetworking的圖標(biāo)。
總之,感謝AFNetworking的貢獻(xiàn)者.
安全公開
如果你確信你已經(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
擴(kuò)展說明
- UIActivityIndicatorView(AFNetworking)
- UIButton(AFNetworking)
- UIImage(AFNetworking)
- UIImageView(AFNetworking)
- UIProgressView(AFNetworking)
- UIRefreshControl(AFNetworking)
- UIWebview(AFNetworking)
常量說明
- AFHTTPRequestQueryStringSerializationStyle
- AFImageDownloadPrioritization
- AFNetworkReachabilityStatus
- AFSSLPinningMode
// END 2017年7月18日 中午