EgretEngine

【Egret無料ご相談室】ブラウザを閉じてもデータをセーブしたい


今日のご質問


image.png

変数のセーブってどうすればいいんだろ。

ブラウザ閉じたたらデータ消えますよね?



回答

egret.localStorage のグローバル関数を使うといいですよ

APIリファレンス:

http://developer.egret.com/cn/apidoc/index/name/egret.localStorage.globalFunction#methodSummary

使いかた

/// 簡単なデータの読み込みと保存

const userName = egret.localStorage.getItem("userName");
userName = "New Name";
egret.localStorage.setItem("userName", userName);

/// ちょっと複雑なデータの読み込み・保存
const savedJson = egret.localStorage.getItem("savedData");
const data = JSON.parse(savedJson);
const newData = { ... data, newProp: "New Value" } ;
const toSaveJson = JSON.stringfy(newData);
egret.localStorage.setItem("savedData",toSaveJson );


解説

インターフェースの定義

https://github.com/egret-labs/egret-core/blob/de70bf2cc9e04b674a2897f907e97f887f897c7a/src/egret/localStorage/localStorage.ts

ブラウザ向けの実装

https://github.com/egret-labs/egret-core/blob/de70bf2cc9e04b674a2897f907e97f887f897c7a/src/egret/localStorage/web/WebLocalStorage.ts

EgretEngineのLocalStorageha,ブラウザが実装しているLocalStorageへのラッパーです。


/src/egret/localStorage/web/WebLocalStorage.ts

    function getItem(key:string):string {

return window.localStorage.getItem(key);
}

function setItem(key:string, value:string):boolean {
try{
window.localStorage.setItem(key, value);
return true;
}
catch(e){
egret.$warn(1047, key, value);
return false;
}
}

function removeItem(key:string):void {
window.localStorage.removeItem(key);
}

function clear():void {
window.localStorage.clear();
}



LocalStorageとはWebStorageと呼ばれるものの一つで、javascriptを用いてクライアント側にデータを保存する仕組みです。ユーザのローカル(ブラウザ)にデータを保存することができるので、半永久的にデータを保持することができます。データの読み込み・更新も比較的簡単に行うことができます。

引用:http://wp.tech-style.info/archives/742



各ブラウザーの実装状況は?

おおむね実装されているようです

いつものごとく、iOSにはいろいろ制限があるようです


注記: iOS 5.1 より Safari Mobile は localStorage データを cache フォルダに保存しており、概して空き容量が少ない場合に OS の要求により、時々クリーンアップを受けます。


image.png

参考:

https://developer.mozilla.org/ja/docs/Web/API/Web_Storage_API

https://bbs.egret.com/forum.php?mod=viewthread&tid=11824&highlight=localstorage

iOS11未満のSafariはシークレットモードではLocalStorageにアクセスできなかったようです

http://kimizuka.hatenablog.com/entry/2018/09/25/175335