料金・ご注文・お問い合わせ

HTML5特設サイト HTML5 Lab. HTML5、CSS3を実験的に公開。日々研究に努めてまいります。

HTML5 column

iPad向けオフラインコンテンツを作る

2010.08.23

今、一番お問い合わせの多いのが、iPad向けのオフラインコンテンツ制作に関するものです。

iPadでオフラインコンテンツとしてHTMLを使う場合、
safariでCache Manifest、Key-Value Storage、Relational Databaseを使う方法が考えられますが、

Cache Manifestは、更新時などの動作が不安定な事がある、
Key-Value Storageだと上限が5MBまで、

などの問題があるので、Relational Databaseを今回使いました。

データは、base64エンコードしたテキストでDBに保存、
表示の際には、dataスキームで表示します。

ファイルをbase64エンコード

この処理はPHPで行ないました。(base64.php)

 
<?php
	$file_name = $_GET["data"];
	if(file_exists($file_name)){
		$file64 = base64_encode(file_get_contents($file_name));
	}
header("Content-type: text/plain; charset=UTF-8");
echo $file64;

データの格納

javascriptでDBへデータを格納します。
base64エンコードしたデータは、jQueryのajaxで呼び出しました。

 
var file = "hoge.jpg";
var db = window.openDatabase(image, "2.0", "Image Data", "5242880");

if(navigator.onLine){
	try {
		if (window.openDatabase) {
			if (!db) {
				alert("データベースストレージが使えません。");
			}

			$.ajax({
				url: 'base64.php',
				async: true,
				cache: false,
				data: 'data=' + file,
				dataType: "text",
				success: function(text){

					db.transaction(
						function(tx) {
							tx.executeSql('CREATE TABLE IF NOT EXISTS imagedata(name CLOB, data CLOB);');
							tx.executeSql('SELECT name FROM imagedata WHERE name = ?;', [file], function(tx, rs) {
								if(rs.rows.length){
									tx.executeSql("UPDATE imagedata SET data = ? WHERE name = ?;", [text,file] );
								} else {
									tx.executeSql("INSERT INTO imagedata (name, data) VALUES (?, ?);", [file,text] );
								}
							}); 
						},
						function(error) {
							alert( 'transaction error : ' + error.message);
						}
					);
				}
			});
		
		} else {
			alert('データベースストレージはサポートされていません。');
		}
	} catch (error)	{}
}

データの呼び出し

呼び出しはこのような感じで呼び出せます。
(例:idが"dbimg1"のimgタグに1つ目のデータを書き出す場合)

 
var db = window.openDatabase(image, "2.0", "Image Data", "5242880");
db.transaction(
function(tx) {
	tx.executeSql('SELECT * FROM imagedata;', [], function(tx, rs) { 

		var db_data = rs.rows.item(0).data;
		var source = document.getElementById('dbimg1');
		var data = 'data:image/jpeg;base64,' + db_data;
		source.src = data;
	});
});

ちなみに、この方法では動画をiPadに表示することは出来ませんでした。
(PC版safariなどでは表示可能です)

動画コンテンツは、アプリなどでまるごと保存する形がベストかと思います。

  • HTML5特設サイト HTML5 Lab. HTML5、CSS3を実験的に公開。
  • design factory
  • 法人プラン 通常のご注文よりお得なプリペイドプラン
  • よくあるご質問
  • WANTED

Valid XHTML 1.0 Strict

正当なCSSです!

iPhone、iPad、Multi-Touch は、米国および他の国々で登録されたApple Inc.の商標です。
iPhone 商標は、アイホン株式会社のライセンスに基づき使用されています。

ページトップへ戻る