AFNetworking說明書

圖片來之網(wǎng)絡(luò)

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)在的選擇。

怎么開始

交流

  • 如果你需要幫助,使用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 RaymondMattt 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。


類說明


協(xié)議說明


擴(kuò)展說明


常量說明


// END 2017年7月18日 中午

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 繼承:NSObject 遵照:NSCopying,NSSecureCoding,NSURLSessionDataD...
    _阿南_閱讀 2,010評論 1 2
  • 呵呵噠,一直想全面的了解下AFN。并聽說AFN的代碼是標(biāo)準(zhǔn)的MVC模式編寫的。同時也是對網(wǎng)絡(luò)的熟悉吧。所以試著查看...
    蝴蝶之夢天使閱讀 382評論 0 3
  • 1.官網(wǎng)文檔外加點中文注釋AFNetworking官網(wǎng)(點擊進(jìn)入) AFNetworking翻譯注釋Archite...
    小名一峰閱讀 3,869評論 5 25
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • 二、 詳細(xì)介紹 1. AFNetworking 這是 AFNetworking 的主要部分,包括 6 個功能部分共...
    隨風(fēng)飄蕩的小逗逼閱讀 4,533評論 0 2

友情鏈接更多精彩內(nèi)容