Alamofire是一個(gè)在Github上非常重要的Swift的網(wǎng)絡(luò)框架,有31K的Star.它在Apple的 URLSession基礎(chǔ)上提供了更加優(yōu)雅的接口來簡化繁重而常用的網(wǎng)絡(luò)請(qǐng)求任務(wù)。
Alamofire提供了鏈?zhǔn)降?code>request/response方法,JSON的傳參和響應(yīng)序列化,身份認(rèn)證和其他特性。

URLSession的使用
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print("請(qǐng)求成功\(String(describing: response))")
}
}.resume()
操作
-
URLSession.shared創(chuàng)建了session會(huì)話 -
dataTask根據(jù)url創(chuàng)建了一個(gè)網(wǎng)絡(luò)任務(wù) - 根據(jù)
dataTask進(jìn)行resume,調(diào)用執(zhí)行開始請(qǐng)求網(wǎng)絡(luò) - 通常我們還會(huì)設(shè)置
SessionConfiguration
URLSessionConfiguration
open class URLSessionConfiguration : NSObject, NSCopying {
open class var `default`: URLSessionConfiguration { get }
open class var ephemeral: URLSessionConfiguration { get }
@available(iOS 8.0, *)
open class func background(withIdentifier identifier: String) -> URLSessionConfiguration
}
三種模式
-
default:默認(rèn)模式,通常這種模式就足夠了。默認(rèn)模式會(huì)創(chuàng)建一個(gè)持久化的緩存并在用戶的鑰匙串中存儲(chǔ)證書。 -
ephemeral:系統(tǒng)沒有任何持久性存儲(chǔ),所有內(nèi)容的生命周期都與session相同。當(dāng)session失效時(shí),所有內(nèi)容釋放。
let configuration1 = URLSessionConfiguration.default
let configuration2 = URLSessionConfiguration.ephemeral
print("沙盒大小: \(String(describing: configuration1.urlCache?.diskCapacity))")
print("內(nèi)存大小: \(String(describing: configuration1.urlCache?.memoryCapacity))")
print("沙盒大小: \(String(describing: configuration2.urlCache?.diskCapacity))")
print("內(nèi)存大小: \(String(describing: configuration2.urlCache?.memoryCapacity))")
沙盒大小: Optional(10000000)
內(nèi)存大小: Optional(512000)
沙盒大小: Optional(0)
內(nèi)存大小: Optional(512000)
-
background:創(chuàng)建一個(gè)在后臺(tái)甚至App已經(jīng)關(guān)閉的時(shí)候仍在傳輸會(huì)話。
let configuration = URLSessionConfiguration.background(withIdentifier: self.createID())
let session = URLSession.init(configuration: configuration, delegate: self as? URLSessionDelegate, delegateQueue: OperationQueue.main)
session.downloadTask(with: url).resume()
后臺(tái)下載需要在AppDelegate中開啟權(quán)限
//用于保存后臺(tái)下載的completionHandler
var backgroundSessionCompletionHandler: (() -> Void)?
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
self.backgroundSessionCompletionHandler = completionHandler
}
系統(tǒng)回調(diào),告訴系統(tǒng)及時(shí)更新屏幕
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
print("后臺(tái)任務(wù)下載回來")
DispatchQueue.main.async {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let backgroundHandle = appDelegate.backgroundSessionCompletionHandler else { return }
backgroundHandle()
}
}
1. 常規(guī)屬性
identifier:配置對(duì)象的后臺(tái)會(huì)話標(biāo)識(shí)符。
httpAdditionalHeaders:與請(qǐng)求一起發(fā)送的附加頭文件的字典。
networkServiceType:網(wǎng)絡(luò)服務(wù)的類型
allowsCellularAccess:一個(gè)布爾值,用于確定是否應(yīng)通過蜂窩網(wǎng)絡(luò)進(jìn)行連接。
timeoutIntervalForRequest:等待其他數(shù)據(jù)時(shí)使用的超時(shí)間隔。
timeoutIntervalForResource:資源請(qǐng)求應(yīng)該允許的最大時(shí)間量。
sharedContainerIdentifier:應(yīng)該下載后臺(tái)URL會(huì)話中的文件的共享容器的標(biāo)識(shí)符。
waitsForConnectivity:一個(gè)布爾值,指示會(huì)話是否應(yīng)等待連接變?yōu)榭捎没蛘吡⒓词?/p>
2. 設(shè)置Cookie策略
httpCookieAcceptPolicy:決定何時(shí)應(yīng)該接受Cookie的策略常量
httpShouldSetCookies:一個(gè)布爾值,用于確定請(qǐng)求是否應(yīng)包含來自Cookie存儲(chǔ)的Cookie。
httpCookieStorage:管理cookie存儲(chǔ)的單一對(duì)象(共享實(shí)例)
HTTPCookie:表示HTTP cookie的對(duì)象。它是一個(gè)不可變的對(duì)象,從包含cookie屬性的字典中初始化
3. 設(shè)置安全策略
tlsMaximumSupportedProtocol:在此會(huì)話中進(jìn)行連接時(shí)客戶端應(yīng)請(qǐng)求的最大TLS協(xié)議版本。
tlsMinimumSupportedProtocol:協(xié)議協(xié)商期間應(yīng)該接受的最小TLS協(xié)議。
urlCredentialStorage:提供身份驗(yàn)證憑據(jù)的憑證存儲(chǔ)
4. 設(shè)置緩存策略
urlCache:用于向會(huì)話中的請(qǐng)求提供緩存響應(yīng)的URL緩存
requestCachePolicy:一個(gè)預(yù)定義常量,用于確定何時(shí)從緩存中返回響應(yīng)
5. 支持后臺(tái)轉(zhuǎn)移
sessionSendsLaunchEvents:一個(gè)布爾值,指示在傳輸完成時(shí)是否應(yīng)該在后臺(tái)繼續(xù)或啟動(dòng)應(yīng)用程序
isDiscretionary:一個(gè)布爾值,用于確定是否可以根據(jù)系統(tǒng)的判斷來調(diào)度后臺(tái)任務(wù)以獲得最佳性能。
6. 支持自定義協(xié)議
protocolClasses:在會(huì)話中處理請(qǐng)求的額外協(xié)議子類的數(shù)組
URLProtocol:一個(gè)NSURLProtocol對(duì)象處理加載協(xié)議特定的URL數(shù)據(jù)。在NSURLProtocol類本身是一個(gè)抽象類,可以為與特定URL方案的URL處理基礎(chǔ)設(shè)施。您可以為您的應(yīng)用支持的任何自定義協(xié)議或URL方案創(chuàng)建子類
7. 支持多路徑TCP
multipathServiceType:指定用于通過Wi-Fi和蜂窩接口傳輸數(shù)據(jù)的多路徑TCP連接策略的服務(wù)類型
URLSessionConfiguration.MultipathServiceType:指定多路徑TCP使用的服務(wù)類型的常量
8. 設(shè)置HTTP策略和代理屬性
httpMaximumConnectionsPerHost:同時(shí)連接到給定主機(jī)的最大數(shù)量。
httpShouldUsePipelining:一個(gè)布爾值,用于確定會(huì)話是否應(yīng)使用HTTP流水線
connectionProxyDictionary:包含有關(guān)在此會(huì)話中使用的代理信息的字典
9. 支持連接變化
waitsForConnectivity:一個(gè)布爾值,指示會(huì)話是否應(yīng)等待連接變?yōu)榭捎没蛘吡⒓词 ?/p>
10.NSURLRequestCachePolicy
NSURLRequestUseProtocolCachePolicy = 0: 默認(rèn)緩存策略
如果一個(gè)NSCachedURLResponse對(duì)于請(qǐng)求并不存在,數(shù)據(jù)將會(huì)從源端獲取。如果請(qǐng)求擁有一個(gè)緩存的響應(yīng),那么URL加載系統(tǒng)會(huì)檢查這個(gè)響應(yīng)來決定,如果它指定內(nèi)容必須重新生效的話。假如內(nèi)容必須重新生效,將建立一個(gè)連向源端的連接來查看內(nèi)容是否發(fā)生變化。假如內(nèi)容沒有變化,那么響應(yīng)就從本地緩存返回?cái)?shù)據(jù)。如果內(nèi)容變化了,那么數(shù)據(jù)將從源端獲取
NSURLRequestReloadIgnoringLocalCacheData = 1:URL應(yīng)該加載源端數(shù)據(jù),不使用本地緩存數(shù)據(jù)
NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4:本地緩存數(shù)據(jù)、代理和其他中介都要忽視他們的緩存,直接加載源數(shù)據(jù)
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
NSURLRequestReturnCacheDataElseLoad = 2:指定已存的緩存數(shù)據(jù)應(yīng)該用來響應(yīng)請(qǐng)求,不管它的生命時(shí)長和過期時(shí)間。如果在緩存中沒有已存數(shù)據(jù)來響應(yīng)請(qǐng)求的話,數(shù)據(jù)從源端加載
NSURLRequestReturnCacheDataDontLoad = 3:指定已存的緩存數(shù)據(jù)用來滿足請(qǐng)求,不管生命時(shí)長和過期時(shí)間。如果在緩存中沒有已存數(shù)據(jù)來響應(yīng)URL加載請(qǐng)求的話,不去嘗試從源段加載數(shù)據(jù),此時(shí)認(rèn)為加載請(qǐng)求失敗。這個(gè)常量指定了一個(gè)類似于離線模式的行為
NSURLRequestReloadRevalidatingCacheData = 5:指定如果已存的緩存數(shù)據(jù)被提供它的源段確認(rèn)為有效則允許使用緩存數(shù)據(jù)響應(yīng)請(qǐng)求,否則從源段加載數(shù)據(jù)。
是時(shí)候展現(xiàn)Alamofire的魅力
Alamofire.request(urlString)
.responseJSON { (response) in
print(response)
}
- 更為簡單的操作
- 鏈?zhǔn)秸Z法
- 直接傳
string -
json響應(yīng)