共有オブジェクトとは?
■ SharedObject クラスについて
共有オブジェクトを使うとユーザーのローカルハードディスクにデータを一時的に決められた場所に保存することができます。保存したデータは、次回起動時に読み込むことが可能です。
また、同一ドメイン内で実行している swf ファイルであれば、同じ共有オブジェクトにアクセスできるので保存したデータの共有ができます。
共有オブジェクトを作成するには、SharedObject クラスを使用します。
また、同一ドメイン内で実行している swf ファイルであれば、同じ共有オブジェクトにアクセスできるので保存したデータの共有ができます。
共有オブジェクトを作成するには、SharedObject クラスを使用します。
シェアードオブジェクトを作成する
var so : SharedObject = SharedObject.getLocal("my_data");
SharedObject は以下のクラスから派生しています。ここで解説してない分はリンク先に解説がありますので合わせてご覧下さい。
| Object |
| ↓派生 |
| EventDispatcher |
| ↓派生 |
| SharedObject |
共有オブジェクトを作成して読み込む
サンプルをダウンロード
■シェアードオブジェクトを作成する
シェアードオブジェクトを作成します。
|
SharedObject.getLocal ( 共有オブジェクト名 , 保存するディレクトリ ,HTTPS 経由か?); | ||||||||
|
■第01引数 共有オブジェクト名を指定
ここで指定した名称がそのまま 『 共有オブジェクト名.sol 』 というファイル名になり保存されます。
WindowsXP環境での保存場所
C:\Documents and Settings\ユーザー名\Application Data\Macromedia\Flash Player
\#SharedObjects\
■第02引数 共有オブジェクト名を指定
保存するディレクトリを指定できますが、実行場所からURLを削る事のみ可能です。
例えば、 http://hakuhin.com/main/swf/shared_obj.swf にて実行されるのであれば
"main/swf/shared_obj.swf" か
"main/swf/" か
"main/" か
"/"
の4通りの指定が可能です。
同一の『共有オブジェクト名』を指定したとしても、『指定したディレクトリ』が違う場合は、別の共有オブジェクトとして新規に作成されます。『共有オブジェクト名』と指定したディレクトリ』が一致しているのであれば、別のディレクトリから実行していても同じ共有オブジェクトにアクセスできます。
"/" と指定した場合、別のディレクトリからアクセスできる可能性が最大となり、同一ドメイン内であれば、どこから実行しても同じ共有オブジェクトにアクセスする事ができます。記述を省略した場合は、"main/swf/shared_obj.swf"と記述したことと同じになります。別ディレクトリからアクセスできる可能性が完全になくなり、このディレクトリに置いた同名のSWFファイル以外からアクセスする事はできません。
ローカル環境で実行している場合は、localhost というドメインとして扱われます。 "/" と指定すると、どこでSWFファイルを実行しても同じ共有オブジェクトにアクセスすることが可能です。
別のドメインで作られた共有オブジェクトへはセキュリティの都合上アクセスすることはできません。
例えば、 http://hakuhin.com/main/swf/shared_obj.swf にて実行されるのであれば
"main/swf/shared_obj.swf" か
"main/swf/" か
"main/" か
"/"
の4通りの指定が可能です。
同一の『共有オブジェクト名』を指定したとしても、『指定したディレクトリ』が違う場合は、別の共有オブジェクトとして新規に作成されます。『共有オブジェクト名』と指定したディレクトリ』が一致しているのであれば、別のディレクトリから実行していても同じ共有オブジェクトにアクセスできます。
"/" と指定した場合、別のディレクトリからアクセスできる可能性が最大となり、同一ドメイン内であれば、どこから実行しても同じ共有オブジェクトにアクセスする事ができます。記述を省略した場合は、"main/swf/shared_obj.swf"と記述したことと同じになります。別ディレクトリからアクセスできる可能性が完全になくなり、このディレクトリに置いた同名のSWFファイル以外からアクセスする事はできません。
ローカル環境で実行している場合は、localhost というドメインとして扱われます。 "/" と指定すると、どこでSWFファイルを実行しても同じ共有オブジェクトにアクセスすることが可能です。
別のドメインで作られた共有オブジェクトへはセキュリティの都合上アクセスすることはできません。
■第03引数 HTTPS 経由で配信されているかを指定
https 配信されている場合 true に変更すると『セキュアな共有オブジェクト』となり それ以外の http などのプロトコルから実行された場合、『セキュアな共有オブジェクト』にアクセスすることができなくなります。
例えば、https://hakuhin.com/shared_obj.swf で作成した共有オブジェクトがあるとします。 https://hakuhin.com/swf/shared_obj.swf からはアクセスすることができますが http://hakuhin.com/shared_obj.swf や http://hakuhin.com/swf/shared_obj.swf などの別プロトコルからはアクセスできません。
例えば、https://hakuhin.com/shared_obj.swf で作成した共有オブジェクトがあるとします。 https://hakuhin.com/swf/shared_obj.swf からはアクセスすることができますが http://hakuhin.com/shared_obj.swf や http://hakuhin.com/swf/shared_obj.swf などの別プロトコルからはアクセスできません。
シェアードオブジェクトを作成する
var so : SharedObject = SharedObject.getLocal("my_data");
他からアクセスされる可能性が高いシェアードオブジェクトを作成する
var so : SharedObject = SharedObject.getLocal("my_data","/");
■共有オブジェクトからデータを取り出す
すでにローカルハードディスクにデータが保存されている場合、共有オブジェクトを作った時点でdata プロパティにデータが格納されているので取り出して使用します。
共有オブジェクトからデータを取り出す
var so : SharedObject = SharedObject.getLocal("my_data");
if(so){
var obj : Object = so.data;
trace(obj.num);
trace(obj.str);
trace(obj.ary);
trace(obj.obj);
}
共有オブジェクトを保存する
■共有オブジェクトにデータを書き込む
共有オブジェクトにデータを書き込むには、data プロパティにアクセスします。data プロパティはオブジェクトになっているので好きなプロパティ名をぶら下げてデータを格納していきます。
オブジェクト型で格納するとまとめて書き込んだり取り出したりできるのでお勧めです。
共有オブジェクトにデータを書き込む
var so : SharedObject = SharedObject.getLocal("my_data");
if(so){
var obj : Object = so.data;
obj.num = 123;
obj.str = "書き込みテスト";
obj.ary = ["配","列","テ","ス","ト"];
obj.obj = {data:"オブジェクトテスト"};
}
■ハードディスクへ書き込む
ハードディスクへすぐに書き込みを試みるには、flush() メソッドを使用します。引数にユーザーに要求する書き込みたいバイト数を指定します。
ユーザーの設定によって制限されているバイト数以上のデータを書き込もうとしたときは、FlashPlayer上で確認用のダイアログが表示されます。
また、返り値の文字列により正常に書き込まれたか知ることができます。
ユーザーが完全に書き込み許可を出していないときはエラーが投げられるのでキャッチします。
ハードディスクへ書き込む
var so : SharedObject = SharedObject.getLocal("my_data");
if (so) {
var obj : Object = so.data;
obj.num = 123;
obj.str = "書き込みテスト";
obj.ary = ["配","列","テ","ス","ト"];
obj.obj = {data:"オブジェクトテスト"};
try {
var str = so.flush(300);
switch (str) {
case SharedObjectFlushStatus.FLUSHED :
trace ("正常にハードディスクに書き込めました。");
break;
case SharedObjectFlushStatus.PENDING :
trace ("ユーザーにハードディスク書き込み要求を出します。");
break;
}
} catch (e) {
trace ("書き込みに失敗しました。");
}
}
flush() メソッドを呼び出さなくても共有オブジェクトがガベージコレクションに回収されるタイミングで自動的にハードディスクに書き込み処理が走ります。
■ユーザーがハードディスクへの書き込み許可を出したか調べる
シェアードオブジェクトは netStatus イベントに対応しています。
イベント通知を受け取る
var so : SharedObject = SharedObject.getLocal("my_data");
if(so){
so.addEventListener (NetStatusEvent.NET_STATUS ,SharedObjectStatusEventFunc);
function SharedObjectStatusEventFunc (event : NetStatusEvent) {
switch(event.info.code){
case "SharedObject.Flush.Success":
trace("ユーザーがハードディスク書き込み許可ボタンを押した");
break;
case "SharedObject.Flush.Failed":
trace("ユーザーがハードディスク書き込み拒否ボタンを押した");
break;
default:
trace("その他のイベントコード:" + event.info.code);
}
}
var obj : Object = so.data;
obj.num = 123;
obj.str = "書き込みテスト";
obj.ary = ["配","列","テ","ス","ト"];
obj.obj = {data:"オブジェクトテスト"};
try {
var str = so.flush(300);
switch (str) {
case SharedObjectFlushStatus.FLUSHED :
trace ("正常にハードディスクに書き込めました。");
break;
case SharedObjectFlushStatus.PENDING :
trace ("ユーザーにハードディスク書き込み要求を出します。");
break;
}
} catch (e) {
trace ("書き込みに失敗しました。");
}
}
■共有オブジェクトの使用バイト数を調べる
共有オブジェクトのデータがどれだけバイト数を使用しているかを調べるには、size プロパティを調べます。
共有オブジェクトのサイズを調べる
var so : SharedObject = SharedObject.getLocal("my_data");
if(so){
trace(so.size);
var obj : Object = so.data;
obj.num = 123;
obj.str = "書き込みテスト";
obj.ary = ["配","列","テ","ス","ト"];
obj.obj = {data:"オブジェクトテスト"};
trace(so.size);
}
共有オブジェクトを削除する
■ローカルハードディスクに保存した共有オブジェクトを削除する
ユーザーのローカルハードディスクに保存された共有オブジェクトを削除するには、clear メソッドを呼び出します。
共有オブジェクトを削除する
var so : SharedObject = SharedObject.getLocal("my_data");
if(so){
so.clear();
}
