iOS URL Loading System: Go Beyond

1,737
-1

Published on

Published in: Technology, Business
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,737
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
26
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

iOS URL Loading System: Go Beyond

  1. 1. 1пятница, 4 октября 13 г.
  2. 2. iOS URL Loading System: Go Beyond Alexey Dodonov 2пятница, 4 октября 13 г.
  3. 3. 3 3пятница, 4 октября 13 г.
  4. 4. 4пятница, 4 октября 13 г.
  5. 5. 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 г.
  6. 6. 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 г.
  7. 7. "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 г.
  8. 8. 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 г.
  9. 9. 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 г.
  10. 10. 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 г.
  11. 11. Hybrid Applications 10 UIWebView as the main interface. Ship static resources within the application bundle. Smart caching. 10пятница, 4 октября 13 г.
  12. 12. Extend iOS Networking 11 UIWebView support for new media formats – WebP – WebM 11пятница, 4 октября 13 г.
  13. 13. Extend iOS Networking 11 UIWebView support for new media formats – WebP – WebM Application-wide support for new protocols – SPDY 11пятница, 4 октября 13 г.
  14. 14. NSURLProtocol 12пятница, 4 октября 13 г.
  15. 15. NSURLProtocol 13 NSURLConnection Frameworks Application UIWebview NSURLProtocol Network 13пятница, 4 октября 13 г.
  16. 16. 14 NSURLConnection file:// NSURLProtocol ftp:// https:// http:// 14пятница, 4 октября 13 г.
  17. 17. @interface MyProtocol : NSURLProtocol @end [NSURLProtocol registerClass:[MyProtocol class]]; NSURLProtocol 15 Registration of the new protocol: 15пятница, 4 октября 13 г.
  18. 18. 16 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 16пятница, 4 октября 13 г.
  19. 19. 16 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 16пятница, 4 октября 13 г.
  20. 20. 16 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 16пятница, 4 октября 13 г.
  21. 21. + (BOOL)canInitWithRequest:(NSURLRequest *)request { return [[[request URL] scheme] isEqual:@"xmpp"]; } NSURLProtocol 17 Can we handle this request? 17пятница, 4 октября 13 г.
  22. 22. 18 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 18пятница, 4 октября 13 г.
  23. 23. 18 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 18пятница, 4 октября 13 г.
  24. 24. 18 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 18пятница, 4 октября 13 г.
  25. 25. 18 NSURLConnection NSURLProtocol xmmp:// ftp:// http:// iOS URLProtocols http:// NSURLRequest 18пятница, 4 октября 13 г.
  26. 26. 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 г.
  27. 27. 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 г.
  28. 28. 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 г.
  29. 29. 20пятница, 4 октября 13 г.
  30. 30. 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 г.
  31. 31. Network Activity Log 22 NSURLConnection Logger NSURLConnection iOS URLProtocols 22пятница, 4 октября 13 г.
  32. 32. Network Activity Log 22 NSURLConnection Logger NSURLConnection iOS URLProtocols 22пятница, 4 октября 13 г.
  33. 33. Network Activity Log 22 NSURLConnection Logger NSURLConnection iOS URLProtocols 22пятница, 4 октября 13 г.
  34. 34. Network Activity Log 22 NSURLConnection Logger NSURLConnection iOS URLProtocols 22пятница, 4 октября 13 г.
  35. 35. NSMutableURLRequest *mutableRequest = [request mutableCopy]; [NSURLProtocol setProperty:@"marker" forKey:@"markerKey" inRequest:mutableRequest]; Network Activity Log 23 Outgoing request 23пятница, 4 октября 13 г.
  36. 36. + (BOOL)canInitWithRequest:(NSURLRequest *)request { id marker = [NSURLProtocol propertyForKey:@"markerKey" inRequest:request]; return (marker == nil); } Network Activity Log 24 Incoming request 24пятница, 4 октября 13 г.
  37. 37. Network Activity Log 25 iOS URLProtocols LoggerNSURLConnection NSURLConnection NSURLProtocol 25пятница, 4 октября 13 г.
  38. 38. Network Activity Log 25 iOS URLProtocols LoggerNSURLConnection NSURLConnection NSURLProtocol 25пятница, 4 октября 13 г.
  39. 39. 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 г.
  40. 40. Network Activity Log 27 localhost:8080 27пятница, 4 октября 13 г.
  41. 41. Network Activity Log 28 URLProtocol Logger Sample Code github.com/dodonov/YACURLProtocolLogger bit.ly/yac_nsurlprotocol 28пятница, 4 октября 13 г.
  42. 42. 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 г.
  43. 43. Test Networking 30 Special Test ProtocolNSURLConnection iOS URLProtocols NSURLConnection Delegate 30пятница, 4 октября 13 г.
  44. 44. Test Networking 30 Special Test ProtocolNSURLConnection iOS URLProtocols NSURLConnection Delegate 30пятница, 4 октября 13 г.
  45. 45. Test Networking 30 Special Test ProtocolNSURLConnection iOS URLProtocols NSURLConnection Delegate 30пятница, 4 октября 13 г.
  46. 46. 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 г.
  47. 47. 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 г.
  48. 48. 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 г.
  49. 49. 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 г.
  50. 50. 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 г.
  51. 51. 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 г.
  52. 52. 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 г.
  53. 53. 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 г.
  54. 54. Test Networking 32 Testing via NSURLProtocol github.com/InfiniteLoopDK/ILTesting bit.ly/yac_nsurlprotocol github.com/AliSoftware/OHHTTPStubs 32пятница, 4 октября 13 г.
  55. 55. Hybrid Applications 33 UIWebView as the main interface. Ship static resources within the application bundle. Smart caching. 33пятница, 4 октября 13 г.
  56. 56. Hybrid Applications 34 local-img:// 34пятница, 4 октября 13 г.
  57. 57. <img src="local-img://top-left-border.png"> Hybrid Applications 35 Sample html code: 35пятница, 4 октября 13 г.
  58. 58. + (BOOL)canInitWithRequest:(NSURLRequest *)request { return [[[request URL] scheme] isEqual:@"local-img"]; } Hybrid Applications 36 URLProtocol 36пятница, 4 октября 13 г.
  59. 59. 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 г.
  60. 60. 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 г.
  61. 61. 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 г.
  62. 62. 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 г.
  63. 63. 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 г.
  64. 64. 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 г.
  65. 65. Hybrid Applications 38 NSURLImageProtocol github.com/xr1337/NSURLImageProtocol bit.ly/yac_nsurlprotocol 38пятница, 4 октября 13 г.
  66. 66. Hybrid Applications 39 Smart Cache github.com/rnapier/RNCachingURLProtocol bit.ly/yac_nsurlprotocol github.com/artifacts/AFCache 39пятница, 4 октября 13 г.
  67. 67. Extend iOS Networking 40 UIWebView support for new media formats – WebP – WebM Application-wide support for new protocols – SPDY 40пятница, 4 октября 13 г.
  68. 68. Extend iOS Networking 41 ProtocolNSURLConnection NSURLConnection NSURLConnection Delegate Converter WebPPNG 41пятница, 4 октября 13 г.
  69. 69. Extend iOS Networking 41 ProtocolNSURLConnection NSURLConnection NSURLConnection Delegate Converter WebPPNG 41пятница, 4 октября 13 г.
  70. 70. Extend iOS Networking 42 WebP Decoding github.com/cysp/STWebPDecoder bit.ly/yac_nsurlprotocol 42пятница, 4 октября 13 г.
  71. 71. Replace iOS Networking 43 Protocol Chromium Network Stack iOS Network Stack NSURLConnection 43пятница, 4 октября 13 г.
  72. 72. 44пятница, 4 октября 13 г.
  73. 73. Bonus stage NSURLProtocol in the Mothership 45пятница, 4 октября 13 г.
  74. 74. NSURLProtocol in the Mothership NSCFURLProtocol NSCFURLProtocolBridge NSCFURLProtocolBridgeWithTrampoline 46 46пятница, 4 октября 13 г.
  75. 75. 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 г.
  76. 76. NSURLProtocol in the Mothership NSAboutURLProtocol – about: 48 48пятница, 4 октября 13 г.
  77. 77. Thank you! 49пятница, 4 октября 13 г.
  78. 78. 50 Alexey Dodonov iOS Developer iosdev@yandex.ru @ddnv 50пятница, 4 октября 13 г.

×