Mais conteúdo relacionado Semelhante a HTML5でオフラインWebアプリケーションを作ろう (20) HTML5でオフラインWebアプリケーションを作ろう2. Who?
吉川 徹/Toru Yoshikawa
html5j.org/HTML5とか勉強会スタッフ
Google API Expert ( Chrome )/Chrome API Developers
JP
Sublime Text 2 Japan Users Group
allWebクリエイター塾/jQuery Mobile担当講師
Twitter: @yoshikawa_t
Blog: http://d.hatena.ne.jp/pikotea/
12. オフラインWebアプリケーションに関連する仕様
必要なファイルをキャッシュする
Application Cache
ユーザーデータ・設定、アプリケーションデータをローカルに保存
Web Storage
Indexed Database/Web SQL Database
必要があれば適時、データの同期を行う、他
Online/Offline events
Network Information API
Web Workers (Shared Worker)
ファイルをローカルに保存
File APIs (File API, File API: Directories and System)
13. オフラインWebアプリケーションのアーキテクチャ
Webサーバー DB
XHR2
WebSockets
AppCache
Online/Offline events
HTML/CSS/ Network Information API
JavaScript
Shared Worker
ブラウザ
アプリケーションデータ Web Storage
IndexedDB/WebSQL
File APIs
16. Application Cache とは?
ファイルをキャッシュする(静的ファイル)
html/css/javascript/画像などをそのまま
キャッシュすることができる
既存のサイトにほとんど手を加えなくてもそのま
ま適用できる
既に多くのモバイルデバイスでサポートしている
20. 3. サーバー設定でマニフェストファイルのMIME
Typeをtext/cache-manifestに設定する
※ 将来的には、不要になります
Example: Apacheの.htaccessでの設定例
.htaccess
AddType text/cache-manifest .appcache
Example: JEEでの設定例
web.xml
<mime-mapping>
<extension>manifest</extension>
<mime-type>text/cache-manifest</mime-type>
</mime-mapping>
25. Web Storage の利用方法
データの保存
// fooというキーでbarという値を保存する
// 利用方法は3つの書き方があるが、いずれも同じ結果になる
localStorage.setItem("foo", "bar");
localStorage.foo = "bar";
localStorage[foo] = "bar";
データの取得
// fooというキーで値を取得する
localStorage.getItem("foo");
localStorage.foo;
localStorage[foo];
26. Web Storage の利用方法
データの削除
// fooというキーのデータを削除する
localStorage.removeItem("foo");
// すべて削除する
localStorage.clear();
データの一覧
//保存されている値をすべて表示する
for ( var i = 0, len = localStorage.length; i < len; i++ ) {
console.log( localStorage.getItem(localStorage.key(i)) );
}
27. Web Storage の利用方法
JavaScriptオブジェクトを扱う
// JavaScriptオブジェクトをJSON化して保存する
var data = {
foo: bar
};
localStorage.setItem('data', JSON.stringify(data));
// JavaScriptオブジェクトに戻して取得する
var data = JSON.parse( localStorage.getItem('data') );
31. Indexed Database とは?
JavaScriptオブジェクトを保存できる
インデックスによる検索が可能(非SQL)
トランザクションによる複数のデータ操作が可能
APIが少し難解で扱いづらい
Chrome、Firefoxが対応(IEは10から対応)
32. Web SQL Database とは?
RDBMS
SQLでデータを操作することができる
仕様策定が停止されている
Chrome、Safari、Operaが対応
モバイルはAndroid、Safariが対応
33. Indexed Database の利用方法
データベースの作成
// データベースの作成
var request = indexedDB.open("dbName", 1);
// データベースのスキーマ作成
request.onupgradeneeded = function(event) {
var db = event.target.result;
// オブジェクトストアの作成
var objectStore = db.createObjectStore("objectStoreName", { keyPath: "id" });
// インデックスの作成
objectStore.createIndex("indexName", "name", { unique: false });
// イニシャルデータの保存
var data = [
{ id: 1, name: "a", email: "a@example.com", tel: "0123" },
{ id: 2, name: "b", email: "b@example.com", tel: "4567" }
];
for (i in data) {
objectStore.add(data[i]);
}
};
34. Indexed Database の利用方法
データベースのオープンとデータの取得
// データベースのオープン
var openRequest = indexedDB.open("dbName");
openRequest.onsuccess = function(event) {
var db = event.target.result;
var transaction = db.transaction(["objectStoreName"]);
var objectStore = transaction.objectStore("objectStoreName");
var request = objectStore.get(1);
request.onerror = function(evt) {
// エラー
};
request.onsuccess = function(evt) {
// console.log( request.result.name );
};
};
35. Indexed Database の利用方法
カーソルを利用したデータの取得(イテレート)
var objectStore =
db.transaction("objectStoreName").objectStore("objectStoreName");
objectStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
// console.log( cursor.value.name);
cursor.continue();
}
};
インデックスを検索
var index = objectStore.index("indexName");
index.get("a").onsuccess = function(event) {
// console.log(event.target.result.id);
};
36. Indexed Database の利用方法
データの追加
var transaction = db.transaction(["objectStoreName"], IDBTransaction.READ_WRITE);
var objectStore = transaction.objectStore("objectStoreName");
var request = objectStore.add({
//...
});
request.onsuccess = function(event) {
// データ追加成功
}
41. Online/Offline eventsとは?
Demo ( http://html5-
demos.appspot.com/static/
navigator.onLine.html )
オンライン/オフラインの状態を取得できる
オンラインになったときに同期を開始するなどの
処理を行うことができる
44. Network Information APIとは?
接続しているネットワークの速度、課金の有無な
どを取得できる
ネットワークが遅い場合や従量課金で接続してい
る場合などは、同期を自動で行わないなど処理を
分けることができる
Android 2.2+、Firefoxのみで利用可能
47. Shared Worker の利用方法
ワーカーの作成とメッセージの送受信
var worker = new SharedWorker('worker.js');
worker.addEventListener('message', function(e) {
console.log('メッセージ受信: ', e.data);
}, false);
worker.postMessage('メッセージ送信');
worker.js
// 受け取ったメッセージをそのまま返信
self.addEventListener('message', function(e) {
self.postMessage(e.data);
}, false);
50. File APIs とは?
大きな仕様は、File APIとFile API: Directories and
Systems (File System API)の2つ
File APIでは、ドラッグ&ドロップされたファイルを読み取るFile
Readerなどが定義されている
File System APIでは、Webアプリケーションで利用可能なファイル
システム領域を作成できる
バイナリファイルをそのまま保存しておきたい場合などに利用する
Demo ( http://www.htmlfivewow.com/demos/terminal/
terminal.html )
現状は、Chromeのみでの実装
51. File System API の利用方法
選択したファイルをコピーして保存する
<input type="file" id="myfile" multiple />
document.querySelector('#myfile').onchange = function(e) {
var files = this.files;
window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
for (var i = 0, file; file = files[i]; ++i) {
(function(f) {
fs.root.getFile(file.name, {create: true, exclusive: true},
function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.write(f);
}, errorHandler);
}, errorHandler);
})(file);
}
}, errorHandler);
};
52. File APIs の参考情報
READING FILES IN JAVASCRIPT USING THE
FILE APIS - HTML5 Rocks
EXPLORING THE FILESYSTEM APIS - HTML5
Rocks
ファイルのクォータを管理するQuota
Management APIも策定中