2018-07-19

NSURLRequest

概述

NSURLRequest封装了加载请求的两个基本数据元素:要加载的URL,以及在查询实现提供的URL内容缓存时要使用的策略。

重要的

这个类只用于封装关于URL请求的信息。您必须使用其他类(如URLSession)将这些请求发送到服务器。

NSURLRequest被设计成通过创建扩展来支持其他协议,这些扩展为您自己的特定于协议的属性提供访问器方法。这些方法可以通过调用URLProtocol methods属性(forKey:in:)和setProperty(_:forKey:in:)来获取和设置实际值。

NSURLRequest的可变子类是NSMutableURLRequest。

重要的

Foundation框架的Swift覆盖提供了URLRequest结构,它连接到NSURLRequest类及其可变子类NSMutableURLRequest。


UIWebView

在应用程序中嵌入web内容的视图。

SDK   在iOS 2.0 - -12.0弃用

框架   UIKit

请注意

在iOS 8及以后运行的应用程序中,使用WKWebView类而不是使用UIWebView。此外,如果呈现不应该运行JavaScript的文件,请考虑将WKPreferences属性JavaScript设置为false。


WKWebView

显示交互式web内容的对象,如应用程序内的浏览器。

SDK   在 iOS 8.0+    macOS 10.10 + 使用

框架   WebKit

重要的

从iOS 8.0和OS X 10.10开始,使用WKWebView向应用中添加web内容。不要使用UIWebView或WebView。

您可以使用WKWebView类在应用程序中嵌入web内容。为此,创建一个WKWebView对象,将其设置为视图,并发送一个请求来加载web内容。

请注意

您可以在WKWebView中使用httpBody内容发出POST请求。

在使用init(frame:configuration:)方法创建一个新的WKWebView对象之后,需要加载web内容。使用loadHTMLString(_:baseURL:)方法开始加载本地HTML文件或load(_:)方法开始加载web内容。使用stopLoading()方法停止加载,使用isLoading属性确定web视图是否正在加载。将委托属性设置为符合WKUIDelegate协议的对象,以跟踪web内容的加载。参见清单1以编程方式创建WKWebView的示例。

清单1

以编程方式创建一个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)

    }}

要允许用户在页面历史中前后移动,可以使用goBack()和goForward()方法作为按钮的操作。使用canGoBack和canGoForward属性,在用户无法朝某个方向移动时禁用按钮。

默认情况下,web view会自动将出现在web内容中的电话号码转换为电话链接。当一个电话连接被监听时,手机应用程序就会启动并拨通号码。要关闭此默认行为,请使用不包含phoneNumber标志的WKDataDetectorTypes位字段设置datadectortypes属性。

还可以使用set放大率(_:centeredAt:)在web内容第一次显示在web视图中时以编程方式设置它的比例。之后,用户可以使用手势来改变缩放比例。


URLSession

协调一组相关网络数据传输任务的对象。

SDK   在 iOS 7.0 +       macOS 10.9 +       tvo 9.0 +        watchOS 2.0 + 使用

概述

URLSession类和相关类为下载内容提供了一个API。这个API为支持身份验证提供了一组丰富的委托方法,并使应用程序能够在应用程序不运行时执行后台下载,或者在iOS中,当应用程序暂停时执行后台下载。

重要的

URLSession API涉及到许多不同的类,它们以一种相当复杂的方式协同工作,如果您自己阅读参考文档,这可能并不明显。在使用此API之前,您应该阅读URL加载系统主题的概述。第一步部分中的文章提供了使用URLSession执行常见任务的示例。

使用URLSession API,您的应用程序创建一个或多个会话,每个会话协调一组相关的数据传输任务。例如,如果您正在创建一个web浏览器,您的应用程序可能会为每个选项卡或窗口创建一个会话,或者一个会话用于交互式使用,另一个会话用于后台下载。在每个会话中,您的应用程序添加一系列任务,每个任务表示对特定URL的请求(如果需要,遵循HTTP重定向)。

类型的URL会话

给定URL会话中的任务共享一个公共会话配置对象,该对象定义了连接行为,例如对单个主机进行的最大同时连接数量,是否允许通过蜂窝网络进行连接,等等。

URLSession有一个用于基本请求的单例共享会话(它没有配置对象)。它不像您创建的会话那样可定制,但如果您有非常有限的需求,它是一个很好的起点。通过调用共享类方法访问此会话。对于其他类型的会话,您使用以下三种配置之一实例化URLSession:

默认会话的行为类似于共享会话,但允许进行更多配置,并允许您使用委托增量地获取数据。

短暂的会话与共享会话类似,但是不要向磁盘写入缓存、cookie或凭据。

