�ɤ��⡢��iOS Advent Calendar 2011��5����ô����faultier�Ǥ����Ĥ��Ƕ�Ȥä��Τ�NSURLProtocol�ͥ��ǡ�
NSURLProtocol�äƲ���
Foundation�ե졼�����Ǻǽ餫�鰷����ץ��ȥ����http��https��ftp��file��4�ġ�����ʳ��Υץ��ȥ���Ǥ��̿���NSURLConnection��NSURLDownload�ʤɤǰ������䡢����Υꥯ�����Ȥ˸¤ä����̤ʽ����򤷤������ʤɤˡ�NSURLProtocol��Ѿ�������Ͽ���뤳�ȤǻȤ���褦�ˤʤ롣���ʤߤˡ�¾�Υ��ץ꤫��openURL�����Ȥ��˥��ץ��ư�����륫������URL��������ȤϤޤ��̤ʤΤ����ա�������ϥ��ץ����URL Loading System��Ȥ��Ȥ��ˤ����ƶ������Ρ�
�Ȥ���
�����ɬ�פʤΤϡ�+canInitWithRequest:��+canonicalRequestForRequest:��-startLoading��-stopLoading��4�ġ�
�ޤ��Ϥ���ʴ����ǡ��ɤ�ʥꥯ�����ȤΤȤ��ˤ���URLProtocol�򤬽�������Τ�����롣
+ (BOOL)canInitWithRequest:(NSURLRequest *)request { return [[[request URL] scheme] isEqualToString:@"udon"]; }
������YES���֤��Ȥ��Υ��饹�����󥹥��󥹲�������̿������˿ʤࡣNO�ξ���¾����Ͽ����Ƥ���URLProtocol�Τ��Υ᥽�åɤ���Ͽ���εս�˸ƤФ�ƹԤ������ξ���udon�Ȥ����������ࡢ�㤨��udon://marukame/bukkake/cool�ߤ�����URL�ؤΥꥯ�����Ȥλ��˽����򤹤뤳�Ȥˤʤ롣�̤ˤ�����ȼ��Υ�������Ǥ���ɬ�פǤϤʤ���http��file�ʤɤ�եå����뤳�Ȥ�Ǥ��뤷������Υۥ��Ȥ��ü�ʥإå����դ��Ƥ����������������褦�ʤ��Ȥ�Ǥ��롣
����+canonicalRequestForRequest:���ꥯ�����Ȥ�canonical�ʷ����Ѥ���ɬ�פ�������Ϥ�����Ϯ��Τ����ɡ��ä˲��⤹�뤳�Ȥ�̵�����request�򤽤Τޤ��֤��Ƥ��Ф�����
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { return request; }
���θ�ºݤ��̿����Ϥޤꡢ-startLoading���ƤФ�롣NSURLProtocol�Υ��֥������Ȥϡ�id<NSURLProtocolClient>��client�ȡ�NSURLRequest��request�Ȥ����ץ��ѥƥ�����äƤ���Τǡ�request����ɤ�ʥ꥽������ɬ�פʤΤ���Ƚ�Ǥ��ơ�client���Ф��ƥǡ������֤��Ƥ�롢�Ȥ��������̿�����Ѥ򤹤롣NSURLProtocolClient�Υ᥽�åɤ�����NSURLConnection��delegate���б����Ƥ���Τǡ�NSURLConnection�Ǥ��̿�������������Ȥ������ʬ����Ϥ���NSURLConnection¦�ǥ���󥻥뤵�줿�Ȥ���stopLoading���ƤФ�롣��ñ����Ȥ��Ƥϰʲ��Τ褦�ˤʤ롣
- (void)startLoading { // ������Ʊ�����̿�����Τ����ɡ� // ������Ǥ�ñ��ʸ����ǡ������֤������ʤΤǡ� // ���ξ���֤��Ƥ��ޤ� NSData *data = [@"���ɤ󤬿��٤���" dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *headers = [NSDictionary dictionaryWithObjectsAndKeys: @"text/plain", @"Content-Type", [NSString stringWithFormat:@"%d", [data length]], @"Content-Length", nil]; NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:[self.request URL] statusCode:200 HTTPVersion:@"1.1" headerFields:headers]; // NSURLResponse�Υ��֥������Ȥ��֤��� [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowedInMemoryOnly]; // �ǡ������Ϥ��� [self.client URLProtocol:self didLoadData:data]; // �̿���λ�� // �̿����Ԥξ��� -URLProtocol:didFailWithError:��Ƥ֡� [self.client URLProtocolDidFinishLoading:self]; } - (void)stopLoading { // ������Ǥϥ���󥻥뤷�褦��̵���� // �������̤�NSURLConnection��ȤäƤ����ꡢ // NSOperationQueue��GCD�ʤɤ���Ʊ�������򤷤Ƥ����硢 // �����ǥ���󥻥�ν�����¹Ԥ��롣 }
�����������udon��������Ϥޤ�URL Loading System����Ͽ����Ƥ��ʤ��Τǡ�Ŭ��NSURLProtocol��+registerClass:��+unregisterClass:�Ƥ�Ǥ����뤳�ȤǻȤ���褦�ˤʤ롣�����ȼ����������Ȥ�UIViewController�Ȥ������뤤�Ϥ⤦���饹��load�᥽�åɤ���Ͽ���Ƥ��ޤ��Ȥ���
+ (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [NSURLProtocol registerClass:[self class]]; }); }
�Ȥ��ɤ���
����ɤ������Ȥ��˻Ȥ��Ρ�http�ʳ��Υץ��ȥ���Ȥ�����ʼ������ʤ��衩�Ȼפ����⤷��ʤ����ɡ��ճ��ȻȤ�ƻ�����롣UIWebView���Ǥ��̿���΢¦��NSURLConnection��ȤäƤ���Τǡ�WebView��Ǥ��̿���եå����ƥ��ץ�¦��Ϯ�ä���Ǥ���Τ����㤨��CoreData�ˤ���ǡ�����JSON�����ˤ����֤��褦�ˤ��Ƥ����Ȥ���JS����Υȥꥬ���ǥ��ץ���ΥХå����饦��ɽ��������餻��Ȥ���������ե����ë¥ï¿½ï¿½Ã¥ï¿½ï¿½å¤·ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½Æ¥ï¿½ï¿½Õ¥é¥¤ï¿½ï¿½Ç¤ï¿½É½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½Ê£ï¿½ï¿½ï¿½Î°Û¤Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½WebAPI��ץ���������Ʊ�����ǰ�����褦�ˤ����ꡢ�Ȥ������Ȥ��ñ�ˤǤ��롣
�ޤ����դˡ�����Υꥯ�����Ȥ˸¤ä����̤ʽ����򤹤�פǤϤʤ�������Υꥯ�����Ȥϥ��롼���뤱��¾�ϥ֥��å�����פΤ褦�ʻȤ�����Ǥ��롣�Ƕ�ʤȤ����ˤϷ빽����������ɡ�����ˤʤä��Τϡ�iPhone��WebView�ˤ��������ȼ��������롢�Ȥ����á�
���ΥǥХ����Υ��ɥ쥹Ģ���忮����ߤ����ʤΤ����Υǡ�����JS���饢�������Ǥ���ɬ�פ�����Τ��ɤ�ʬ����ʤ������������ʻ��ͤ��Ȼפ��ΤǥС�����󥢥åפǺɤ����������Ȥϻפ����ɡ����ʤ��Ȥ�iOS5.0�ޤǤϤ�������ϻĤäƤ���Τǡ��֥��ץ����UIWebView��loadHTMLString�����ơ����������������HTML��file://���Υ��������ɽ�������Ƥ���פ褦�ʾ��ˤ��н褹��ɬ�פ����롣��ñ���к��Ȥ��ƤϤ������baseURL�����ꤷ�Ƥ����Ф����Τ����ɡ���������Ⱥ��٤�CSS��JS�������ʤɤΥХ�ɥ������˻��äƤ���꥽�������Ȥ��ʤ��ʤ롣�ֳ��������������HTML�򥢥ץ����UIWebView��ɽ�����������ɡ����ץ���ΰ����ʥ꥽�����ˤϥ����������������׾��ˡ�NSURLProtocol���̿���եå�������Ȥߤ��Ȥ��롣
- ��������꥽�����ˤ�NSURLProtocol��Ȥ����ɤ��Τ���ʤ�����
- NSURLProtocol ���������UIWebView �ǰ����˥�������Υ꥽�������ɤ߹���
���Ԥε������ȡ�NSURLProtocol�Υ��֥��饹�ǥХ�ɥ���Υե�����򳫤��ơ����Υǡ������֤��Ƥ��ޤ����Ȥ���������򤷤Ƥ��롣�ޤ�����Ԥε�����PhoneGap�μ����Ǥϡ�NSURLProtocol�Ρ���Ͽ���εս���б��Ǥ��뤫�ɤ��������å�����ס�YES���֤��Ф����ǻߤޤꡢNO���֤��ȼ���NSURLProtocol�Υ����å��˿ʤ�פȤ������������Ѥ��ơ����ۥ磻�ȥꥹ�Ȥ˺ܤäƤʤ��ꥯ�����Ȥξ��ϡ�canInitWithRequest:��YES���֤�����ǥ��顼�ʤ���쥹�ݥ󥹤ʤ���֤����ۥ磻�ȥꥹ�Ȥ˺ܤäƤ������NO���֤����̾��http��file�ץ��ȥ���Ȥ��ƽ����������פȤ�����ˡ�ǥ���ɥܥå������Υ꥽�����˥������������ʤ��褦�ˤ��Ƥ��롣
�ޤȤ�
- NSURLProtocol��Ȥ��Ф����ä��ȼ��������������Ǥ����
- WebView�ߤ����˺٤������椷�Ť餤��Τ��������̿���եå��Ǥ����
- �������ƥ��̤Ǥ��̣�������
�Ȥ��������ʤΤǡ������ƤߤƤ���������