ローカルファイルのHTMLをUIWebViewに表示させる

xibで用意したUIWebViewにローカルHTMLファイルを読み込ませたいとき、躓いた点があったので備忘。

ローカルHTMLをUIWebViewに表示

まずはローカルHTMLをUIWebViewに表示させるまで。
ヘッダファイルにプロパティを追加しておく。

@interface HogehogeViewController : UIViewController<UIWebViewDelegate>{
    IBOutlet UIWebView *webView;
}
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@end

viewDidLoad内で表示させるHTMLファイルの指定。

- (void)viewDidLoad{
    [super viewDidLoad];
    _webView.scalesPageToFit = YES;
    _webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"html"];
    NSFileHandle *readHandle = [NSFileHandle fileHandleForReadingAtPath:path];
    
    _webView.delegate = self;
    NSString *htmlString = [[NSString alloc] initWithData:[readHandle readDataToEndOfFile] encoding:NSUTF8StringEncoding];
    
    [_webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:path]];
}

こんな感じ。
viewDidLoad内で何やってるか簡単に書くと・・・
ビューに対してフィットした状態で表示し、かつピンチズーム&アウトできるように。

    _webView.scalesPageToFit = YES;
    _webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);

ファイル名hoge拡張子htmlを指定してファイルパスを取得。

    NSString *path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"html"];
    NSFileHandle *readHandle = [NSFileHandle fileHandleForReadingAtPath:path];

UTF8でエンコーディング

    NSString *htmlString = [[NSString alloc] initWithData:[readHandle readDataToEndOfFile] encoding:NSUTF8StringEncoding];

表示。

    [_webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:path]];

ただ、これだけではうまくいかないことがある。
HTMLファイル内にjavascriptcssを全て記載しておくならば問題ないだろうけど、
まぁそういう書き方ってしないよな。。。
HTMLファイルから更に別ファイルを参照している場合、HTMLファイル内のファイルパスを気をつける必要がある。 単純にファイルパスは必要ないっぽい。

    <link href="hogehoge.css" rel="stylesheet">
    <script src="hogehofe.js"></script>

そして問題は、javascript.... jsファイルをプロジェクトに追加するとCompile Sourcesに追加されコンパイルエラーになる。
PROJECT>TARGETS>Build Phases>Compile Sourcesを確認。
対象のjsファイルをドラッグドロップでCompile Sourcesの下にあるCopy Bundle Resourcesに移動してあげる。

ここまでやって、やっと表示することができる。

UIWebViewのgoBackが効かない

ローカルHTMLファイルを表示せると、goBackgoForwardcanGoBackcanGoForwardがおかしなことになる。
解決方法はなく、したの回避方法が一般的っぽい。
UIWebView won't goBack after loading HTML in iOS

これでやっと目的の状態(に近い状態・・・)になりました。
ローカルHTMLのとき、戻るとかが変なのはバグ?随分前から話題にはなってるようなんだけどな・・・