后台会话允许您在应用程序不运行时在后台执行内容的上传和下载。

有关创建每种配置类型的详细信息,请参见在URLSessionConfiguration类中创建会话配置对象。

URL会话任务的类型

在会话中,您可以创建任务,可选地将数据上载到服务器,然后以磁盘上的文件或内存中的一个或多个NSData对象的形式从服务器检索数据。URLSession API提供了三种类型的任务:

数据任务使用NSData对象发送和接收数据。数据任务是用于向服务器发出简短的、通常是交互式的请求。

上传任务与数据任务类似,但它们也发送数据(通常以文件的形式),并在应用程序不运行时支持后台上传。

下载任务以文件的形式检索数据,并且在应用程序没有运行时支持后台下载和上传。

使用一个会话委托

会话中的任务还共享一个公共委托,该委托允许您在发生各种事件时提供和获取信息——当身份验证失败时,当来自服务器的数据到达时,当数据准备缓存时,等等。使用URL会话可以逐步地列出会话执行任务时发生的事件,以及调用哪个委托方法。

另一方面,如果您不需要委托提供的任何特性,您可以在创建会话时使用这个API,而不提供一个通过nil的方法。

重要的

会话对象保存对委托的强引用,直到应用程序退出或显式地使会话无效为止。如果你不让会话失效,你的应用程序会泄漏内存,直到它退出。

异步性和URL会话

与大多数网络API一样,URLSession API是高度异步的。它以两种方式向应用程序返回数据,具体取决于您调用的方法:

通过调用一个完成处理程序块,当传输完成成功或有错误时。

通过调用会话委托上的方法作为接收数据和传输完成时的方法。

除了向委托交付这些信息之外,URLSession API还提供了状态和进度属性,如果您需要根据任务的当前状态进行编程决策,您可以查询这些属性(需要注意的是,它的状态随时都可能改变)。

URL会话还支持取消、重新启动或恢复、暂停任务,并提供恢复暂停、取消或失败下载的能力。

协议支持

URLSession类本机支持数据、文件、ftp、http和https URL方案,对代理服务器和SOCKS网关进行透明的支持,在用户的系统首选项中配置。

URLSession支持HTTP/1.1、SPDY和HTTP/2协议。RFC 7540描述了HTTP/2支持,并要求服务器支持ALPN或NPN进行协议协商。

您还可以通过子类化URLProtocol为您自己的自定义网络协议和URL计划(为您的应用程序的私有使用)添加支持。

App Transport Security (ATS)

从iOS 9.0和OS X 10.11开始,默认情况下,所有使用URLSession建立的HTTP连接都会启用一个名为App Transport security (ATS)的新安全特性。ATS要求HTTP连接使用HTTPS (RFC 2818)。

使用一个URL会话

使用URLSession类发出请求:

1. 创建一个会话配置。对于后台会话,此配置必须包含唯一标识符。存储该标识符,并在应用程序崩溃或终止或暂停时使用它与会话重新关联。

2. 创建一个会话,指定一个配置对象和一个可选的委托。

3. 在会话中创建任务对象,每个对象表示一个资源请求。这些任务对象是URLSessionTask-URLSessionDataTask、URLSessionUploadTask或URLSessionDownloadTask的子类,具体取决于您试图实现的行为。每个任务都以暂停状态开始。在应用程序调用任务的resume()之后,它开始下载指定的资源。

启动任务后,会话调用其委托的方法,如下:

1. 如果与服务器的初始握手需要连接级别的挑战(比如SSL客户端证书),则URLSession调用URLSession (_:task:didReceive:completionHandler:)或URLSession (_:didReceive:completionHandler:)委托方法。

2. 如果从流中提供任务的数据,则URLSession对象调用委托的URLSession (_:task:needNewBodyStream:)委托方法来获取InputStream实例,该实例为新请求提供主体数据。

3. 在将主体内容初始上载到服务器(如果适用的话)期间,委托定期接收urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)回调,报告上传进度。

4. 服务器发送一个响应。

5. 如果响应表明需要身份验证,会话将调用其委托的urlSession(_:task:didReceive:completionHandler:)方法。回到步骤2。

6. 如果响应是一个HTTP重定向响应,URLSession对象调用委托的URLSession(_:任务:willPerformHTTPRedirection:newRequest:completionHandler:)方法。该委托方法使用提供的NSURLRequest对象(跟踪重定向)、新的NSURLRequest对象(重定向到不同的URL)或nil(将重定向的响应主体视为有效响应并将其作为结果返回)来调用提供的完成处理程序。

    — 如果您决定遵循重定向,请回到步骤2。

    — 如果委托没有实现此方法,那么重定向将被跟踪到重定向的最大数量。

