共有オブジェクトとは?
■ 共有オブジェクトについて
共有オブジェクトを使用するとユーザーのローカルハードディスクにデータを一時的に決められた場所に保存することができます。
保存したデータは、次回起動時に読み込むことが可能です。
また、同一ドメイン内で実行している swf ファイルであれば、同じ共有オブジェクトにアクセスできるので保存したデータの共有ができます。
共有オブジェクトを作成するには、SharedObject クラスを使用します。
シェアードオブジェクトを作成する
var so : SharedObject = SharedObject.getLocal("my_data");
SharedObject は以下のクラスから派生しています。ここで解説してない分はリンク先に解説がありますので合わせてご覧下さい。
| Object |
| ↓派生 |
| EventDispatcher |
| ↓派生 |
| SharedObject |
共有オブジェクトを作成して読み込む
サンプルをダウンロード
■シェアードオブジェクトを作成する
シェアードオブジェクトを作成するには、SharedObject クラスの getLocal() メソッドを静的に呼び出します。
SharedObject.getLocal ( 共有オブジェクト名 , 保存するディレクトリ ,HTTPS 経由か?);
| 第01引数 | 共有オブジェクト名を指定します。 |
| 第02引数(略可) | 保存するディレクトリを指定します。 |
| 第03引数(略可) | HTTPS 経由で配信されている SWF ファイルの場合 true を指定 それ以外は false |
| 戻り値 | SharedObject 型のオブジェクトが返ります。セキュリティで弾かれた場合は null が返ります。 |
■第01引数 共有オブジェクト名を指定
ここで指定した名称がそのまま 『 共有オブジェクト名.sol 』 というファイル名になり保存されます。
WindowsXP環境での保存場所
C:\Documents and Settings\ユーザー名\Application Data\Macromedia\Flash Player
\#SharedObjects\
■第02引数 共有オブジェクト名を指定
保存するディレクトリを指定できますが、実行場所からURLを削る事のみ可能です。
例えば、 http://hakuhin.jp/main/swf/shared_obj.swf にて実行されるのであれば
"main/swf/shared_obj.swf" か
"main/swf/" か
"main/" か
"/"
の4通りの指定が可能です。
例えば、 http://hakuhin.jp/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 で作られた共有オブジェクトにアクセスできなくなります。
例えば、https://hakuhin.jp/shared_obj.swf で作成した共有オブジェクトがあるとします。
https://hakuhin.jp/swf/shared_obj.swf からはアクセスすることができますが
http://hakuhin.jp/shared_obj.swf や http://hakuhin.jp/swf/shared_obj.swf などの別プロトコルからはアクセスできません。
作成例です。
シェアードオブジェクトを作成する
var so : SharedObject = SharedObject.getLocal("my_data");
他からアクセスされる可能性が高いシェアードオブジェクトを作成する
var so : SharedObject = SharedObject.getLocal("my_data","/");
■共有オブジェクトからデータを取り出す
すでにローカルディスクにデータが保存されている場合、共有オブジェクトを作った時点で自動的に読み込まれ、 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() メソッドを使用します。
引数にユーザーに要求する書き込みたいバイト数を指定します。
flush() メソッドを使用しなくても
共有オブジェクトがガベージコレクションに回収されるタイミングで自動的にハードディスクに書き込まれます。
「FlashPlayer の設定」で制限されているバイト数以上のデータを書き込もうとしたときは、以下のような確認用のダイアログが表示されます。
また、戻り値の文字列により正常に書き込まれたか知ることができます。
「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 ("書き込みに失敗しました。");
}
}
■ユーザーがローカルディスクへの書き込み許可を出したか調べる
「FlashPlayer の設定」からローカルディスクへの書き込みを許可したか拒否したか調べるには NET_STATUS イベントを使用します。
イベント通知を受け取る
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();
}

