UIWebViewでローカルストレージに書き込む

UIWebViewで読み込んでいる画面に対し、HTML5から追加されたローカルストレージを操作しなくてはならない場面に出くわした。  
 

javascriptでのローカルストレージの操作は以下の通り。

<script type="text/javascript">
//セット
localStorage.setItem(key, value);
//取得
localStorage.getItem(key);
//削除
localStorage.removeItem(key);
</script>

もっと大変かと思ってたらすごく簡単。。。

UIWebViewではstringByEvaluatingJavaScriptFromStringというものが使える。

UIWebView上でjavascriptを追記して実行させることができる。

実際のサンプルは以下の通り。

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSString *str = @"hogehoge";
    NSURL *url = [NSURL URLWithString:@"http://hogehoge.com"];
    NSURLRequest* req = [NSURLRequest requestWithURL:url];
    [_webView loadRequest:req];
    [_webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@.setItem('%@', '%@');", @"localStorage", @"key", str]];
    [_webView reload];
}

最初↑こんな書き方していたんだけどダメだった。
ビューを表示⇒ローカルストレージという流れになっている。

なのでviewDidAppearはロードのみに変更。

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSString *str = @"hogehoge";
    NSURL *url = [NSURL URLWithString:@"http://hogehoge.com"];
    NSURLRequest* req = [NSURLRequest requestWithURL:url];
    [_webView loadRequest:req];
}

webViewDidFinishLoadで処理を追加するようにした。

-(void)webViewDidFinishLoad:(UIWebView*)webView{
    NSString* jsString = @"localStorage.getItem('key');";
    NSString* someKeyValue = [_webView stringByEvaluatingJavaScriptFromString: jsString];
    if(someKeyValue == nil || [someKeyValue isEqual: @""]){
        NSString *str = @"hogehoge";
        [_webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@.setItem('%@', '%@');", @"localStorage", @"key", str]];
        [_webView reload];
    }
}

これで動いた!

NSString* jsString = @"localStorage.getItem('key');";
NSString* someKeyValue = [_webView stringByEvaluatingJavaScriptFromString: jsString];

でローカルストレージの値を取得して、入っていなければローカルストレージに入れてリロード。

リロードしたことによって、ビューを表示したときローカルストレージに値が入ってた(かのように見える)状態で描画することができた。

とりあえずこれでローカルストレージに書き込むことできたんで完了!