UIWebViewで閲覧できるサイトを制限する方法

iPhone SDKにはiPhoenアプリ内でWebページを表示する事が出来るUIWebViewという便利なクラスがあるのだが、ネット上のコンテンツを自由にブラウズできる場合には"17+"レーティングになってしまうという問題がある。


私が開発しているNASA CheckerというiPhoneアプリでもUIWebViewを利用しており、以下のようにニュースの元記事を表示する用途等に利用している。

 


で、UIWebViewを利用しているというだけで"17+"レーティングになるのはちょっとな〜という事で、UIWebViewで閲覧できるサイトを制限してみる事に。
具体的には、まずUIWebViewを利用しているViewControllerでUIWebViewDelegateプロトコルを採用し、以下のメソッドを実装する。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType


次に、そのViewControllerをUIWebViewのデリゲートに指定する事で、ユーザがリンクをクリックしWeb画面が遷移する前に、ユーザがどのリンクをクリックしたか等を検知する事が出来る。
そして、例えばユーザがクリックしたリンクが閲覧させたくないサイトの物である場合には、そのサイトに移動しないようにするという事が出来る。
例えば、NASA Checkerの場合にはhttp://www.nasa.gov/以外は閲覧出来ないようにするという制限を掛けた。これにより"4+"のレーティングでAppleの審査を通す事が出来た。
具体的には以下のようなコードになる。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  if (navigationType == UIWebViewNavigationTypeLinkClicked || navigationType == UIWebViewNavigationTypeOther) {
    
    NSRange range = [[[request URL] absoluteString] rangeOfString:@"nasa.org" options:NSCaseInsensitiveSearch];
    if (range.location == NSNotFound) {
      // URLに"nasa.org"という文字列が含まれていないので範囲外へのアクセスとみなす
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Warning"
                                                      message:@"You can't go out from NASA.org"
                                                      delegate:self
                                             cancelButtonTitle:nil
                                             otherButtonTitles:@"OK", nil];
      [alert show];
      [alert release];
      return NO;
    }
  }
  return YES;
}