NSURLRequest
概述
NSURLRequest封裝了加載請(qǐng)求的兩個(gè)基本數(shù)據(jù)元素:要加載的URL,以及在查詢實(shí)現(xiàn)提供的URL內(nèi)容緩存時(shí)要使用的策略倦沧。
重要的
這個(gè)類只用于封裝關(guān)于URL請(qǐng)求的信息呈宇。您必須使用其他類(如URLSession)將這些請(qǐng)求發(fā)送到服務(wù)器涂滴。
NSURLRequest被設(shè)計(jì)成通過創(chuàng)建擴(kuò)展來支持其他協(xié)議胆建,這些擴(kuò)展為您自己的特定于協(xié)議的屬性提供訪問器方法街州。這些方法可以通過調(diào)用URLProtocol methods屬性(forKey:in:)和setProperty(_:forKey:in:)來獲取和設(shè)置實(shí)際值兼丰。
NSURLRequest的可變子類是NSMutableURLRequest。
重要的
Foundation框架的Swift覆蓋提供了URLRequest結(jié)構(gòu)唆缴,它連接到NSURLRequest類及其可變子類NSMutableURLRequest鳍征。
UIWebView
在應(yīng)用程序中嵌入web內(nèi)容的視圖。
SDK ? 在iOS 2.0 - -12.0棄用
框架 ??UIKit
請(qǐng)注意
在iOS 8及以后運(yùn)行的應(yīng)用程序中面徽,使用WKWebView類而不是使用UIWebView艳丛。此外,如果呈現(xiàn)不應(yīng)該運(yùn)行JavaScript的文件,請(qǐng)考慮將WKPreferences屬性JavaScript設(shè)置為false氮双。
WKWebView
顯示交互式web內(nèi)容的對(duì)象旺聚,如應(yīng)用程序內(nèi)的瀏覽器。
SDK ? 在 iOS?8.0+????macOS 10.10 +?使用
框架 ??WebKit
重要的
從iOS 8.0和OS X 10.10開始眶蕉,使用WKWebView向應(yīng)用中添加web內(nèi)容砰粹。不要使用UIWebView或WebView。
您可以使用WKWebView類在應(yīng)用程序中嵌入web內(nèi)容造挽。為此碱璃,創(chuàng)建一個(gè)WKWebView對(duì)象,將其設(shè)置為視圖饭入,并發(fā)送一個(gè)請(qǐng)求來加載web內(nèi)容嵌器。
請(qǐng)注意
您可以在WKWebView中使用httpBody內(nèi)容發(fā)出POST請(qǐng)求。
在使用init(frame:configuration:)方法創(chuàng)建一個(gè)新的WKWebView對(duì)象之后谐丢,需要加載web內(nèi)容爽航。使用loadHTMLString(_:baseURL:)方法開始加載本地HTML文件或load(_:)方法開始加載web內(nèi)容。使用stopLoading()方法停止加載乾忱,使用isLoading屬性確定web視圖是否正在加載讥珍。將委托屬性設(shè)置為符合WKUIDelegate協(xié)議的對(duì)象,以跟蹤web內(nèi)容的加載窄瘟。參見清單1以編程方式創(chuàng)建WKWebView的示例衷佃。
清單1
以編程方式創(chuàng)建一個(gè)WKWebView
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
? ? var webView: WKWebView!
? ??? ? override func loadView() {
? ? ? ? let webConfiguration = WKWebViewConfiguration()
? ? ? ? webView = WKWebView(frame: .zero, configuration: webConfiguration)
? ? ? ? webView.uiDelegate = self
? ? ? ? view = webView
? ? }
? ? override func viewDidLoad() {
? ? ? ? super.viewDidLoad()
? ? ? ? let myURL = URL(string:ps://www.apple.com")
? ? ? ? let myRequest = URLRequest(url: myURL!)
? ? ? ? webView.load(myRequest)
? ? }}
要允許用戶在頁面歷史中前后移動(dòng),可以使用goBack()和goForward()方法作為按鈕的操作蹄葱。使用canGoBack和canGoForward屬性氏义,在用戶無法朝某個(gè)方向移動(dòng)時(shí)禁用按鈕。
默認(rèn)情況下图云,web view會(huì)自動(dòng)將出現(xiàn)在web內(nèi)容中的電話號(hào)碼轉(zhuǎn)換為電話鏈接惯悠。當(dāng)一個(gè)電話連接被監(jiān)聽時(shí),手機(jī)應(yīng)用程序就會(huì)啟動(dòng)并撥通號(hào)碼竣况。要關(guān)閉此默認(rèn)行為克婶,請(qǐng)使用不包含phoneNumber標(biāo)志的WKDataDetectorTypes位字段設(shè)置datadectortypes屬性。
還可以使用set放大率(_:centeredAt:)在web內(nèi)容第一次顯示在web視圖中時(shí)以編程方式設(shè)置它的比例帕翻。之后鸠补,用戶可以使用手勢(shì)來改變縮放比例萝风。
URLSession
協(xié)調(diào)一組相關(guān)網(wǎng)絡(luò)數(shù)據(jù)傳輸任務(wù)的對(duì)象嘀掸。
SDK ? 在 iOS 7.0 + ? ? ? macOS 10.9 + ? ????tvo 9.0 + ? ?????watchOS 2.0 +?使用
概述
URLSession類和相關(guān)類為下載內(nèi)容提供了一個(gè)API。這個(gè)API為支持身份驗(yàn)證提供了一組豐富的委托方法规惰,并使應(yīng)用程序能夠在應(yīng)用程序不運(yùn)行時(shí)執(zhí)行后臺(tái)下載睬塌,或者在iOS中,當(dāng)應(yīng)用程序暫停時(shí)執(zhí)行后臺(tái)下載。
重要的
URLSession API涉及到許多不同的類揩晴,它們以一種相當(dāng)復(fù)雜的方式協(xié)同工作勋陪,如果您自己閱讀參考文檔,這可能并不明顯硫兰。在使用此API之前诅愚,您應(yīng)該閱讀URL加載系統(tǒng)主題的概述。第一步部分中的文章提供了使用URLSession執(zhí)行常見任務(wù)的示例劫映。
使用URLSession API违孝,您的應(yīng)用程序創(chuàng)建一個(gè)或多個(gè)會(huì)話,每個(gè)會(huì)話協(xié)調(diào)一組相關(guān)的數(shù)據(jù)傳輸任務(wù)泳赋。例如雌桑,如果您正在創(chuàng)建一個(gè)web瀏覽器,您的應(yīng)用程序可能會(huì)為每個(gè)選項(xiàng)卡或窗口創(chuàng)建一個(gè)會(huì)話祖今,或者一個(gè)會(huì)話用于交互式使用校坑,另一個(gè)會(huì)話用于后臺(tái)下載。在每個(gè)會(huì)話中千诬,您的應(yīng)用程序添加一系列任務(wù)耍目,每個(gè)任務(wù)表示對(duì)特定URL的請(qǐng)求(如果需要,遵循HTTP重定向)徐绑。
類型的URL會(huì)話
給定URL會(huì)話中的任務(wù)共享一個(gè)公共會(huì)話配置對(duì)象制妄,該對(duì)象定義了連接行為,例如對(duì)單個(gè)主機(jī)進(jìn)行的最大同時(shí)連接數(shù)量泵三,是否允許通過蜂窩網(wǎng)絡(luò)進(jìn)行連接耕捞,等等。
URLSession有一個(gè)用于基本請(qǐng)求的單例共享會(huì)話(它沒有配置對(duì)象)烫幕。它不像您創(chuàng)建的會(huì)話那樣可定制俺抽,但如果您有非常有限的需求,它是一個(gè)很好的起點(diǎn)较曼。通過調(diào)用共享類方法訪問此會(huì)話磷斧。對(duì)于其他類型的會(huì)話,您使用以下三種配置之一實(shí)例化URLSession:
默認(rèn)會(huì)話的行為類似于共享會(huì)話捷犹,但允許進(jìn)行更多配置弛饭,并允許您使用委托增量地獲取數(shù)據(jù)。
短暫的會(huì)話與共享會(huì)話類似萍歉,但是不要向磁盤寫入緩存侣颂、cookie或憑據(jù)。
后臺(tái)會(huì)話允許您在應(yīng)用程序不運(yùn)行時(shí)在后臺(tái)執(zhí)行內(nèi)容的上傳和下載枪孩。
有關(guān)創(chuàng)建每種配置類型的詳細(xì)信息憔晒,請(qǐng)參見在URLSessionConfiguration類中創(chuàng)建會(huì)話配置對(duì)象藻肄。
URL會(huì)話任務(wù)的類型
在會(huì)話中,您可以創(chuàng)建任務(wù)拒担,可選地將數(shù)據(jù)上載到服務(wù)器嘹屯,然后以磁盤上的文件或內(nèi)存中的一個(gè)或多個(gè)NSData對(duì)象的形式從服務(wù)器檢索數(shù)據(jù)。URLSession API提供了三種類型的任務(wù):
數(shù)據(jù)任務(wù)使用NSData對(duì)象發(fā)送和接收數(shù)據(jù)从撼。數(shù)據(jù)任務(wù)是用于向服務(wù)器發(fā)出簡(jiǎn)短的州弟、通常是交互式的請(qǐng)求。
上傳任務(wù)與數(shù)據(jù)任務(wù)類似低零,但它們也發(fā)送數(shù)據(jù)(通常以文件的形式)呆馁,并在應(yīng)用程序不運(yùn)行時(shí)支持后臺(tái)上傳。
下載任務(wù)以文件的形式檢索數(shù)據(jù)毁兆,并且在應(yīng)用程序沒有運(yùn)行時(shí)支持后臺(tái)下載和上傳浙滤。
使用一個(gè)會(huì)話委托
會(huì)話中的任務(wù)還共享一個(gè)公共委托,該委托允許您在發(fā)生各種事件時(shí)提供和獲取信息——當(dāng)身份驗(yàn)證失敗時(shí)气堕,當(dāng)來自服務(wù)器的數(shù)據(jù)到達(dá)時(shí)纺腊,當(dāng)數(shù)據(jù)準(zhǔn)備緩存時(shí),等等茎芭。使用URL會(huì)話可以逐步地列出會(huì)話執(zhí)行任務(wù)時(shí)發(fā)生的事件揖膜,以及調(diào)用哪個(gè)委托方法。
另一方面梅桩,如果您不需要委托提供的任何特性壹粟,您可以在創(chuàng)建會(huì)話時(shí)使用這個(gè)API,而不提供一個(gè)通過nil的方法宿百。
重要的
會(huì)話對(duì)象保存對(duì)委托的強(qiáng)引用趁仙,直到應(yīng)用程序退出或顯式地使會(huì)話無效為止。如果你不讓會(huì)話失效垦页,你的應(yīng)用程序會(huì)泄漏內(nèi)存雀费,直到它退出。
異步性和URL會(huì)話
與大多數(shù)網(wǎng)絡(luò)API一樣痊焊,URLSession API是高度異步的盏袄。它以兩種方式向應(yīng)用程序返回?cái)?shù)據(jù),具體取決于您調(diào)用的方法:
通過調(diào)用一個(gè)完成處理程序塊薄啥,當(dāng)傳輸完成成功或有錯(cuò)誤時(shí)辕羽。
通過調(diào)用會(huì)話委托上的方法作為接收數(shù)據(jù)和傳輸完成時(shí)的方法。
除了向委托交付這些信息之外垄惧,URLSession API還提供了狀態(tài)和進(jìn)度屬性刁愿,如果您需要根據(jù)任務(wù)的當(dāng)前狀態(tài)進(jìn)行編程決策,您可以查詢這些屬性(需要注意的是赘艳,它的狀態(tài)隨時(shí)都可能改變)酌毡。
URL會(huì)話還支持取消克握、重新啟動(dòng)或恢復(fù)蕾管、暫停任務(wù)枷踏,并提供恢復(fù)暫停、取消或失敗下載的能力掰曾。
協(xié)議支持
URLSession類本機(jī)支持?jǐn)?shù)據(jù)旭蠕、文件、ftp旷坦、http和https URL方案掏熬,對(duì)代理服務(wù)器和SOCKS網(wǎng)關(guān)進(jìn)行透明的支持,在用戶的系統(tǒng)首選項(xiàng)中配置秒梅。
URLSession支持HTTP/1.1旗芬、SPDY和HTTP/2協(xié)議。RFC 7540描述了HTTP/2支持捆蜀,并要求服務(wù)器支持ALPN或NPN進(jìn)行協(xié)議協(xié)商疮丛。
您還可以通過子類化URLProtocol為您自己的自定義網(wǎng)絡(luò)協(xié)議和URL計(jì)劃(為您的應(yīng)用程序的私有使用)添加支持。
App Transport Security (ATS)
從iOS 9.0和OS X 10.11開始辆它,默認(rèn)情況下誊薄,所有使用URLSession建立的HTTP連接都會(huì)啟用一個(gè)名為App Transport security (ATS)的新安全特性。ATS要求HTTP連接使用HTTPS (RFC 2818)锰茉。
使用一個(gè)URL會(huì)話
使用URLSession類發(fā)出請(qǐng)求:
1. 創(chuàng)建一個(gè)會(huì)話配置呢蔫。對(duì)于后臺(tái)會(huì)話,此配置必須包含唯一標(biāo)識(shí)符飒筑。存儲(chǔ)該標(biāo)識(shí)符片吊,并在應(yīng)用程序崩潰或終止或暫停時(shí)使用它與會(huì)話重新關(guān)聯(lián)。
2. 創(chuàng)建一個(gè)會(huì)話协屡,指定一個(gè)配置對(duì)象和一個(gè)可選的委托定鸟。
3. 在會(huì)話中創(chuàng)建任務(wù)對(duì)象,每個(gè)對(duì)象表示一個(gè)資源請(qǐng)求著瓶。這些任務(wù)對(duì)象是URLSessionTask-URLSessionDataTask联予、URLSessionUploadTask或URLSessionDownloadTask的子類,具體取決于您試圖實(shí)現(xiàn)的行為材原。每個(gè)任務(wù)都以暫停狀態(tài)開始沸久。在應(yīng)用程序調(diào)用任務(wù)的resume()之后,它開始下載指定的資源余蟹。
啟動(dòng)任務(wù)后卷胯,會(huì)話調(diào)用其委托的方法,如下:
1. 如果與服務(wù)器的初始握手需要連接級(jí)別的挑戰(zhàn)(比如SSL客戶端證書)威酒,則URLSession調(diào)用URLSession (_:task:didReceive:completionHandler:)或URLSession (_:didReceive:completionHandler:)委托方法窑睁。
2. 如果從流中提供任務(wù)的數(shù)據(jù)挺峡,則URLSession對(duì)象調(diào)用委托的URLSession (_:task:needNewBodyStream:)委托方法來獲取InputStream實(shí)例,該實(shí)例為新請(qǐng)求提供主體數(shù)據(jù)担钮。
3. 在將主體內(nèi)容初始上載到服務(wù)器(如果適用的話)期間橱赠,委托定期接收urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)回調(diào),報(bào)告上傳進(jìn)度箫津。
4. 服務(wù)器發(fā)送一個(gè)響應(yīng)狭姨。
5. 如果響應(yīng)表明需要身份驗(yàn)證,會(huì)話將調(diào)用其委托的urlSession(_:task:didReceive:completionHandler:)方法苏遥”模回到步驟2。
6. 如果響應(yīng)是一個(gè)HTTP重定向響應(yīng)田炭,URLSession對(duì)象調(diào)用委托的URLSession(_:任務(wù):willPerformHTTPRedirection:newRequest:completionHandler:)方法师抄。該委托方法使用提供的NSURLRequest對(duì)象(跟蹤重定向)、新的NSURLRequest對(duì)象(重定向到不同的URL)或nil(將重定向的響應(yīng)主體視為有效響應(yīng)并將其作為結(jié)果返回)來調(diào)用提供的完成處理程序教硫。
? ? — 如果您決定遵循重定向叨吮,請(qǐng)回到步驟2。
????— 如果委托沒有實(shí)現(xiàn)此方法栋豫,那么重定向?qū)⒈桓櫟街囟ㄏ虻淖畲髷?shù)量挤安。
7. 對(duì)于通過調(diào)用downloadTask(with resumedata:)或downloadTask(with resumedata:)創(chuàng)建的下載(或重新下載)任務(wù),URLSession使用新的任務(wù)對(duì)象調(diào)用委托的URLSession (_:downloadTask:didResumeAtOffset:expected tedtotalbytes:)方法丧鸯。
8. 對(duì)于數(shù)據(jù)任務(wù)蛤铜,URLSession對(duì)象調(diào)用委托的URLSession (_:dataTask:didReceive:completionHandler:)方法。決定是否將數(shù)據(jù)任務(wù)轉(zhuǎn)換為下載任務(wù)丛肢,然后調(diào)用完成處理程序來轉(zhuǎn)換围肥、繼續(xù)或取消任務(wù)。如果您的應(yīng)用程序選擇將數(shù)據(jù)任務(wù)轉(zhuǎn)換為下載任務(wù)蜂怎,URLSession以新的下載任務(wù)為參數(shù)調(diào)用委托的URLSession (_:dataTask:didBecome:)方法穆刻。在此調(diào)用之后,委托不再接收來自數(shù)據(jù)任務(wù)的進(jìn)一步回調(diào)杠步,并開始接收來自下載任務(wù)的回調(diào)氢伟。
9. 在從服務(wù)器進(jìn)行傳輸期間,委托定期接收任務(wù)級(jí)回調(diào)幽歼,以報(bào)告?zhèn)鬏斶M(jìn)度朵锣。對(duì)于數(shù)據(jù)任務(wù),會(huì)話調(diào)用委托的urlSession(_:dataTask:didReceive:)方法甸私,并在接收數(shù)據(jù)時(shí)調(diào)用它們的實(shí)際數(shù)據(jù)片段诚些。對(duì)于一個(gè)下載任務(wù),會(huì)話調(diào)用委托的urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)方法皇型,成功寫入磁盤的字節(jié)數(shù)诬烹。如果用戶告訴應(yīng)用程序暫停下載砸烦,通過調(diào)用cancel(通過producingresumedata:)方法取消任務(wù)。稍后绞吁,如果用戶要求您的應(yīng)用程序繼續(xù)下載幢痘,則將返回的簡(jiǎn)歷數(shù)據(jù)傳遞給downloadTask(withResumeData:)或downloadTask(withResumeData:completionHandler:),以創(chuàng)建一個(gè)新的下載任務(wù)掀泳,繼續(xù)下載雪隧。(步驟1)西轩。
10. 對(duì)于一個(gè)數(shù)據(jù)任務(wù)员舵,URLSession對(duì)象可以調(diào)用委托的URLSession (_:dataTask:willCacheResponse:completionHandler:)方法。然后應(yīng)用程序應(yīng)該決定是否允許緩存藕畔。如果不實(shí)現(xiàn)此方法马僻,默認(rèn)行為是使用會(huì)話配置對(duì)象中指定的緩存策略。如果響應(yīng)是多部分編碼的注服,會(huì)話可能再次調(diào)用委托的didReceiveResponse方法韭邓,然后是零個(gè)或多個(gè)額外的didReceiveData調(diào)用。如果發(fā)生這種情況溶弟,請(qǐng)轉(zhuǎn)到步驟8(處理didReceiveResponse調(diào)用)女淑。
11. 如果下載任務(wù)成功完成,則URLSession對(duì)象調(diào)用任務(wù)的URLSession (_:downloadTask:didFinishDownloadingTo:)方法辜御,該方法具有臨時(shí)文件的位置鸭你。應(yīng)用程序必須從這個(gè)文件中讀取響應(yīng)數(shù)據(jù),或者在這個(gè)委托方法返回之前將其移動(dòng)到一個(gè)永久位置擒权。
12.如果下載任務(wù)成功完成袱巨,則URLSession對(duì)象調(diào)用任務(wù)的URLSession (_:downloadTask:didFinishDownloadingTo:)方法,該方法具有臨時(shí)文件的位置碳抄。應(yīng)用程序必須從這個(gè)文件中讀取響應(yīng)數(shù)據(jù)愉老,或者在這個(gè)委托方法返回之前將其移動(dòng)到一個(gè)永久位置。
13.?當(dāng)任何任務(wù)完成時(shí)剖效,URLSession對(duì)象調(diào)用委托的URLSession (_:task:didCompleteWithError:)方法嫉入,該方法具有錯(cuò)誤對(duì)象或nil(如果任務(wù)成功完成)。如果可以繼續(xù)下載任務(wù)璧尸,則NSError對(duì)象的userInfo字典包含nsurlsessiondownloadtask_taskresumedata鍵的值咒林。應(yīng)用程序應(yīng)該將此值傳遞給downloadTask(withResumeData:)或downloadTask(withResumeData:completionHandler:),以創(chuàng)建一個(gè)新的下載任務(wù)逗宁,繼續(xù)現(xiàn)有的下載映九。如果任務(wù)無法恢復(fù),您的應(yīng)用程序應(yīng)該創(chuàng)建一個(gè)新的下載任務(wù)瞎颗,并從開始重新啟動(dòng)事務(wù)件甥。在任何一種情況下捌议,如果傳輸失敗(除了服務(wù)器錯(cuò)誤之外),請(qǐng)轉(zhuǎn)到步驟3(創(chuàng)建和恢復(fù)任務(wù)對(duì)象)引有。
14.?如果您不再需要會(huì)話瓣颅,您可以通過調(diào)用invalidateAndCancel()(取消未完成的任務(wù))或finishTasksAndInvalidate()(允許未完成的任務(wù)在對(duì)象無效之前完成)來使其無效。如果您不取消會(huì)話譬正,那么當(dāng)您的應(yīng)用程序終止時(shí)宫补,會(huì)話將自動(dòng)消失(除非它是一個(gè)有活動(dòng)任務(wù)的后臺(tái)會(huì)話)。在使會(huì)話無效之后曾我,當(dāng)所有未完成的任務(wù)被取消或完成時(shí)粉怕,會(huì)話調(diào)用委托的urlSession(_:didBecomeInvalidWithError:)方法。當(dāng)該委托方法返回時(shí)抒巢,會(huì)話處理它對(duì)委托的強(qiáng)引用贫贝。
如果應(yīng)用程序取消正在進(jìn)行的下載,URLSession對(duì)象會(huì)調(diào)用委托的URLSession (_:task:didCompleteWithError:)方法蛉谜,就好像發(fā)生了錯(cuò)誤一樣稚晚。
NSCopying行為
會(huì)話和任務(wù)對(duì)象遵循以下NSCopying協(xié)議:
當(dāng)你的應(yīng)用程序復(fù)制一個(gè)會(huì)話或任務(wù)對(duì)象時(shí),你會(huì)得到相同的對(duì)象型诚。
當(dāng)你的應(yīng)用程序復(fù)制一個(gè)配置對(duì)象時(shí)客燕,你會(huì)得到一個(gè)可以獨(dú)立修改的新拷貝。
線程安全
URL會(huì)話API本身是線程安全的狰贯。您可以在任何線程上下文中自由地創(chuàng)建會(huì)話和任務(wù)也搓,當(dāng)您的委托方法調(diào)用所提供的完成處理程序時(shí),工作將自動(dòng)調(diào)度到正確的委托隊(duì)列上暮现。
警告
您的urlSessionDidFinishEvents(forBackgroundURLSession:)會(huì)話委托方法可以在輔助線程上調(diào)用还绘。但是,在iOS中栖袋,該方法的實(shí)現(xiàn)可能需要調(diào)用應(yīng)用程序中提供的完成處理程序(_:handleeventsforbackgrounddurlsession:completionHandler:)拍顷。您必須在主線程上調(diào)用完成處理程序。
上述是從蘋果文檔里翻譯過來的塘幅,沒有任何人為修飾加工昔案,只是翻譯的有點(diǎn)晦澀難懂。對(duì)付著看吧电媳。