ローカルへの変数の保存について(Flash 6 以降)
共有オブジェクトについて
■共有オブジェクトについて
共有オブジェクトは、記憶領域(ストレージ)の一種です。
SharedObject を使用すると、データをローカル環境に保存する事ができます。
■保存可能なデータ型について
保存できるのは、Boolean、Number、String、Array、Object 型などです。
■シリアライズ後のフォーマットについて
フォーマットは、Action Message Format (AMF0) 形式です。
ファイルの拡張子は、「.sol」となります。
ActionScript3.0 では、AMF 形式の読み書きに対応しています。
■ .sol ファイルの保存場所について
ハードディスク内を、"SharedObjects" や "*.sol" などで検索します。
Windows XP の場合
C:\Documents and Settings\[ユーザー名]\Application Data\Macromedia\Flash Player\#SharedObjects\
Windows 7 の場合
C:\Users\[ユーザー名]\AppData\Roaming\Macromedia\Flash Player\#SharedObjects\
■ユーザーによる共有オブジェクトの管理について
ブラウザによっては、Cookie を削除すると、共有オブジェクトも連動して削除されます。
Flash Player の設定から、共有オブジェクトを削除する事もできます。
■ Macromedia Flash 5 でも作成可能
共有オブジェクトは、Flash Player 6 以降で利用可能です。
Flash Player 6 以降の環境であれば、Flash 5 形式の swf ファイルでも動作します。
共有オブジェクトを作成する
サンプルをダウンロード
■共有オブジェクトを作成する
共有オブジェクトを作成するにば、SharedObject.getLocal() メソッドを使用します。
保存データが既に存在する場合、読み込み処理も同時に行われます。
SharedObject.getLocal( "名前" , "ローカルパス" , セキュア? ) :SharedObject
第01引数 | String | 共有オブジェクト名を指定 |
第02引数(略可) | String | ローカルパスを指定(共有範囲) |
第03引数(略可) | Boolean | [Flash 8 以降] セキュア専用の共有オブジェクトを作成するなら true を指定 |
戻り値 | Void | SharedObject オブジェクトが得られる。引数に不備がある場合は null |
■作成例
共有オブジェクトを作成する
// 共有オブジェクトを作成する
var shared_obj = SharedObject.getLocal("my_data");
ドメイン内のすべての Flash からアクセス可能な共有オブジェクトを作成する
// 共有オブジェクトを作成する
var shared_obj = SharedObject.getLocal("my_data" , "/");
■第01引数 共有オブジェクト名
『 ? % & \ ; : " ' , < > ? # 』などの記号を含める事はできません。
「名前.sol」というファイル名で、実際にローカルに保存されます。
■第02引数 ローカルパス(共有範囲)
ストレージの共有については、こちらで解説しています。
ドメイン名を除いた、ファイルパスを指定します。
自身の格納場所から、URL を、ディレクトリ単位で削ります。
例えば、「http://example.com/aaa/bbb/ccc/my.swf」は、以下の指定が可能です。
http://example.com/aaa/bbb/ccc/my.swf で動作している場合
SharedObject.getLocal( "my_data" , "/aaa/bbb/ccc/my.swf" );
SharedObject.getLocal( "my_data" , "/aaa/bbb/ccc" );
SharedObject.getLocal( "my_data" , "/aaa/bbb" );
SharedObject.getLocal( "my_data" , "/aaa" );
SharedObject.getLocal( "my_data" , "/" );
■第03引数 セキュア (Flash 8 以降で動作)
自身がセキュア(https) な環境である場合に設定します。
true を指定すると、セキュア専用の共有オブジェクトを作成します。
これにより、アンセキュア(http) な環境との共有を拒絶します。
false を指定すると、通常の共有オブジェクトを作成します。
デフォルトは false です。
自身がアンセキュア(http) な環境である場合に、true を指定すると失敗します。
■ストレージの共有について
自身が作った共有オブジェクトは、別の Flash からもアクセスできます。
■デフォルトの動作について
デフォルトでは、ストレージは共有されません。
ストレージは、URL 単位で隔離されています。
例えば、ファイル名を変更すると、元の共有オブジェクトにはアクセスできなくなります。
■クロスドメインのセキュリティについて
別のドメインとストレージを共有する事はできません。
解除する方法もありません。
■共有範囲の設定について(ローカルパスの設定)
getLocal() メソッドの第02引数から、ローカルパスを指定します。
ローカルパスを含む、すべての Flash に対して、自身との共有を許します。
例えば、"/aaa/bbb" と記述した場合、
「http://example.com/aaa/bbb/my.swf」や
「http://example.com/aaa/bbb/other.swf」や
「http://example.com/aaa/bbb/ccc/other.swf」や
「http://example.com/aaa/bbb/ccc/ddd/other.swf」などは、
同じ共有オブジェクトにアクセスできるようになります。
■グローバルな共有オブジェクトについて
"/" の指定は、最大のセキュリティリスクがあります。
ドメイン内のすべての Flash に対して、自身との共有を許します。
■ローカル環境の場合
ローカル環境にある Flash は、"localhost" というドメイン名で管理されます。
ローカルで実行される、すべての Flash は、ストレージを共有できる可能性があります。
共有オブジェクトにデータを保存する
■共有オブジェクトにデータを書き込む
data プロパティを使用します。
data プロパティの中身は、コレクション用のオブジェクトです。
ドットアクセス演算子や配列アクセス演算子を使って、プロパティを追加します。
キーと値をセットにして、個別にデータを保存する事ができます。
共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む(ドットアクセス演算子の場合)
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む(配列アクセス演算子の場合)
// ------------------------------------------------------------
shared_obj.data["添字0"] = "書き込みテスト";
shared_obj.data["添字1"] = 123456;
shared_obj.data["添字2"] = ["a","b","c","d","e"];
shared_obj.data["添字3"] = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
shared_obj.flush();
}
■リファレンス型データの保存に注意
Array や Object 型は、まとめて保存ができるので便利です。
これらの書き込みを行った場合、データはコピーされません。
実態は参照渡しなので、常に保存の対象となる状態に陥ります。
保存処理を行った後で、リファレンス型データの中身を変更すると、ストレージにも反映されてしまいます。
リファレンス型データの保存に注意
// ------------------------------------------------------------
// 保存用のオブジェクト
// ------------------------------------------------------------
var save_obj = {
aaa:"保存データA",
bbb:"保存データB",
ccc:"保存データC"
};
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む(実態はコピーではなく参照渡し)
// ------------------------------------------------------------
shared_obj.data.key = save_obj;
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュして、参照を断つ(ここで一連の処理は完了したかのように見える)
// ------------------------------------------------------------
shared_obj.flush();
shared_obj = null;
// ------------------------------------------------------------
// この変更はストレージにも反映されてしまう(共有オブジェクトから参照されているため)
// ------------------------------------------------------------
save_obj.aaa = "更新A";
save_obj.bbb = "更新B";
save_obj.ccc = "更新C";
}
■リファレンス型データを複製してから保存する
参照を断ち切るには、リファレンス型データを複製します。
オブジェクトの複製については、こちらで解説しています。
■共有オブジェクトをフラッシュする
ローカルへの書き込みは、すぐに実行されるとは限りません。
Flash が消滅する直前などのタイミングで、まとめて実行されるでしょう。
ローカルへの書き込みを今すぐ実行するには、flush() メソッドを使用します。
戻り値から、フラッシュに成功したかを知る事ができます。
確認ダイアログを表示したくない場合は、このメソッドは使用しません。
SharedObject.flush( 保存サイズ ) :Object
第01引数(略可) | Number | ユーザーに要求する保存サイズを指定。 |
戻り値 | Object | 結果が得られる |
■第01引数 保存サイズ
ユーザーに要求する保存サイズを指定します。
指定したサイズや、実際に書き込まれるサイズが、ユーザーの設定によって制限されているバイト数を超える場合は、確認用のダイアログが表示されます。
確認用ダイアログは、非同期的に実行されます。
この結果を取得するには、onStatus イベントを使用します。
■戻り値 結果
以下の値が得られます。
ハードディスクへの書き込みは、同期的に実行されます。
値 | 型 | 説明 |
true | Boolean | ローカルへの書き込みが成功した。 |
false | Boolean | ローカルへの書き込みが失敗した。ユーザーが許可していない場合など。 |
"pending" | String | ユーザーに確認用のダイアログを表示した。(結果は onStatus イベントで取得) |
■使用例
共有オブジェクトをフラッシュする
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
var result = shared_obj.flush();
// ------------------------------------------------------------
// フラッシュの結果
// ------------------------------------------------------------
switch(result){
case "pending":
trace ("ユーザーに確認用のダイアログを表示した");
break;
case true:
trace ("ローカルへの書き込みが成功した");
break;
case false:
trace ("ローカルへの書き込みが失敗した");
break;
}
}
■確認用のダイアログの結果を取得する
確認用ダイアログの結果を取得するには、onStatus イベントを使用します。
コールバック関数の引数から、情報オブジェクトが得られます。
情報オブジェクトの code プロパティから、以下の文字列が得られます。
code プロパティ | 説明 |
"SharedObject. | ユーザーが許可したので、flush() は成功した |
"SharedObject. | ユーザーが拒否したので、flush() は失敗した |
onStatus イベントを使って、確認用ダイアログの結果を取得する
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 確認ダイアログの結果を取得するイベント
// ------------------------------------------------------------
shared_obj.onStatus = function (info){
switch(info.code){
case "SharedObject.Flush.Success":
trace("ユーザーが許可したのでフラッシュは成功した");
break;
case "SharedObject.Flush.Failed":
trace("ユーザーが拒否したのでフラッシュは失敗した");
break;
}
};
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
var result = shared_obj.flush();
// ------------------------------------------------------------
// フラッシュの結果
// ------------------------------------------------------------
switch(result){
case "pending":
trace ("ユーザーに確認用のダイアログを表示した");
break;
case true:
trace ("ローカルへの書き込みが成功した");
break;
case false:
trace ("ローカルへの書き込みが失敗した");
break;
}
}
■設定ダイアログを開く表示する(ローカル記憶領域用)
System.showSettings() メソッドを使用します。
ローカル記憶領域の設定を開くには、引数に 1 を指定します。
ローカル記憶領域用の設定ダイアログを開く
// ローカル記憶領域用の設定ダイアログを開く
System.showSettings(1);
共有オブジェクトからデータを取得する
■共有オブジェクトからデータを取得する
data プロパティを使用します。
data プロパティの中身は、コレクション用のオブジェクトです。
ドットアクセス演算子や配列アクセス演算子を使って、読み取りアクセスします。
共有オブジェクトに書き込んだデータを取得する
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む(ドットアクセス演算子の場合)
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む(配列アクセス演算子の場合)
// ------------------------------------------------------------
shared_obj.data["添字0"] = "書き込みテスト";
shared_obj.data["添字1"] = 123456;
shared_obj.data["添字2"] = ["a","b","c","d","e"];
shared_obj.data["添字3"] = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
shared_obj.flush();
shared_obj = null;
}
// ------------------------------------------------------------
// 共有オブジェクトを作成する(保存データが存在する場合、読み込み処理も同時に行われる)
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトからデータを取得する(ドットアクセス演算子の場合)
// ------------------------------------------------------------
var value0 = shared_obj.data.key0;
var value1 = shared_obj.data.key1;
var value2 = shared_obj.data.key2;
var value3 = shared_obj.data.key3;
// ------------------------------------------------------------
// 共有オブジェクトからデータを取得する(配列アクセス演算子の場合)
// ------------------------------------------------------------
var value4 = shared_obj.data["添字0"];
var value5 = shared_obj.data["添字1"];
var value6 = shared_obj.data["添字2"];
var value7 = shared_obj.data["添字3"];
}
■リファレンス型データの読み取りに注意
Array や Object 型は、まとめて保存ができるので便利です。
これらの読み取りを行った場合、データはコピーされません。
実態は参照渡しなので、常に保存の対象となる状態に陥ります。
取得した、リファレンス型データの中身を変更すると、ストレージにも反映されてしまいます。
リファレンス型データの取得に注意
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
shared_obj.data.key = {
aaa:"保存データA",
bbb:"保存データB",
ccc:"保存データC"
};
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
shared_obj.flush();
shared_obj = null;
}
// ------------------------------------------------------------
// 共有オブジェクトを作成する(保存データが存在する場合、読み込み処理も同時に行われる)
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトからデータを取得する(実態はコピーではなく参照渡し)
// ------------------------------------------------------------
var save_obj = shared_obj.data.key;
// ------------------------------------------------------------
// 共有オブジェクトの参照を断つ(ここで一連の処理は完了したかのように見える)
// ------------------------------------------------------------
shared_obj = null;
// ------------------------------------------------------------
// この変更はストレージにも反映されてしまう(共有オブジェクトから参照されているため)
// ------------------------------------------------------------
save_obj.aaa = "更新A";
save_obj.bbb = "更新B";
save_obj.ccc = "更新C";
}
■リファレンス型データを複製する
参照を断ち切るには、リファレンス型データを複製します。
オブジェクトの複製については、こちらで解説しています。
■共有オブジェクトからデータをすべて取得する
for..in 文を使用します。
共有オブジェクトからデータをすべて取得する
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// コレクション用オブジェクトを取得する
// ------------------------------------------------------------
var data = shared_obj.data;
// ------------------------------------------------------------
// データをすべて取得する
// ------------------------------------------------------------
var key;
for(key in data){
// 値を取得
var value = data[key];
// 出力テスト
trace('key:"' + key + '" value:' + value);
}
}
■共有オブジェクトの現在のバイトサイズを取得する
getSize() メソッドを使用します。
sol ファイルに保存する、ファイルサイズに相当します。
SharedObject.getSize( ) :Number
引数 | Void | なし。 |
戻り値 | Number | 共有オブジェクトの現在のバイト数が得られる |
共有オブジェクトの現在のバイトサイズを取得する
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトを削除する
// ------------------------------------------------------------
shared_obj.clear();
// ------------------------------------------------------------
// 共有オブジェクトの現在のバイト数を取得する
// ------------------------------------------------------------
var byte_size0 = shared_obj.getSize();
// 出力テスト
trace(byte_size0); // 0
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトの現在のバイト数を取得する
// ------------------------------------------------------------
var byte_size1 = shared_obj.getSize();
// 出力テスト
trace(byte_size1); // 173
}
共有オブジェクトからデータを削除する
■共有オブジェクトからデータを削除する
data プロパティを使用します。
data プロパティの中身は、コレクション用のオブジェクトです。
delete 演算子を使って、プロパティを削除します。
すべて削除した場合、ローカルに保存されていた sol ファイルも削除されます。
共有オブジェクトからデータを削除する
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
shared_obj.flush();
shared_obj = null;
}
// ------------------------------------------------------------
// 共有オブジェクトを作成する(保存データが存在する場合、読み込み処理も同時に行われる)
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトからデータを削除する(プロパティを削除する)
// ------------------------------------------------------------
delete (shared_obj.data.key0);
delete (shared_obj.data.key1);
delete (shared_obj.data.key2);
delete (shared_obj.data.key3);
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
shared_obj.flush();
shared_obj = null;
}
■共有オブジェクトを削除する
共有オブジェクトを削除するには、clear() メソッドを使用します。
ローカルに保存されていた sol ファイルも削除されます。
SharedObject.clear( ) :Void
引数 | Void | なし。 |
戻り値 | Void | なし。 |
共有オブジェクトを削除する
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){
// ------------------------------------------------------------
// 共有オブジェクトを削除する
// ------------------------------------------------------------
shared_obj.clear();
}