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];
でローカルストレージの値を取得して、入っていなければローカルストレージに入れてリロード。
リロードしたことによって、ビューを表示したときローカルストレージに値が入ってた(かのように見える)状態で描画することができた。
とりあえずこれでローカルストレージに書き込むことできたんで完了!