© 2016 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.
System Frameworks #WWDC16
Session 711
NSURLSession: New Features and Best Practices
Jeff Jenkins Software Engineer, Internet Technologies
Agenda
Agenda
Evolving NSURLSession API
Agenda
Evolving NSURLSession APISecurity
Agenda
Evolving NSURLSession APISecurityBest practices and tips
Networking API
NSStream
NSNetServices
NSURLConnection
Foundation
Networking API
NSStream
NSNetServices
NSURLConnection
Foundation
Deprecated2015
Networking API
Foundation NSNetServices
NSStream
NSURLSessionNew2013
NSStream
NSNetServices
NSURLConnection
Foundation
Deprecated2015
Networking API
ReviewNSURLSession
BenefitsNSURLSession Example
BenefitsNSURLSession Example
HTTP/1.1, SPDY, HTTP/2
BenefitsNSURLSession Example
HTTP/1.1, SPDY, HTTP/2
App Transport Security (ATS)
BenefitsNSURLSession Example
HTTP/1.1, SPDY, HTTP/2
App Transport Security (ATS)
HTTP Strict Transport Security (HSTS)
BenefitsNSURLSession Example
HTTP/1.1, SPDY, HTTP/2
App Transport Security (ATS)
HTTP Strict Transport Security (HSTS)
Cache, cookies, proxy, authentication
BenefitsNSURLSession Example
HTTP/1.1, SPDY, HTTP/2
App Transport Security (ATS)
HTTP Strict Transport Security (HSTS)
Cache, cookies, proxy, authentication
Configuration
BenefitsNSURLSession Example
NSURLSessionConfiguration
BenefitsNSURLSession Example
NSURLSessionConfiguration
Transport Layer Security (TLS) version
BenefitsNSURLSession Example
NSURLSessionConfiguration
Transport Layer Security (TLS) version
Prohibit cellular usage
BenefitsNSURLSession Example
NSURLSessionConfiguration
Transport Layer Security (TLS) version
Prohibit cellular usage
Network service type
BenefitsNSURLSession Example
NSURLSessionConfiguration
Transport Layer Security (TLS) version
Prohibit cellular usage
Network service type
Cookie policy
BenefitsNSURLSession Example
NSURLSessionConfiguration
Transport Layer Security (TLS) version
Prohibit cellular usage
Network service type
Cookie policy
Cache policy
BenefitsNSURLSession Example
NSURLSessionConfiguration
Transport Layer Security (TLS) version
Prohibit cellular usage
Network service type
Cookie policy
Cache policy
Storage objects
BenefitsNSURLSession Example
NSURLSessionConfiguration
Transport Layer Security (TLS) version
Prohibit cellular usage
Network service type
Cookie policy
Cache policy
Storage objects
Request and resource timeouts
ReviewNSURLSession Example
ReviewNSURLSession Example
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
ReviewNSURLSession Example
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config)
ReviewNSURLSession Example
ReviewNSURLSession Example
let url = NSURL(string: "https://www.example.com/")!
let task = session.dataTask(with: url) { (data: NSData?, response: NSURLResponse?, error:
NSError?) in
...
}
ReviewNSURLSession Example
let url = NSURL(string: "https://www.example.com/")!
let task = session.dataTask(with: url) { (data: NSData?, response: NSURLResponse?, error:
NSError?) in
...
}
ReviewNSURLSession Example
let url = NSURL(string: "https://www.example.com/")!
let task = session.dataTask(with: url) { (data: NSData?, response: NSURLResponse?, error:
NSError?) in
...
}
ReviewNSURLSession Example
let url = NSURL(string: "https://www.example.com/")!
task.resume()
ReviewNSURLSession Example
ReviewNSURLSession Example
Summary: Three-step process
ReviewNSURLSession Example
Summary: Three-step process• Configuration
ReviewNSURLSession Example
Summary: Three-step process• Configuration• Session
ReviewNSURLSession Example
Summary: Three-step process• Configuration• Session• Tasks
ReviewNSURLSession Example
Summary: Three-step process• Configuration• Session• Tasks
Task 1 Session 1
Task 3 Session 3Task 2 Session 2
ReviewNSURLSession Example
Summary: Three-step process• Configuration• Session• Tasks
Task 1 Session 1
Task 3 Session 3Task 2 Session 2
Task 1Task 2
Task 3
Session 1
ReviewNSURLSession Example
Summary: Three-step process• Configuration• Session• Tasks
Task 1 Session 1
Task 3 Session 3Task 2 Session 2
Task 1Task 2
Task 3
Session 1
HTTP/2NSURLSession API
HTTP/2NSURLSession API NEW
HTTP/2NSURLSession API NEW
• Apple• Facebook• Instagram• Wikipedia• Twitter• YouTube• Yahoo
HTTP/2 Protocol
HTTP/2NSURLSession API NEW
• Apple• Facebook• Instagram• Wikipedia• Twitter• YouTube• Yahoo
HTTP/2 Protocol • Multiplexing and concurrency
HTTP/2NSURLSession API NEW
• Apple• Facebook• Instagram• Wikipedia• Twitter• YouTube• Yahoo
HTTP/2 Protocol • Multiplexing and concurrency• Header compression
HTTP/2NSURLSession API NEW
• Apple• Facebook• Instagram• Wikipedia• Twitter• YouTube• Yahoo
HTTP/2 Protocol • Multiplexing and concurrency• Header compression• Stream priorities
HTTP/2NSURLSession API NEW
• Apple• Facebook• Instagram• Wikipedia• Twitter• YouTube• Yahoo
HTTP/2 Protocol • Multiplexing and concurrency• Header compression• Stream priorities
HTTP/2NSURLSession API
• Server Push
NEW
• Apple• Facebook• Instagram• Wikipedia• Twitter• YouTube• Yahoo
HTTP/2 Server PushNSURLSession API NEW
HTTP/2 Server PushNSURLSession API
Prevent network round trips
NEW
HTTP/2 Server PushNSURLSession API
Prevent network round tripsServer support required
NEW
HTTP/2 Server PushNSURLSession API
Prevent network round tripsServer support requiredNow available in NSURLSession
NEW
LoadingHTTP/1.1
App ServerNSURLSessionTi
me
LoadingHTTP/1.1
App ServerNSURLSessionLatencyTi
me
LoadingHTTP/1.1
App ServerNSURLSessionLatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
NSURLSessionLatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
NSURLSession
Response
LatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
index.html
NSURLSession
Response
LatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
index.html
NSURLSession
GET style.css
Response
LatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
index.html
NSURLSession
GET style.css
Response
Response
LatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
index.html
style.css
NSURLSession
GET style.css
Response
Response
LatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
index.html
style.css
NSURLSession
GET style.css
GET background.jpg
Response
Response
LatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
index.html
style.css
NSURLSession
GET style.css
GET background.jpg
Response
Response
Response
LatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
index.html
style.css
background.jpg
NSURLSession
GET style.css
GET background.jpg
Response
Response
Response
LatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
finish
index.html
style.css
background.jpg
NSURLSession
GET style.css
GET background.jpg
Response
Response
Response
LatencyTi
me
LoadingHTTP/1.1
App Server
GET index.html
finish
index.html
style.css
background.jpg
HTTP/1.1
NSURLSession
GET style.css
GET background.jpg
Response
Response
Response
LatencyTi
me
App ServerNSURLSession
NEWHTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
GET index.html
NSURLSession
NEWHTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
GET index.html
Response
NSURLSession
NEWHTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
index.html
GET index.html
Response
NSURLSession
NEWHTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
index.html
GET index.html
Response
NSURLSession
NEW
PUSH 2, 3, n
HTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
GET style.css
index.html
GET index.html
Response
NSURLSession
NEW
PUSH 2, 3, n
HTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
ResponseGET style.css
index.html
GET index.html
Response
NSURLSession
NEW
PUSH 2, 3, n
HTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
ResponseGET style.css
index.html
style.css
GET index.html
Response
NSURLSession
NEW
PUSH 2, 3, n
HTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
ResponseGET style.css
index.html
style.css
GET index.html
Response
GET background.jpg
NSURLSession
NEW
PUSH 2, 3, n
HTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
ResponseGET style.css
Response
index.html
style.css
GET index.html
Response
GET background.jpg
NSURLSession
NEW
PUSH 2, 3, n
HTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
ResponseGET style.css
Response
index.html
style.cssbackground.jpg
GET index.html
Response
GET background.jpg
NSURLSession
NEW
PUSH 2, 3, n
HTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
ResponseGET style.css
Response
index.html
style.cssbackground.jpg
finish
GET index.html
Response
GET background.jpg
NSURLSession
NEW
PUSH 2, 3, n
HTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
ResponseGET style.css
Response
index.html
style.cssbackground.jpg
finish
HTTP/2 Server Push
GET index.html
Response
GET background.jpg
NSURLSession
NEW
PUSH 2, 3, n
HTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
App Server
ResponseGET style.css
Response
index.html
style.cssbackground.jpg
finish
HTTP/2 Server Push
GET index.html
Response
GET background.jpg
NSURLSession
NEW
PUSH 2, 3, n
HTTP/2 Server PushLoading
HTTP/1.1
LatencyTi
me
DemoHTTP/2 Server Push
Andreas Garkuscha Software Engineer, Internet Technologies
DemoHTTP/2 Server Push
Andreas Garkuscha Software Engineer, Internet Technologies
SummaryHTTP/2 Server Push
SummaryHTTP/2 Server Push
Server Push supported in NSURLSession
SummaryHTTP/2 Server Push
Server Push supported in NSURLSessionNo opt in, just works
SummaryHTTP/2 Server Push
Server Push supported in NSURLSessionNo opt in, just worksEven better performance
Network statisticsNSURLSession API
Network statisticsNSURLSession API NEW
Network statisticsNSURLSession API
Did you know?
NEW
Network statisticsNSURLSession API
Did you know?98% of all statistics are made up!
NEW
Network statisticsNSURLSession API
Did you know?98% of all statistics are made up!Network statistics: Performance, bugs, understanding
NEW
Network statisticsNSURLSession API
Did you know?98% of all statistics are made up!Network statistics: Performance, bugs, understandingCurrently supported on iOS, macOS, and tvOS
NEW
Network statistics delegateNSURLSession API NEW
Network statistics delegateNSURLSession API
func urlSession(_ session: NSURLSession, task: NSURLSessionTask,
didFinishCollecting metrics: NSURLSessionTaskMetrics)
NEW
NSURLSessionTaskMetricsNSURLSession API NEW
NSURLSessionTaskMetricsNSURLSession API
NSURLSessionTaskMetrics
NEW
NSURLSessionTaskMetricsNSURLSession API
taskInterval: NSDateInterval
NSURLSessionTaskMetrics
NEW
NSURLSessionTaskMetricsNSURLSession API
taskInterval: NSDateInterval
redirectCount: Int
NSURLSessionTaskMetrics
NEW
NSURLSessionTaskMetricsNSURLSession API
taskInterval: NSDateInterval
redirectCount: Int
transactionMetrics: [NSURLSessionTaskTransactionMetrics]
NSURLSessionTaskMetrics
NEW
NSURLSessionTaskMetricsNSURLSession API
taskInterval: NSDateInterval
redirectCount: Int
transactionMetrics: [NSURLSessionTaskTransactionMetrics]
NSURLSessionTaskMetrics
NSURLSessionTaskTransactionMetrics
NEW
Four Categories of Metrics
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
1 - Request and Response
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
1 - Request and Response
request: NSURLRequest
response: NSURLResponse?
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
1 - Request and Response
request: NSURLRequest
response: NSURLResponse?
…URL loading activity…request response
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
2 - Protocol and Connection
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
2 - Protocol and Connection
networkProtocolName: String?
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
2 - Protocol and Connection
networkProtocolName: String?
http/1.1h2spdy/3, spdy/3.1
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
2 - Protocol and Connection
networkProtocolName: String?
isProxyConnection: Bool
http/1.1h2spdy/3, spdy/3.1
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
2 - Protocol and Connection
networkProtocolName: String?
isProxyConnection: Bool
isReusedConnection: Bool
http/1.1h2spdy/3, spdy/3.1
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
3 - Load Info
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
3 - Load Info
resourceFetchType: NSURLSessionTaskMetricsResourceFetchType
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
3 - Load Info
resourceFetchType: NSURLSessionTaskMetricsResourceFetchType
.networkLoad
.localCache
.serverPush
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
4 - Connection Establishment and Transmission
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
4 - Connection Establishment and Transmission
fetchStartDate: NSDate?
domainLookupStartDate: NSDate?
domainLookupEndDate: NSDate?
connectStartDate: NSDate?
secureConnectionStartDate: NSDate?
secureConnectionEndDate: NSDate?
connectEndDate: NSDate?
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API
4 - Connection Establishment and Transmission
fetchStartDate: NSDate?
domainLookupStartDate: NSDate?
domainLookupEndDate: NSDate?
connectStartDate: NSDate?
secureConnectionStartDate: NSDate?
secureConnectionEndDate: NSDate?
connectEndDate: NSDate?
requestStartDate: NSDate?
requestEndDate: NSDate?
responseStartDate: NSDate?
responseEndDate: NSDate?
NEW
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
Task
fetchStart
Task
fetchStart
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
Task
fetchStart
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
Task
fetchStart
DNS
domainLookupStart
domainLookupEnd
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
Task
fetchStart
DNS
domainLookupStart
domainLookupEnd
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
Task
fetchStart
DNS
domainLookupStart
domainLookupEnd
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
Connection Establishment
connectEndconnectStart
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
Task
fetchStart
DNS
domainLookupStart
domainLookupEnd
Connection Establishment
connectEndconnectStart
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
Task
fetchStart
TCP
DNS
domainLookupStart
domainLookupEnd
Connection Establishment
connectEndconnectStart
Connection Establishment
connectEnd
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
Task
fetchStart TCP
connectStart
DNS
domainLookupStart
domainLookupEnd
NSURLSessionTaskTransactionMetricsNSURLSession API
Connection Establishment
connectEnd
NEW
Task
fetchStart TCP TLS
secureConnectionEnd
connectStart
secureConnectionStart
DNS
domainLookupStart
domainLookupEnd
NSURLSessionTaskTransactionMetricsNSURLSession API
Connection Establishment
connectEnd
NEW
Task
fetchStart TCP
connectStart
TLS
secureConnectionEndsecureConnectionStart
DNS
domainLookupStart
domainLookupEnd
NSURLSessionTaskTransactionMetricsNSURLSession API NEW
Connection Establishment
connectEnd
Task
fetchStart TCP TLS
secureConnectionEnd
connectStart
secureConnectionStart
DNS
domainLookupStart
domainLookupEnd
NSURLSessionTaskTransactionMetricsNSURLSession API
Connection Establishment
connectEnd
NEW
Task
fetchStart
DNS
domainLookupStart
domainLookupEnd
HTTP
TCP TLS
secureConnectionEndsecureConnectionStart
connectStart
NSURLSessionTaskTransactionMetricsNSURLSession API
Connection Establishment
connectEnd
NEW
Task
fetchStart
DNS
domainLookupStart
domainLookupEnd
TCP TLS
secureConnectionEnd
HTTPGET
requestStartrequestEnd
secureConnectionStart
connectStart
NSURLSessionTaskTransactionMetricsNSURLSession API
Connection Establishment
connectEnd
NEW
Task
fetchStart
DNS
domainLookupStart
domainLookupEnd
TCP TLS
secureConnectionEnd
HTTP
GET
requestStartrequestEnd
secureConnectionStart
connectStart
NSURLSessionTaskTransactionMetricsNSURLSession API
Connection Establishment
connectEnd
NEW
Task
fetchStart
DNS
domainLookupStart
domainLookupEnd
TCP TLS
secureConnectionEnd
HTTPGET
requestStartrequestEnd
200 OK
responseStart
responseEnd
secureConnectionStart
connectStart
NSURLSessionTaskTransactionMetricsNSURLSession API
Connection Establishment
connectEnd
NEW
Task
fetchStart
DNS
domainLookupStart
domainLookupEnd
TCP TLS
secureConnectionEnd
HTTPGET
requestStartrequestEnd
secureConnectionStart
connectStart
200 OK
responseStart
responseEnd
NSURLSessionTaskTransactionMetricsNSURLSession API
Connection Establishment
connectEnd
NEW
Task
fetchStart
DNS
domainLookupStart
domainLookupEnd
TCP TLS
secureConnectionEnd
HTTPGET
requestStartrequestEnd
200 OK
responseStart
responseEnd
secureConnectionStart
connectStart
NSURLSessionTaskTransactionMetricsNSURLSession API
Task
fetchStart
HTTPDNS
domainLookupStart
domainLookupEnd
Connection Establishment
connectEnd
200 OK
responseStart
responseEnd
NEW
TCP TLS
secureConnectionStart secureConnectionEnd
GET
requestStartrequestEnd
connectStart
NSURLSessionTaskTransactionMetricsNSURLSession API
Task
fetchStart
HTTP
Cache
DNS
domainLookupStart
domainLookupEnd
Connection Establishment
connectEnd
200 OK
responseStart
responseEnd
NEW
TCP TLS
secureConnectionStart secureConnectionEnd
GET
requestStartrequestEnd
connectStart
NSURLSessionTaskTransactionMetricsNSURLSession API
NSURLSessionTaskTransactionMetricsNSURLSession API
class MySessionDelegate: NSObject, NSURLSessionTaskDelegate { @objc(URLSession:task:didFinishCollectingMetrics:) func urlSession(_ session: NSURLSession, task: NSURLSessionTask, didFinishCollecting metrics: NSURLSessionTaskMetrics) {
//metrics.redirectCount //metrics.taskInterval //metrics.transactionMetrics[0].connectStartDate …
}
NSURLSessionTaskTransactionMetricsNSURLSession API
class MySessionDelegate: NSObject, NSURLSessionTaskDelegate { @objc(URLSession:task:didFinishCollectingMetrics:) func urlSession(_ session: NSURLSession, task: NSURLSessionTask, didFinishCollecting metrics: NSURLSessionTaskMetrics) {
//metrics.redirectCount //metrics.taskInterval //metrics.transactionMetrics[0].connectStartDate …
}
let myDelegate = MySessionDelegate()
NSURLSessionTaskTransactionMetricsNSURLSession API
class MySessionDelegate: NSObject, NSURLSessionTaskDelegate { @objc(URLSession:task:didFinishCollectingMetrics:) func urlSession(_ session: NSURLSession, task: NSURLSessionTask, didFinishCollecting metrics: NSURLSessionTaskMetrics) {
//metrics.redirectCount //metrics.taskInterval //metrics.transactionMetrics[0].connectStartDate …
}
let myDelegate = MySessionDelegate()
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
NSURLSessionTaskTransactionMetricsNSURLSession API
class MySessionDelegate: NSObject, NSURLSessionTaskDelegate { @objc(URLSession:task:didFinishCollectingMetrics:) func urlSession(_ session: NSURLSession, task: NSURLSessionTask, didFinishCollecting metrics: NSURLSessionTaskMetrics) {
//metrics.redirectCount //metrics.taskInterval //metrics.transactionMetrics[0].connectStartDate …
}
let myDelegate = MySessionDelegate()
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let myDelegateQueue = NSOperationQueue()
NSURLSessionTaskTransactionMetricsNSURLSession API
class MySessionDelegate: NSObject, NSURLSessionTaskDelegate { @objc(URLSession:task:didFinishCollectingMetrics:) func urlSession(_ session: NSURLSession, task: NSURLSessionTask, didFinishCollecting metrics: NSURLSessionTaskMetrics) {
//metrics.redirectCount //metrics.taskInterval //metrics.transactionMetrics[0].connectStartDate …
}
let myDelegate = MySessionDelegate()
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let myDelegateQueue = NSOperationQueue()
let session = NSURLSession(configuration: config, delegate: myDelegate, delegateQueue: myDelegateQueue)
NSURLSessionTaskTransactionMetricsNSURLSession API
class MySessionDelegate: NSObject, NSURLSessionTaskDelegate { @objc(URLSession:task:didFinishCollectingMetrics:) func urlSession(_ session: NSURLSession, task: NSURLSessionTask, didFinishCollecting metrics: NSURLSessionTaskMetrics) {
//metrics.redirectCount //metrics.taskInterval //metrics.transactionMetrics[0].connectStartDate …
}
let myDelegate = MySessionDelegate()
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let myDelegateQueue = NSOperationQueue()
let session = NSURLSession(configuration: config, delegate: myDelegate, delegateQueue: myDelegateQueue)
let url = NSURL(string: "https://www.example.com/")! let task = session.dataTask(with: url) { (data: NSData?, response: NSURLResponse?, error: NSError?) in … }
NSURLSessionTaskTransactionMetricsNSURLSession API
class MySessionDelegate: NSObject, NSURLSessionTaskDelegate { @objc(URLSession:task:didFinishCollectingMetrics:) func urlSession(_ session: NSURLSession, task: NSURLSessionTask, didFinishCollecting metrics: NSURLSessionTaskMetrics) {
//metrics.redirectCount //metrics.taskInterval //metrics.transactionMetrics[0].connectStartDate …
}
let myDelegate = MySessionDelegate()
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let myDelegateQueue = NSOperationQueue()
let session = NSURLSession(configuration: config, delegate: myDelegate, delegateQueue: myDelegateQueue)
let url = NSURL(string: "https://www.example.com/")! let task = session.dataTask(with: url) { (data: NSData?, response: NSURLResponse?, error: NSError?) in … }
task.resume()
NSURLSession APINetwork statistics
Summary
NSURLSession APINetwork statistics
Summary
Deep view into network loading
NSURLSession APINetwork statistics
Summary
Deep view into network loading
Faster debugging, easier profiling, better performance
NSURLSession APINetwork statistics
Summary
Deep view into network loading
Faster debugging, easier profiling, better performance
Available in NSURLSession
NSURLSession APINetwork statistics
Never an afterthoughtSecurity
SecurityTransport Layer Security
SecurityTransport Layer Security
Protects data
SecurityTransport Layer Security
Protects dataCipher—algorithm for encrypting/decrypting data
SecurityTransport Layer Security
Protects dataCipher—algorithm for encrypting/decrypting data
The RC4 cipher is no longer supported
Security
• Tuesday—Security session and labs
How iOS Security Really Works Nob Hill Tuesday 4:00PM
What's New in Security Nob Hill Tuesday 5:00PM
Transport Layer Security
Protects dataCipher—algorithm for encrypting/decrypting data
The RC4 cipher is no longer supported
nscurlSecurity
nscurlSecurity
$ nscurl https://insecure.example.com/
nscurlSecurity
$ nscurl https://insecure.example.com/
nscurl[1234:123456] NSURLSession/NSURLConnection HTTP load failed
(kCFStreamErrorDomainSSL, -9824)
nscurlSecurity
$ nscurl —-enable-rc4 https://insecure.example.com/
nscurlSecurity
$ nscurl —-enable-rc4 https://insecure.example.com/
Enabling RC4 cipher suites
<html><body><h1>It works!</h1></body></html>
App Transport Security
App Transport Security
NSAllowsArbitraryLoadsInWebContent
App Transport Security
NSAllowsArbitraryLoadsInWebContentNSRequiresCertificateTransparency
App Transport Security
NSAllowsArbitraryLoadsInWebContentNSRequiresCertificateTransparency
How iOS Security Really Works Nob Hill Tuesday 4:00PM
What's New in Security Nob Hill Tuesday 5:00PM
Summary
Summary
NSURLSession
Summary
• HTTP/2 Server Push
NSURLSession
Summary
• HTTP/2 Server Push Performance!
NSURLSession
Summary
• HTTP/2 Server Push Performance!
• Network statistics
NSURLSession
Summary
• HTTP/2 Server Push Performance!
• Network statistics Faster and better analysis of applications
NSURLSession
Summary
• HTTP/2 Server Push Performance!
• Network statistics• Security
Faster and better analysis of applications
NSURLSession
Summary
• HTTP/2 Server Push Performance!
• Network statistics• Security
Faster and better analysis of applications
Protect user data
NSURLSession
Summary
• HTTP/2 Server Push Performance!
• Network statistics• Security
Faster and better analysis of applications
Protect user data
NSURLSession in your applications!
NSURLSession
More Information
https://developer.apple.com/wwdc16/711
Related Sessions
What’s New in Foundation for Swift Mission Tuesday 4:00PM
What’s New in Security Nob Hill Tuesday 5:00PM
Engineering Privacy for Your Users Pacific Heights Wednesday 4:00PM
Networking for the Modern Internet Pacific Heights Thursday 3:00PM
Related Labs
Networking Lab 1 Frameworks Lab B Thursday 4:00PM
Networking Lab 2 Frameworks Lab D Friday 2:00PM
Top Related