iOS 4にあったloadRequestのバグ
iOS 4 になってから販売中の iOS アプリケーションが起動に失敗するようになって、Apple Bug Reporter システムを使って二度報告をして直してもらった結果アップデートを提出することができた。具体的には同じ手法を用いている “WebKit HTML 5 SQL Storage Notes Demo” のコードを拝借して検証し同様の症状を確認したので、そのままサンプルコードとして送ってみると iOS 4 の loadRequest 関数にバグがあったという返答を貰った。

try { if (window.openDatabase) { db = openDatabase("NoteTest", "1.0", "HTML5 Database API example", 200000); if (!db) alert("Failed to open the database on disk. This is probably because the version was bad or there is not enough space left in this domain's quota"); } else { alert("Couldn't open the database. Please try with a WebKit nightly with this feature enabled"); } } catch(e) { alert("Couldn't open the database. Please try with a WebKit nightly with this feature enabled:" + e); }
そもそも viewDidLoad 内で loadRequest を使わず次の様に loadData を用いていたのだけど、そうすると今度は上のコードにある try...catch 文でエラーを検出しその内容が “SECURITY_ERR: DOM Exception 18” となるようになった。
NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"html"]; NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile]; NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; NSURL *bundleBaseURL = [NSURL fileURLWithPath: bundlePath]; [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:bundleBaseURL];
そこで再度 loadRequest を使うようにすると無事解決した。
NSString *path = [[NSBundle mainBundle] bundlePath]; NSURL *baseURL = [NSURL fileURLWithPath:[path stringByAppendingString:@"Notes.html"]]; NSURLRequest *request = [NSURLRequest requestWithURL:baseURL]; [webView loadRequest:request];
もし iOS 4 以上で UIWebView 内の JavaScript を使った SQLite や localStorage の処理に問題がある場合は loadData を使わずに loadRequest を使って書き直すと良いというのが今回の教訓。
加えて今回の作業にかなりの時間が掛かった理由として、当初 JavaScript の方に問題があると予想していた(というのは、window.openDatabase の代わりに 'openDatabase' in window を使うと最初のエラーが起きなかった)ので WWDC2010 のセッション512 に登場していたエバンジェリストや Webkit の開発チームに連絡を試みたという事がある。結局はたらい回しにされた挙げ句、Developer Forums も全く役立たずで最終的に Stack Overflow に助けてもらった。また、Cocoa 側になんらかの変更が加わったか問題があるのは分かっていたのだけど、W3Cが Web SQL データベースの管理を止めてしまったことも事態を複雑にした要因でもある。
一方で以前の投稿で使い方を説明していたように、ネイティブアプリが使えなくてもウェブアプリを UIWebView に埋め込んでいる手法の利点を大いに実感した。途中で利用者からは返金など多くの問い合わせを頂いていたので、個別に無料で使えるウェブアプリを紹介していたら「これがあればわざわざ買う必要がないじゃないか」と言う人もいたのは悩ましいところなのだけど。(あまり広めないでね、とも言っておいた :)ぶっちゃけ、処理の重いゲームやカメラのようなハードウェアにアクセスするようなモノでなければほぼウェブアプリで賄えるし、iPhone が登場した際の戦略を考えても… (ry
これが受託案件だったら…と思うとぞっとする次第、リスク分散という意味でも Android 版の開発のやる気が出てきた2011年の初投稿でした。
個人事業主のウェブとiOSアプリ開発者で一児の父親。JavaScript, ActionScript, AppleScript, PHP, SQL, ObjCの読書実行試験運用管理を生業とし、BIND, SMTP, APACHE を FreeBSD, MacBSD, Mac OS X で使い、エディタは Vi, mi, Kod と遷移して現在は Smultron、そして Coda と Xcode の IDE を重用しています。作業の自動化や効率化の導入を応援しています。
P.S. 制作履歴はLinkedInの公開プロフィールをご覧ください。