UIWebViewでNSBundle内のリソースを読み込むと”WebKit discarded an uncaught exception”とエラー

UIViewControllerのviewWillAppearの中でUIWebViewに対してバンドル内のリソースを読み込もうとすると、エラーが起きた。しかも、実機では狙った通り動くのに、iOSシミュレーターでのみエラーが起きる。書いたコードは以下の通り。

- (void)viewWillAppear:(BOOL)animated
{
	[super viewWillAppear:animated];
	NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
	NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:path]];
	[self.webView loadRequest:request];
}

起きたエラーは次の通り。

*** WebKit discarded an uncaught exception in the webView:decidePolicyForNavigationAction:request:frame:decisionListener: delegate:  *** -[NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]: nil argument

解決編

NSURLの使い方が間違っていた。+ (id)URLWithString:(NSString *)URLStringは、RFC 2396に準拠したURIのみ書ける。ファイルシステム上のパスを書きたい場合は、+ (id)fileURLWithPath:(NSString *)pathを使うべきだった。以下のように直すと正常に動いた。

- (void)viewWillAppear:(BOOL)animated
{
	[super viewWillAppear:animated];
	NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
	NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]];
	[self.webView loadRequest:request];
}

Developer LibraryのNSURLのページにも以下のように書いてあった。

+ (id)URLWithString:(NSString *)URLString
Parameters
URLString
The string with which to initialize the NSURL object. Must be a URL that conforms to RFC 2396. This method parses URLString according to RFCs 1738 and 1808. (To create NSURL objects for file system paths, use fileURLWithPath:isDirectory: instead.)


コメントを残す