问:
Swift
的网络请求怎么实现? 答:用AFNetworking
、Alamofire
这些框架啊,快速、好用、数据解析难度低。 是的,第三方网络框架真的好用,好用到咱们都快忘了原生API
是怎么玩了,但万丈高楼平地起,原生API
咱们仍是有必要掌握的,能让咱们更容易、更深刻理解AFNetworking
、Alamofire
等框架,写这篇文章的目的是对Swift
的原生API
URLSession
的复习api
info.plist
中添加一个key
:App Transport Security Settings
,类型为字典;key
:Allow Arbitrary Loads
,类型为Boolean
类型,值为YES
;ATS
问题的方法有不少,这里不作赘述;// Swift简单网络请求
let urlString = "http://rap2api.taobao.org/app/mock/228467/api/friend/list"
URLSession.shared.dataTask(with: URL(string: urlString)!) { (data, response, error) in
if error != nil {
print("\(String(describing: error))")
}
print("\(String(describing: response))")
}.resume()
//OC 网络请求
NSString *urlString = [NSString stringWithFormat:@"http://rap2api.taobao.org/app/mock/228467/api/friend/list"];
[[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:urlString] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!error) {
NSLog(@"%@",error);
}
NSLog(@"%@", response);
}] resume];
复制代码
resume
重启链接网络请求,默认是挂起状态,而在AFNetworking
、Alamofire
中咱们不须要关心这一步,它们已经帮咱们作了这一步的处理;dataTask
建立网络会话任务
uploadTask
文件上传任务downloadTask
文件下载任务streamTask
用于对经过URLSession
建立的TCP/IP
流执行读写操做Configuration
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
默认配置,会本地存储凭据、缓存和cookie
ephemeral
临时会话,不会将cookie
、缓存或凭据储存到本地只会放到内存中,当应用程序退出后数据也会消失,能够用于实现“秘密浏览”;background
创建后台会话,能够在应用程序挂起、退出、崩溃的状况下运行上传和下载任务,后台另起一个线程。另外,系统会根据设备的负载程度决定分配下载的资源,所以有可能会很慢甚至超时失败;
background
须要有一个惟一标识符identifier
用于标识任务后台执行任务的时候注意点缓存
//Listing 1 Creating a background URL session
private lazy var urlSession: URLSession = {
let config = URLSessionConfiguration.background(withIdentifier: "MySession")
config.isDiscretionary = true
config.sessionSendsLaunchEvents = true
return URLSession(configuration: config, delegate: self, delegateQueue: nil)
}()
//Listing 2 Creating a download task from a URL session
let backgroundTask = urlSession.downloadTask(with: url)
backgroundTask.earliestBeginDate = Date().addingTimeInterval(60 * 60)
backgroundTask.countOfBytesClientExpectsToSend = 200
backgroundTask.countOfBytesClientExpectsToReceive = 500 * 1024
backgroundTask.resume()
//Listing 3 Storing the background download completion handler sent to the application delegate
var backgroundCompletionHandler: (() -> Void)?
func application(_ application: UIApplication,
handleEventsForBackgroundURLSession identifier: String,
completionHandler: @escaping () -> Void) {
backgroundCompletionHandler = completionHandler
}
//Listing 4 Executing the background URL session completion handler on the main queue
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
DispatchQueue.main.async {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let backgroundCompletionHandler =
appDelegate.backgroundCompletionHandler else {
return
}
backgroundCompletionHandler()
}
}
复制代码
AppDelegate
中保存的闭包backgroundCompletionHandler
回调,更新屏幕PS
: 官方文档查看方法: 安全
public enum CachePolicy : UInt {
//默认策略
case useProtocolCachePolicy
//指定应从原始源加载URL加载的数据, 没有本地缓存数据
case reloadIgnoringLocalCacheData
//指定不只应忽略本地缓存数据,并且应指示代理和其余中间人在协议容许的状况下忽略其缓存。未实现
case reloadIgnoringLocalAndRemoteCacheData
//与reloadIgnoringLocalCacheData相同
public static var reloadIgnoringCacheData: NSURLRequest.CachePolicy { get }
//指定应使用现有缓存数据来知足URL加载请求,无论其生命周期或到期日期。 可是,若是缓存中没有与URL加载请求相对应的现有数据,则从原始源加载URL
case returnCacheDataElseLoad
//指定应使用现有缓存数据来知足URL加载请求,无论其生命周期或到期日期。 可是,若是缓存中没有与URL加载请求相对应的现有数据,则不会尝试从源源加载URL,而且认为加载失败。 此常量指定相似于“脱机”模式的行为。
case returnCacheDataDontLoad
//指定可使用现有缓存数据,前提是源源确认其有效性,不然从原始源加载URL。未实现。
case reloadRevalidatingCacheData
}
复制代码
identifier
后台会话标识符timeoutIntervalForRequest
请求超时,若是在设定的超时时间内没有传输数据,将致使超时,而且每当传输数据时都会重置。timeoutIntervalForResource
请求超时。 若是在给定超时内没法检索到资源,则会致使超时。networkServiceType
网络服务类型allowsCellularAccess
是否容许蜂窝网络waitsForConnectivity
任务等待网络链接是否可用,后台会话时会忽略,由于后台会话始终等待链接。TLSMinimumSupportedProtocol
容许最小TLS
协议版本TLSMaximumSupportedProtocol
容许最大TLS
协议版本urlCredentialStorage
存储身份验证凭证的库HTTP
策略、代理属性HTTPShouldUsePipelining
容许使用HTTP流水线HTTPMaximumConnectionsPerHost
给定主机的最大并发持久链接数HTTPShouldSetCookies
是否容许请求包含一个Cookie
库中的Cookie
HTTPCookieAcceptPolicy
肯定什么时候接受Cookie
策略HTTPCookieStorage
保存当前会话的 Cookie
的库这里只是介绍了
Swift
的URLSession
中一些基本的属性的用途,关于URLSessionDataTask
作另外一篇章来说。bash
PS:鄙人小小码农一枚,限于能力,官方文档或许理解有误,文章中有错误、不足之处,欢迎各位大神指正。cookie