NSURLSession: New Features and Best Practices · Benefits NSURLSession Example HTTP/1.1, SPDY,...

Preview:

Citation preview

© 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

Recommended