SharedObject의 getLocal에는 3개의 파라미터를 설정할 수 있다.
getLocal(name:String, localPath:String = null, secure:Boolean = false);
localPath : 매개 변수를 "/" , "/apps" , "/apps/filename.swf" 로 설정할 수 있다
              이중 /는 모든 보안에 대해 개방을 하므로 총돌이 일어날 가능성이 매우 크다.
 
secure : HTTPS 연결을 통해 전달된 SWF 파일만이 이 공유 객체에 액세스할 수 있도록 제한할지
           여부를 결정
    true : Flash Player가 보안 공유 객체를 새로 만들거나 기존 보안 공유 객체에 대한 참조를
           가져옵니다. 공유 객체는 secure 매개 변수가 true로 설정된 SharedObject.getLocal()을
           호출하는 HTTPS를 통해 전달되는 SWF 파일에 의해서만 읽거나 쓸 수 있습니다.
    false : Flash Player는 비 HTTPS 연결을 통해 전달되는 SWF 파일에서 읽거나 쓸 수 있는
             새로운 공유 객체를 만들거나 기존 공유 객체에 대한 참조를 가져옵니다.


위에 2번째 파라미터를 "/"등으로 설정하면 다른 무비간에 데이터를 공유할 수 있다. 물론 같은 도메인에서만 가능한 얘기이다.

따라서 서로 다른 무비가 같은 공유객체를 만들거나 읽어오도록 같은 값으로 설정하면 값을 서로 설정하거나 읽어 올 수 있다. 단 동기화에는 문제가 있어보인다. A무비에서 기록한 데이터는 항상 데이터 기록과 함께 즉시 값을 보여주지만 B무비에서는 한 단계 이전의 데이터를 불러온다. 기록 시점과 읽어오는 시점에 차이가 있는것 같다.
Posted by 정윤수 버터백통

우선 AS3에서 제공하는 SharedObject의 deletage를 만든 다음 생성자 없이 getLocal()를 통해
데이터를 만들거나 읽기를 한다.

이후 객체에 데이터를 설정하기 위해서는 SharedObject.data를 통해 이름과 값을 설정한다.
단 getLocal("이름")의 이름과 data에 저장하는 변수의 이름이 같으면 안된다.

[ 공유객체 생성/로드 ]
var so:SharedObject = SharedObject.getLocal("jys");

[ 공유객체의 data를 통해 데이터를 설정 ]
so.data.userName = "jeong youn soo";
so.data.text = "공유객체에 이 내용을 저장한다.";
so.data.ary = ["a" , "b" , "c"];
so.data.date = new Date();
so.data.obj = {key1:"예시" , key2:-20 , key3:null }

위처럼 공유객체에서 지원하는 data라는 속성을 사용하여 데이터를 선언하여야 한다. 선언할 수 있는 데이터 타입은 문자,숫자,Date,오브젝트등 AS3에서 제공하는 대부분의 데이터 타입을 저장 할 수 있으면 심지어 인스턴스 클래스까지 저장 할 수 있다.

단 아래처럼 공유객체에 직접 데이터를 설정하면 에러를 발생한다.
so.text = "이것은 컴파일 에러를 발생한다.";

위에서 처럼 SharedObject에 데이터를 설정하면 자동으로 클라이언트 Pc에 기록된다.
그러나 기본 100kb를 넘어서거나 사용자가 저장 용량을 저장할 데이터 보다 적게 선언하였을 때는
저장 하지를 못한다.
이때 이를 체크할 수 있도록 SharedObjectFlushStatus저장 성공/실패 여부를 반환한다.
이를 체크하기 위해서는 SharedObject의 상태를 확인할 수 있는 flush()라는 메서드를 사용한다.

[ 저장상태를 체크 ]
var flushResult:String = so.flush();
저장이 성공하면 flush()메서드는 "flushed"를 반환하며 저장이 실패하면 "pending"을 넘겨준다.
이들은 SharedObjectFlushStatus에 상수로 설정되어있다.
if( flushResult == SharedObjectFlushStatus.FLUSHED ) {
    저장 성공 액션
}else if( flushResult == SharedObjectFlushStatus.PENDING ){
    저장 실패 액션
}


만약 저장에 실패하였을 경우에는 사용자에게 저장 여부를 확인하여야 한다.
따라서 Security.showSettings( SecurityPanel.LOCAL_STORAGE )try~catch문에 삽입하여
에러가 발생하면 SecurityPanel창을 띄워 저장 공간을 늘리게하거나 저장 허용하도록 한다.
이때 넘어오는 이벤트가 NetStatusEvent이벤트이다.

저장 실패시 이러한 이벤트를 SharedObject에 리스너를 등록하고 사용자가 승인또는 비승인을 체크하여
프로세스를 이어가야 한다.
SecurityPanel에서 승인이 발생하면 SharedObject.Flush.Success를 건네주고
그렇지 않으면 SharedObject.Flush.Failed를 건네준다.





Posted by 정윤수 버터백통