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:)。您必须在主线程上调用完成处理程序。
上述是从苹果文档里翻译过来的,没有任何人为修饰加工,只是翻译的有点晦涩难懂。对付着看吧。
网友评论