7. 对于通过调用downloadTask(with resumedata:)或downloadTask(with resumedata:)创建的下载(或重新下载)任务,URLSession使用新的任务对象调用委托的URLSession (_:downloadTask:didResumeAtOffset:expected tedtotalbytes:)方法。

8. 对于数据任务,URLSession对象调用委托的URLSession (_:dataTask:didReceive:completionHandler:)方法。决定是否将数据任务转换为下载任务,然后调用完成处理程序来转换、继续或取消任务。如果您的应用程序选择将数据任务转换为下载任务,URLSession以新的下载任务为参数调用委托的URLSession (_:dataTask:didBecome:)方法。在此调用之后,委托不再接收来自数据任务的进一步回调,并开始接收来自下载任务的回调。

9. 在从服务器进行传输期间,委托定期接收任务级回调,以报告传输进度。对于数据任务,会话调用委托的urlSession(_:dataTask:didReceive:)方法,并在接收数据时调用它们的实际数据片段。对于一个下载任务,会话调用委托的urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)方法,成功写入磁盘的字节数。如果用户告诉应用程序暂停下载,通过调用cancel(通过producingresumedata:)方法取消任务。稍后,如果用户要求您的应用程序继续下载,则将返回的简历数据传递给downloadTask(withResumeData:)或downloadTask(withResumeData:completionHandler:),以创建一个新的下载任务,继续下载。(步骤1)。

10. 对于一个数据任务,URLSession对象可以调用委托的URLSession (_:dataTask:willCacheResponse:completionHandler:)方法。然后应用程序应该决定是否允许缓存。如果不实现此方法,默认行为是使用会话配置对象中指定的缓存策略。如果响应是多部分编码的,会话可能再次调用委托的didReceiveResponse方法,然后是零个或多个额外的didReceiveData调用。如果发生这种情况,请转到步骤8(处理didReceiveResponse调用)。

11. 如果下载任务成功完成,则URLSession对象调用任务的URLSession (_:downloadTask:didFinishDownloadingTo:)方法,该方法具有临时文件的位置。应用程序必须从这个文件中读取响应数据,或者在这个委托方法返回之前将其移动到一个永久位置。

12.如果下载任务成功完成,则URLSession对象调用任务的URLSession (_:downloadTask:didFinishDownloadingTo:)方法,该方法具有临时文件的位置。应用程序必须从这个文件中读取响应数据,或者在这个委托方法返回之前将其移动到一个永久位置。

13. 当任何任务完成时,URLSession对象调用委托的URLSession (_:task:didCompleteWithError:)方法,该方法具有错误对象或nil(如果任务成功完成)。如果可以继续下载任务,则NSError对象的userInfo字典包含nsurlsessiondownloadtask_taskresumedata键的值。应用程序应该将此值传递给downloadTask(withResumeData:)或downloadTask(withResumeData:completionHandler:),以创建一个新的下载任务,继续现有的下载。如果任务无法恢复,您的应用程序应该创建一个新的下载任务,并从开始重新启动事务。在任何一种情况下,如果传输失败(除了服务器错误之外),请转到步骤3(创建和恢复任务对象)。

14. 如果您不再需要会话,您可以通过调用invalidateAndCancel()(取消未完成的任务)或finishTasksAndInvalidate()(允许未完成的任务在对象无效之前完成)来使其无效。如果您不取消会话,那么当您的应用程序终止时,会话将自动消失(除非它是一个有活动任务的后台会话)。在使会话无效之后,当所有未完成的任务被取消或完成时,会话调用委托的urlSession(_:didBecomeInvalidWithError:)方法。当该委托方法返回时,会话处理它对委托的强引用。

如果应用程序取消正在进行的下载,URLSession对象会调用委托的URLSession (_:task:didCompleteWithError:)方法,就好像发生了错误一样。

NSCopying行为

会话和任务对象遵循以下NSCopying协议:

当你的应用程序复制一个会话或任务对象时,你会得到相同的对象。

当你的应用程序复制一个配置对象时,你会得到一个可以独立修改的新拷贝。

线程安全

URL会话API本身是线程安全的。您可以在任何线程上下文中自由地创建会话和任务,当您的委托方法调用所提供的完成处理程序时,工作将自动调度到正确的委托队列上。

警告

您的urlSessionDidFinishEvents(forBackgroundURLSession:)会话委托方法可以在辅助线程上调用。但是,在iOS中,该方法的实现可能需要调用应用程序中提供的完成处理程序(_:handleeventsforbackgrounddurlsession:completionHandler:)。您必须在主线程上调用完成处理程序。

上述是从苹果文档里翻译过来的,没有任何人为修饰加工,只是翻译的有点晦涩难懂。对付着看吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容