�ɤ��⡢��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�Υ��֥��饹�ǥХ�ɥ���Υե�����򳫤��ơ����Υǡ������֤��Ƥ��ޤ����Ȥ���������򤷤Ƥ��롣�ޤ�����Ԥε�����PhoneGap�μ����Ǥϡ�NSURLProtocol�Ρ���Ͽ���εս���б��Ǥ��뤫�ɤ��������å�����ס�YES���֤��Ф����ǻߤޤꡢNO���֤��ȼ���NSURLProtocol�Υ����å��˿ʤ�פȤ������������Ѥ��ơ����ۥ磻�ȥꥹ�Ȥ˺ܤäƤʤ��ꥯ�����Ȥξ��ϡ�canInitWithRequest:��YES���֤�����ǥ��顼�ʤ���쥹�ݥ󥹤ʤ���֤����ۥ磻�ȥꥹ�Ȥ˺ܤäƤ������NO���֤����̾��http��file�ץ��ȥ���Ȥ��ƽ����������פȤ�����ˡ�ǥ���ɥܥå������Υ꥽�����˥������������ʤ��褦�ˤ��Ƥ��롣

�ޤȤ�

  • NSURLProtocol��Ȥ��Ф����ä��ȼ��������������Ǥ����
  • WebView�ߤ����˺٤������椷�Ť餤��Τ��������̿���եå��Ǥ����
  • �������ƥ��̤Ǥ��̣�������

�Ȥ��������ʤΤǡ������ƤߤƤ���������