ローカルファイルがUIWEBViewで読み込まれない場合の対処法 拡張子編


UIWEBViewは拡張子が.comだと読み込まれない

前提

アトサクのように様々なページをWEBから取得する場合に拡張子を得ておきたいと思うのが常だと思います。
拡張子を取るための一般的な解決策は以下のコード。

NSURL *url = [NSURL URLWithString:@"http://b.hatena.ne.jp/entry/lab.atosaku.com/?p=407"];
NSString *extension = [[url path] pathExtension];

しかし、このようなコードでは拡張子が.comになってしまいます。
これをそのままUIWebViewに以下のように読み込ませるコードは以下。
以下のコードでは、リクエストに失敗してエラーが出力されます。
(エラーを取得するデリゲートメソッド:webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error)

    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    [webView setDelegate:self];
    NSString *bodyPath = @"/テキトーパス/test.com";
    NSFileManager *fm = [NSFileManager defaultManager];
    GHAssertTrue([fm fileExistsAtPath:bodyPath],@"body path is not exited");
    NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:bodyPath]];

解決策

拡張子を.htmlに書き換えれば何も問題なくロードされます。
もし、GHTestUnitを利用している方には、以下のコードをコピってみると、ちょこっと面白いです。

■エラー内容

{NSErrorFailingURLKey=file:///*********/test.com, NSErrorFailingURLStringKey=file:///Users/pig100pork/Desktop/tmp/loadRequest/test.com, NSLocalizedDescription=Frame load interrupted}
2012-07-23 13:20:56.619 GablielTest[7624:15e03] *** WebKit discarded an uncaught exception in the webView:didFailProvisionalLoadWithError:forFrame: delegate: ‘((error) == nil)’ should be FALSE. err not nil. err:Error Domain=WebKitErrorDomain Code=102 “Frame load interrupted” UserInfo=0x99e0140 {NSErrorFailingURLKey=file:///*******/test.com, NSErrorFailingURLStringKey=file:///*****loadRequest/test.com,

■bad


-(void)test1_loadRequestTest{
    
    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    [webView setDelegate:self];
    NSString *bodyPath = @"/テキトーパス/test.com";
    NSFileManager *fm = [NSFileManager defaultManager];
    GHAssertTrue([fm fileExistsAtPath:bodyPath],@"body path is not exited");
    NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:bodyPath]];
    GHAssertTrue([[req URL] isFileURL],@"url is not fileUrl");
    
    [self prepare];
    
    [webView loadRequest:req];
    [self waitForStatus:kGHUnitWaitStatusSuccess timeout:60];
    
}

-(void)webViewDidStartLoad:(UIWebView *)webView{
    
    NSLog(@"start");
    GHAssertNotNil([[webView request] URL],@"webView req is nil");
}

-(void)webViewDidFinishLoad:(UIWebView *)webView{
    
    NSLog(@"finish");
    GHAssertNotNil([webView request],@"webView req is nil");
    [self notify:kGHUnitWaitStatusSuccess forSelector:@selector(test1_loadRequestTest)];
}

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    
    NSLog(@"failure");
    NSLog(@"error is %@",[error description]);
    GHAssertNil(error,@"err not nil. err:%@",[error description]);
    [self notify:kGHUnitWaitStatusFailure];    
}

■Good

-(void)test1_loadRequestTest{
    
    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    [webView setDelegate:self];
    NSString *bodyPath = @"/テキトーパス/test.html";
    NSFileManager *fm = [NSFileManager defaultManager];
    GHAssertTrue([fm fileExistsAtPath:bodyPath],@"body path is not exited");
    NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:bodyPath]];
    GHAssertTrue([[req URL] isFileURL],@"url is not fileUrl");
    
    [self prepare];
    
    [webView loadRequest:req];
    [self waitForStatus:kGHUnitWaitStatusSuccess timeout:60];
    
}

-(void)webViewDidStartLoad:(UIWebView *)webView{
    
    NSLog(@"start");
    GHAssertNotNil([[webView request] URL],@"webView req is nil");
}

-(void)webViewDidFinishLoad:(UIWebView *)webView{
    
    NSLog(@"finish");
    GHAssertNotNil([webView request],@"webView req is nil");
    [self notify:kGHUnitWaitStatusSuccess forSelector:@selector(test1_loadRequestTest)];
}

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    
    NSLog(@"failure");
    NSLog(@"error is %@",[error description]);
    GHAssertNil(error,@"err not nil. err:%@",[error description]);
    [self notify:kGHUnitWaitStatusFailure];    
}

[sc:採用情報へのリンク]