Swift - 网络 URLSession

问:Swift的网络请求怎么实现?
答:用AFNetworkingAlamofire这些框架啊,快速、好用、数据解析难度低。
是的,第三方网络框架真的好用,好用到我们都快忘了原生API是怎么玩了,但万丈高楼平地起,原生API我们还是有必要掌握的,能让我们更容易、更深入理解AFNetworkingAlamofire等框架,写这篇文章的目的是对Swift的原生API URLSession的复习

基本网络请求:

  • 先做一点准备工作,iOS从9.0版本开始添加了对应用数据传输的安全性要求(ATS),我们在这里简单的设置一下关闭ATS
    • 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重启连接网络请求,默认是挂起状态,而在AFNetworkingAlamofire中我们不需要关心这一步,它们已经帮我们做了这一步的处理;
  • 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给定主机的最大并发持久连接数
六、Cookie设置
  • HTTPShouldSetCookies是否允许请求包含一个Cookie库中的Cookie
  • HTTPCookieAcceptPolicy确定何时接受Cookie策略
  • HTTPCookieStorage 保存当前会话的 Cookie的库

这里只是介绍了SwiftURLSession中一些基本的属性的用途,关于URLSessionDataTask做另一篇章来讲。

PS:鄙人小小码农一枚,限于能力,官方文档或许理解有误,文章中有错误、不足之处,欢迎各位大神指正。

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