iOS URL Loading System: Go Beyond
Upcoming SlideShare
Loading in...5
×
 

iOS URL Loading System: Go Beyond

on

  • 1,237 views

 

Statistics

Views

Total Views
1,237
Views on SlideShare
1,237
Embed Views
0

Actions

Likes
0
Downloads
19
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

iOS URL Loading System: Go Beyond iOS URL Loading System: Go Beyond Presentation Transcript

  • 1пятница, 4 октября 13 г.
  • iOS URL Loading System: Go Beyond Alexey Dodonov 2пятница, 4 октября 13 г.
  • 3 3пятница, 4 октября 13 г.
  • 4пятница, 4 октября 13 г.
  • Network Activity Log 5 Log all network requests Simple way to see all events for every request HTTP headers and other related information Received/sent data for any request in different formats Including HTTPS requests 5пятница, 4 октября 13 г.
  • 2013-09-23 12:43:43.136 Start loading 2013-09-23 12:43:43.138 Will send request 2013-09-23 12:43:43.152 Received response Response: 200 Header fields:{ "Cache-Control" = "no-cache"; Connection = "keep-alive"; "Content-Encoding" = gzip; "Content-Length" = 351; "Content-Type" = "text/xml; encoding=utf-8"; Date = "Mon, 23 Sep 2013 08:43:34 GMT"; Server = "nginx/1.2.1"; "X-YaMisc" = "region_id=9999;"; "X-YaReqFinish" = "1379925814.110185"; } 2013-09-23 12:43:43.153 Did receive data (685 bytes). 2013-09-23 12:43:43.153 Did finish loading. 2013-09-23 12:43:43.154 Stop loading 2013-09-23 12:43:44.169 Received response Response: 200 Header fields:{ Connection = close; "Content-Length" = 0; "Content-Type" = "application/octet-stream"; Date = "Mon, 23 Sep 2013 08:43:35 GMT"; Server = nginx; } 2013-09-23 12:43:44.169 Did finish loading. 2013-09-23 12:43:44.170 Stop loading 2013-09-23 12:43:58.314 Initialized URL: http://www.yandex.com/?clid=2035378 HTTP Method: GET HTTP Headers: { Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; "User-Agent" = "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A465"; Network Activity Log 6 NSLog(...) 6пятница, 4 октября 13 г.
  • "Content-Encoding" = gzip; "Content-Type" = "text/css"; Date = "Mon, 23 Sep 2013 08:43:49 GMT"; Expires = "Thu, 31 Dec 2037 23:55:55 GMT"; "Last-Modified" = "Thu, 19 Sep 2013 18:25:56 GMT"; Server = "nginx/1.4.1"; "Transfer-Encoding" = Identity; } 2013-09-23 12:43:58.476 Did receive data (23122 bytes). 2013-09-23 12:43:58.477 Did finish loading. 2013-09-23 12:43:58.477 Initialized URL: http://yandex.st/www/1.686/com/pages-desktop/index/_index.js HTTP Method: GET HTTP Headers: { Accept = "*/*"; Referer = "http://www.yandex.com/"; "User-Agent" = "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A465"; } HTTP Body: 2013-09-23 12:43:58.477 Start loading 2013-09-23 12:43:58.478 Will send request 2013-09-23 12:43:58.478 Start loading 2013-09-23 12:43:58.478 Will send request 2013-09-23 12:43:58.480 Received response Response: 200 Header fields:{ "Access-Control-Allow-Origin" = "*"; "Cache-Control" = "max-age=315360000"; Connection = "keep-alive"; "Content-Encoding" = gzip; "Content-Type" = "application/x-javascript"; Date = "Mon, 23 Sep 2013 08:43:49 GMT"; Expires = "Thu, 31 Dec 2037 23:55:55 GMT"; "Last-Modified" = "Thu, 10 May 2012 20:10:56 GMT"; Server = "nginx/1.4.1"; "Transfer-Encoding" = Identity; } 2013-09-23 12:43:58.480 Did receive data (1553 bytes). 2013-09-23 12:43:58.481 Did finish loading. 2013-09-23 12:43:58.482 Received response Response: 200 Header fields:{ "Accept-Ranges" = bytes; "Access-Control-Allow-Origin" = "*"; "Cache-Cont Network Activity Log 6 NSLog(...) 6пятница, 4 октября 13 г.
  • Network Activity Log 3rd party instruments Wireshark Charles Fiddler mitmproxy – They are all good, but we want a look from inside the application. 7 7пятница, 4 октября 13 г.
  • Test Networking 8 Test application state after making network requests: – with various responses. Test application state if a network request fails due to numerous reasons: – different HTTP status codes, – timeout, – etc. 8пятница, 4 октября 13 г.
  • Test Networking 9 Mock NSURLConnection github.com/wfleming/MockNSURLConnection bit.ly/yac_nsurlprotocol (all links for this talk) – NSURLConnection objects are often hidden from the public interface. – It does not work if you use another framework like AFNetworking. 9пятница, 4 октября 13 г.
  • Hybrid Applications 10 UIWebView as the main interface. Ship static resources within the application bundle. Smart caching. 10пятница, 4 октября 13 г.
  • Extend iOS Networking 11 UIWebView support for new media formats – WebP – WebM 11пятница, 4 октября 13 г.
  • Extend iOS Networking 11 UIWebView support for new media formats – WebP – WebM Application-wide support for new protocols – SPDY 11пятница, 4 октября 13 г.
  • NSURLProtocol 12пятница, 4 октября 13 г.
  • NSURLProtocol 13 NSURLConnection Frameworks Application UIWebview NSURLProtocol Network 13пятница, 4 октября 13 г.
  • 14 NSURLConnection file:// NSURLProtocol ftp:// https:// http:// 14пятница, 4 октября 13 г.
  • @interface MyProtocol : NSURLProtocol @end [NSURLProtocol registerClass:[MyProtocol class]]; NSURLProtocol 15 Registration of the new protocol: 15пятница, 4 октября 13 г.
  • 16 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 16пятница, 4 октября 13 г.
  • 16 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 16пятница, 4 октября 13 г.
  • 16 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 16пятница, 4 октября 13 г.
  • + (BOOL)canInitWithRequest:(NSURLRequest *)request { return [[[request URL] scheme] isEqual:@"xmpp"]; } NSURLProtocol 17 Can we handle this request? 17пятница, 4 октября 13 г.
  • 18 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 18пятница, 4 октября 13 г.
  • 18 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 18пятница, 4 октября 13 г.
  • 18 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 18пятница, 4 октября 13 г.
  • 18 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 18пятница, 4 октября 13 г.
  • NSURLProtocol 19 NSURLProtocolNSURLConnection Client NSURLConnection Delegate – URLProtocol:didReceiveResponse:cacheStoragePolicy:  required method – URLProtocol:didLoadData:  required method – URLProtocolDidFinishLoading:  required method – URLProtocol:didFailWithError:  required method – ... 19пятница, 4 октября 13 г.
  • NSURLProtocol 19 NSURLProtocolNSURLConnection Client NSURLConnection Delegate – URLProtocol:didReceiveResponse:cacheStoragePolicy:  required method – URLProtocol:didLoadData:  required method – URLProtocolDidFinishLoading:  required method – URLProtocol:didFailWithError:  required method – ... 19пятница, 4 октября 13 г.
  • NSURLProtocol 19 NSURLProtocolNSURLConnection Client NSURLConnection Delegate – URLProtocol:didReceiveResponse:cacheStoragePolicy:  required method – URLProtocol:didLoadData:  required method – URLProtocolDidFinishLoading:  required method – URLProtocol:didFailWithError:  required method – ... 19пятница, 4 октября 13 г.
  • 20пятница, 4 октября 13 г.
  • Network Activity Log 21 Log all network requests Simple way to see all events for every request HTTP headers and other related information Received/sent data for any request in different formats Including HTTPS requests 21пятница, 4 октября 13 г.
  • Network Activity Log 22 NSURLConnection Logger NSURLConnection iOS URLProtocols 22пятница, 4 октября 13 г.
  • Network Activity Log 22 NSURLConnection Logger NSURLConnection iOS URLProtocols 22пятница, 4 октября 13 г.
  • Network Activity Log 22 NSURLConnection Logger NSURLConnection iOS URLProtocols 22пятница, 4 октября 13 г.
  • Network Activity Log 22 NSURLConnection Logger NSURLConnection iOS URLProtocols 22пятница, 4 октября 13 г.
  • NSMutableURLRequest *mutableRequest = [request mutableCopy]; [NSURLProtocol setProperty:@"marker" forKey:@"markerKey" inRequest:mutableRequest]; Network Activity Log 23 Outgoing request 23пятница, 4 октября 13 г.
  • + (BOOL)canInitWithRequest:(NSURLRequest *)request { id marker = [NSURLProtocol propertyForKey:@"markerKey" inRequest:request]; return (marker == nil); } Network Activity Log 24 Incoming request 24пятница, 4 октября 13 г.
  • Network Activity Log 25 iOS URLProtocols LoggerNSURLConnection NSURLConnection NSURLProtocol 25пятница, 4 октября 13 г.
  • Network Activity Log 25 iOS URLProtocols LoggerNSURLConnection NSURLConnection NSURLProtocol 25пятница, 4 октября 13 г.
  • Network Activity Log 26 Objective-C HTTP Server github.com/robbiehanson/CocoaHTTPServer bit.ly/yac_nsurlprotocol github.com/mattstevens/RoutingHTTPServer github.com/stevestreza/Barista 26пятница, 4 октября 13 г.
  • Network Activity Log 27 localhost:8080 27пятница, 4 октября 13 г.
  • Network Activity Log 28 URLProtocol Logger Sample Code github.com/dodonov/YACURLProtocolLogger bit.ly/yac_nsurlprotocol 28пятница, 4 октября 13 г.
  • Test Networking 29 Test application state after making network requests: – with various responses. Test application state if a network request fails due to numerous reasons: – different HTTP status codes, – timeout, – etc. 29пятница, 4 октября 13 г.
  • Test Networking 30 Special Test ProtocolNSURLConnection iOS URLProtocols NSURLConnection Delegate 30пятница, 4 октября 13 г.
  • Test Networking 30 Special Test ProtocolNSURLConnection iOS URLProtocols NSURLConnection Delegate 30пятница, 4 октября 13 г.
  • Test Networking 30 Special Test ProtocolNSURLConnection iOS URLProtocols NSURLConnection Delegate 30пятница, 4 октября 13 г.
  • Test Networking 31 Sample test - (void)testImageLoader { [NSURLProtocol registerClass:[ILCannedURLProtocol class]]; [ILCannedURLProtocol setCannedStatusCode:500]; [ILCannedURLProtocol setSupportedBaseURL:[NSURL URLWithString:@"yandex.ru"]]; ImageLoader *loader = [[ImageLoader alloc] init]; [loader load]; NSAssert([loader hasBadResponse], @"Loader should have bad response"); [NSURLProtocol unregisterClass:[ILCannedURLProtocol class]]; } 31пятница, 4 октября 13 г.
  • Test Networking 31 Sample test - (void)testImageLoader { [NSURLProtocol registerClass:[ILCannedURLProtocol class]]; [ILCannedURLProtocol setCannedStatusCode:500]; [ILCannedURLProtocol setSupportedBaseURL:[NSURL URLWithString:@"yandex.ru"]]; ImageLoader *loader = [[ImageLoader alloc] init]; [loader load]; NSAssert([loader hasBadResponse], @"Loader should have bad response"); [NSURLProtocol unregisterClass:[ILCannedURLProtocol class]]; } 31пятница, 4 октября 13 г.
  • Test Networking 31 Sample test - (void)testImageLoader { [NSURLProtocol registerClass:[ILCannedURLProtocol class]]; [ILCannedURLProtocol setCannedStatusCode:500]; [ILCannedURLProtocol setSupportedBaseURL:[NSURL URLWithString:@"yandex.ru"]]; ImageLoader *loader = [[ImageLoader alloc] init]; [loader load]; NSAssert([loader hasBadResponse], @"Loader should have bad response"); [NSURLProtocol unregisterClass:[ILCannedURLProtocol class]]; } 31пятница, 4 октября 13 г.
  • Test Networking 31 Sample test - (void)testImageLoader { [NSURLProtocol registerClass:[ILCannedURLProtocol class]]; [ILCannedURLProtocol setCannedStatusCode:500]; [ILCannedURLProtocol setSupportedBaseURL:[NSURL URLWithString:@"yandex.ru"]]; ImageLoader *loader = [[ImageLoader alloc] init]; [loader load]; NSAssert([loader hasBadResponse], @"Loader should have bad response"); [NSURLProtocol unregisterClass:[ILCannedURLProtocol class]]; } 31пятница, 4 октября 13 г.
  • Test Networking 31 Sample test - (void)testImageLoader { [NSURLProtocol registerClass:[ILCannedURLProtocol class]]; [ILCannedURLProtocol setCannedStatusCode:500]; [ILCannedURLProtocol setSupportedBaseURL:[NSURL URLWithString:@"yandex.ru"]]; ImageLoader *loader = [[ImageLoader alloc] init]; [loader load]; NSAssert([loader hasBadResponse], @"Loader should have bad response"); [NSURLProtocol unregisterClass:[ILCannedURLProtocol class]]; } 31пятница, 4 октября 13 г.
  • Test Networking 31 Sample test - (void)testImageLoader { [NSURLProtocol registerClass:[ILCannedURLProtocol class]]; [ILCannedURLProtocol setCannedStatusCode:500]; [ILCannedURLProtocol setSupportedBaseURL:[NSURL URLWithString:@"yandex.ru"]]; ImageLoader *loader = [[ImageLoader alloc] init]; [loader load]; NSAssert([loader hasBadResponse], @"Loader should have bad response"); [NSURLProtocol unregisterClass:[ILCannedURLProtocol class]]; } 31пятница, 4 октября 13 г.
  • Test Networking 31 Sample test - (void)testImageLoader { [NSURLProtocol registerClass:[ILCannedURLProtocol class]]; [ILCannedURLProtocol setCannedStatusCode:500]; [ILCannedURLProtocol setSupportedBaseURL:[NSURL URLWithString:@"yandex.ru"]]; ImageLoader *loader = [[ImageLoader alloc] init]; [loader load]; NSAssert([loader hasBadResponse], @"Loader should have bad response"); [NSURLProtocol unregisterClass:[ILCannedURLProtocol class]]; } 31пятница, 4 октября 13 г.
  • Test Networking 31 Sample test - (void)testImageLoader { [NSURLProtocol registerClass:[ILCannedURLProtocol class]]; [ILCannedURLProtocol setCannedStatusCode:500]; [ILCannedURLProtocol setSupportedBaseURL:[NSURL URLWithString:@"yandex.ru"]]; ImageLoader *loader = [[ImageLoader alloc] init]; [loader load]; NSAssert([loader hasBadResponse], @"Loader should have bad response"); [NSURLProtocol unregisterClass:[ILCannedURLProtocol class]]; } 31пятница, 4 октября 13 г.
  • Test Networking 32 Testing via NSURLProtocol github.com/InfiniteLoopDK/ILTesting bit.ly/yac_nsurlprotocol github.com/AliSoftware/OHHTTPStubs 32пятница, 4 октября 13 г.
  • Hybrid Applications 33 UIWebView as the main interface. Ship static resources within the application bundle. Smart caching. 33пятница, 4 октября 13 г.
  • Hybrid Applications 34 local-img:// 34пятница, 4 октября 13 г.
  • <img src="local-img://top-left-border.png"> Hybrid Applications 35 Sample html code: 35пятница, 4 октября 13 г.
  • + (BOOL)canInitWithRequest:(NSURLRequest *)request { return [[[request URL] scheme] isEqual:@"local-img"]; } Hybrid Applications 36 URLProtocol 36пятница, 4 октября 13 г.
  • Hybrid Applications 37 - (void)startLoading { NSString *imagePath = [[NSBundle mainBundle] pathForResource:self.imageName ofType:self.extension]; NSData *data = [NSData dataWithContentsOfFile:imagePath]; NSURLResponse *response =[[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:nil expectedContentLength:[data length] textEncodingName:nil]; [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; [[self client] URLProtocol:self didLoadData:data]; [[self client] URLProtocolDidFinishLoading:self]; } 37пятница, 4 октября 13 г.
  • Hybrid Applications 37 - (void)startLoading { NSString *imagePath = [[NSBundle mainBundle] pathForResource:self.imageName ofType:self.extension]; NSData *data = [NSData dataWithContentsOfFile:imagePath]; NSURLResponse *response =[[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:nil expectedContentLength:[data length] textEncodingName:nil]; [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; [[self client] URLProtocol:self didLoadData:data]; [[self client] URLProtocolDidFinishLoading:self]; } 37пятница, 4 октября 13 г.
  • Hybrid Applications 37 - (void)startLoading { NSString *imagePath = [[NSBundle mainBundle] pathForResource:self.imageName ofType:self.extension]; NSData *data = [NSData dataWithContentsOfFile:imagePath]; NSURLResponse *response =[[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:nil expectedContentLength:[data length] textEncodingName:nil]; [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; [[self client] URLProtocol:self didLoadData:data]; [[self client] URLProtocolDidFinishLoading:self]; } 37пятница, 4 октября 13 г.
  • Hybrid Applications 37 - (void)startLoading { NSString *imagePath = [[NSBundle mainBundle] pathForResource:self.imageName ofType:self.extension]; NSData *data = [NSData dataWithContentsOfFile:imagePath]; NSURLResponse *response =[[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:nil expectedContentLength:[data length] textEncodingName:nil]; [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; [[self client] URLProtocol:self didLoadData:data]; [[self client] URLProtocolDidFinishLoading:self]; } 37пятница, 4 октября 13 г.
  • Hybrid Applications 37 - (void)startLoading { NSString *imagePath = [[NSBundle mainBundle] pathForResource:self.imageName ofType:self.extension]; NSData *data = [NSData dataWithContentsOfFile:imagePath]; NSURLResponse *response =[[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:nil expectedContentLength:[data length] textEncodingName:nil]; [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; [[self client] URLProtocol:self didLoadData:data]; [[self client] URLProtocolDidFinishLoading:self]; } 37пятница, 4 октября 13 г.
  • Hybrid Applications 37 - (void)startLoading { NSString *imagePath = [[NSBundle mainBundle] pathForResource:self.imageName ofType:self.extension]; NSData *data = [NSData dataWithContentsOfFile:imagePath]; NSURLResponse *response =[[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:nil expectedContentLength:[data length] textEncodingName:nil]; [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; [[self client] URLProtocol:self didLoadData:data]; [[self client] URLProtocolDidFinishLoading:self]; } 37пятница, 4 октября 13 г.
  • Hybrid Applications 38 NSURLImageProtocol github.com/xr1337/NSURLImageProtocol bit.ly/yac_nsurlprotocol 38пятница, 4 октября 13 г.
  • Hybrid Applications 39 Smart Cache github.com/rnapier/RNCachingURLProtocol bit.ly/yac_nsurlprotocol github.com/artifacts/AFCache 39пятница, 4 октября 13 г.
  • Extend iOS Networking 40 UIWebView support for new media formats – WebP – WebM Application-wide support for new protocols – SPDY 40пятница, 4 октября 13 г.
  • Extend iOS Networking 41 ProtocolNSURLConnection NSURLConnection NSURLConnection Delegate Converter WebPPNG 41пятница, 4 октября 13 г.
  • Extend iOS Networking 41 ProtocolNSURLConnection NSURLConnection NSURLConnection Delegate Converter WebPPNG 41пятница, 4 октября 13 г.
  • Extend iOS Networking 42 WebP Decoding github.com/cysp/STWebPDecoder bit.ly/yac_nsurlprotocol 42пятница, 4 октября 13 г.
  • Replace iOS Networking 43 Protocol Chromium Network Stack iOS Network Stack NSURLConnection 43пятница, 4 октября 13 г.
  • 44пятница, 4 октября 13 г.
  • Bonus stage NSURLProtocol in the Mothership 45пятница, 4 октября 13 г.
  • NSURLProtocol in the Mothership NSCFURLProtocol NSCFURLProtocolBridge NSCFURLProtocolBridgeWithTrampoline 46 46пятница, 4 октября 13 г.
  • NSURLProtocol in the Mothership MFMessageURLProtocol – x-msg: – cid: – x-cid: MFMessageWebProtocol – x-apple-msg-load: CKMessagePartURLProtocol – x-ckmsgpart: QLPreviewURLProtocol – x-apple-ql-id:// UUID/x-apple-ql-magic SUWebImagePoolURLProtocol – x-itmsimg: 47 47пятница, 4 октября 13 г.
  • NSURLProtocol in the Mothership NSAboutURLProtocol – about: 48 48пятница, 4 октября 13 г.
  • Thank you! 49пятница, 4 октября 13 г.
  • 50 Alexey Dodonov iOS Developer iosdev@yandex.ru @ddnv 50пятница, 4 октября 13 г.