天天看點

FLEX3 SWFLoader 與RemoteObject的問題

var swf : SWFLoader = new SWFLoader();

swf.source="test.swf";

如果loader進來的SWF檔案用至RemoteObject,隻load一個進來是沒有問題的,但如果再load一個進來就提示錯誤:

TypeError: Error #1034: 強制轉換類型失敗:無法将 mx.messaging.messages::[email protected] 轉換為 mx.messaging.messages.ErrorMessage。

解決方法:

var swf : SWFLoader = new SWFLoader();

var lc : LoaderContext = new LoaderContext();

lc.applicationDomain = ApplicationDomain.currentDomain;

swf.loaderContext = lc;

swf.source="test.swf";

要指定SWFloader的loaderContext.loaderContext的說明如下:

flash.system
public class LoaderContext
繼承 LoaderContext
FLEX3 SWFLoader 與RemoteObject的問題
Object
子類 JPEGLoaderContext
語言版本:  ActionScript 3.0
運作時版本:  AIR 1.0 Flash Player 9

LoaderContext 類提供多種選項,以使用 Loader 類來加載 SWF 檔案和其它媒體。LoaderContext 類用作 Loader 類的

load()

loadBytes()

方法的

context

參數。

使用

Loader.load()

方法加載 SWF 檔案時,需要做出兩個決定:應将所加載的 SWF 檔案放置到哪個安全域中,以及應放置到該安全域中的哪個應用程式域中? 有關這些選擇的更多詳細資訊,請參閱

applicationDomain

securityDomain

屬性。

使用

Loader.loadBytes()

方法加載 SWF 檔案時,與使用

Loader.load()

時一樣,也要選擇應用程式域,但不必指定安全域,這是因為

Loader.loadBytes()

始終将其加載的 SWF 檔案放置到執行加載的 SWF 檔案的安全域。

如果是加載圖像(JPEG、GIF 或 PNG)而不是 SWF 檔案,則無需指定安全域或應用程式域,這是因為這些概念隻對 SWF 有意義。此時您隻需做出一個決定:是否需要以程式設計方式通路所加載圖像的像素? 如果需要,請參閱

checkPolicyFile

屬性。如果要在加載圖像時應用解塊,請使用 JPEGLoaderContext 類替代 LoaderContext 類。

公共屬性

FLEX3 SWFLoader 與RemoteObject的問題

隐藏繼承的公共屬性

FLEX3 SWFLoader 與RemoteObject的問題

顯示繼承的公共屬性

屬性 定義方
FLEX3 SWFLoader 與RemoteObject的問題
 allowLoadBytesCodeExecution : Boolean = false 指定是否可以使用 Loader 對象的 loadBytes() 方法下載下傳具有可執行代碼的内容,如 SWF 檔案。
LoaderContext
applicationDomain : ApplicationDomain = null 指定用于 Loader.load() 或 Loader.loadBytes() 方法的應用程式域。 LoaderContext
checkPolicyFile : Boolean = false 指定在開始加載對象本身之前,應用程式是否應該嘗試從所加載對象的伺服器下載下傳 URL 政策檔案。 LoaderContext
FLEX3 SWFLoader 與RemoteObject的問題
constructor : Object 對類對象或給定對象執行個體的構造函數的引用。 Object
FLEX3 SWFLoader 與RemoteObject的問題
prototype : Object [靜态] 對類或函數對象的原型對象的引用。 Object
securityDomain : SecurityDomain = null 指定用于 Loader.load() 操作的安全域。 LoaderContext

公共方法

FLEX3 SWFLoader 與RemoteObject的問題

隐藏繼承的公共方法

FLEX3 SWFLoader 與RemoteObject的問題

顯示繼承的公共方法

方法 定義方
LoaderContext (checkPolicyFile: Boolean = false, applicationDomain: ApplicationDomain = null, securityDomain: SecurityDomain = null) 建立帶有指定設定的新 LoaderContext 對象。 LoaderContext
FLEX3 SWFLoader 與RemoteObject的問題
hasOwnProperty (name: String ): Boolean 訓示對象是否已經定義了指定的屬性。 Object
FLEX3 SWFLoader 與RemoteObject的問題
isPrototypeOf (theClass: Object ): Boolean 訓示 Object 類的執行個體是否在指定為參數的對象的原型鍊中。 Object
FLEX3 SWFLoader 與RemoteObject的問題
propertyIsEnumerable (name: String ): Boolean 訓示指定的屬性是否存在、是否可枚舉。 Object
FLEX3 SWFLoader 與RemoteObject的問題
setPropertyIsEnumerable (name: String , isEnum: Boolean = true): void 設定循環操作動态屬性的可用性。 Object
FLEX3 SWFLoader 與RemoteObject的問題
toString (): String 傳回指定對象的字元串表示形式。 Object
FLEX3 SWFLoader 與RemoteObject的問題
valueOf (): Object 傳回指定對象的原始值。 Object

屬性詳細資訊

FLEX3 SWFLoader 與RemoteObject的問題
 allowLoadBytesCodeExecution
屬性

public var allowLoadBytesCodeExecution:Boolean = false

運作時版本:  AIR 1.0

指定是否可以使用 Loader 對象的

loadBytes()

方法下載下傳具有可執行代碼的内容,如 SWF 檔案。在此屬性設定為

false

(預設值)的情況下,

loadBytes()

方法僅限于執行安全操作,如加載圖像。

在位于應用程式安全沙箱的 AIR 内容中,預設值為

false

。在非應用程式内容中,預設值為

true

注意: 在未來的 AIR 版本中,很可能會替換此 API。發生這種情況時,将需要調整代碼以使用新的 API,并在針對新版本的 AIR 釋出應用程式之前進行重新編譯。

applicationDomain 屬性

public var applicationDomain:ApplicationDomain = null

語言版本:  ActionScript 3.0
運作時版本:  AIR 1.0 Flash Player 9

指定用于

Loader.load()

Loader.loadBytes()

方法的應用程式域。隻應在加載使用 ActionScript 3.0 編寫的 SWF 檔案(不是圖像或使用 ActionScript 1.0 或 ActionScript 2.0 編寫的 SWF 檔案)時才使用此屬性。

每 個安全域被分成一個或多個由 ApplicationDomain 對象表示的應用程式域。應用程式域并不是用于安全目的;它們用于管理 ActionScript 代碼的協作單元。如果是從其它域加載 SWF 檔案,并允許将它放置到另外一個安全域中,則您将無法控制所加載的 SWF 檔案被放置到哪個應用程式域中;即使您指定應選擇某個應用程式域,也會忽略。但是,如果是将 SWF 檔案加載到您自己的安全域中(因為此 SWF 檔案來自您自己的域,或者您正在将它導入到您的安全域中),您就可以控制為所加載的 SWF 檔案選擇哪個應用程式域。

LoaderContext.applicationDomain

中,您隻可以傳遞您自己的安全域中的應用程式域。如果試圖傳遞任何其它安全域中的應用程式域,則會引發

SecurityError

異常。

有四種

ApplicationDomain

屬性可供您選擇使用:

  • 加載器的 ApplicationDomain 的子級。 預設值。可以使用文法

    new ApplicationDomain(ApplicationDomain.currentDomain)

    顯式表示這種選擇。這将允許所加載的 SWF 檔案直接使用父級的類,例如,可通過編寫

    new MyClassDefinedInParent()

    來使用。但是父級則不能使用此文法;如果父級要使用子級的類,它必須調用

    ApplicationDomain.getDefinition()

    來檢索它們。這種選擇的優點是,如果子級定義的類與父級已經定義的類同名,不會出現錯誤結果;子級隻會繼承父級對該類的定義,除非子級或父級調用

    ApplicationDomain.getDefinition()

    方法來檢索子級的沖突定義,否則将不使用此定義。
  • 加載器自己的 ApplicationDomain。 使用

    ApplicationDomain.currentDomain

    時請使用此應用程式域。加載完成後,父級和子級可以直接使用對方的類。如果子級試圖定義的類與父級已定義的類同名,則使用父類并忽略子類。
  • 系統 ApplicationDomain 的子級。 使用

    new ApplicationDomain(null)

    時請使用此應用程式域。這将完全分離加載方和被加載方,進而允許它們使用相同的名稱定義各自版本的類并且不會産生沖突或隐藏。一方檢視另一方的類的唯一方式是調用

    ApplicationDomain.getDefinition()

    方法。
  • 其它 ApplicationDomain 的子級。 有時可能會有更複雜的 ApplicationDomain 層次結構。可以将 SWF 檔案從您自己的 SecurityDomain 加載到任何 ApplicationDomain 中。例如,

    new ApplicationDomain(ApplicationDomain.currentDomain.parentDomain.parentDomain)

    将 SWF 檔案加載到目前域父級的父級的新子級中。

加載完成後,為調用

ApplicationDomain.getDefinition()

,任一方(加載方或被加載方)都可能需要找到它自己的 ApplicationDomain 或另一方的 ApplicationDomain。任一方都可以通過使用

ApplicationDomain.currentDomain

來檢索對它自己的應用程式域的引用。執行加載的 SWF 檔案可以通過

Loader.contentLoaderInfo.applicationDomain

來檢索對被加載的 SWF 檔案的 ApplicationDomain 的引用。如果被加載的 SWF 檔案知道自己的加載方式,則它可以找到執行加載的 SWF 檔案的 ApplicationDomain 對象。例如,如果子級是以預設方式被加載的,則它可以通過使用

ApplicationDomain.currentDomain.parentDomain

找到執行加載的 SWF 檔案的應用程式域。

有關詳細資訊,請參閱《ActionScript 3.0 程式設計》 中“用戶端系統環境”一章的“ApplicationDomain 類”一節。

checkPolicyFile 屬性

public var checkPolicyFile:Boolean = false

語言版本:  ActionScript 3.0
運作時版本:  AIR 1.0 Flash Player 9

指定在開始加載對象本身之前,應用程式是否應該嘗試從所加載對象的伺服器下載下傳 URL 政策檔案。此标志适用于

Loader.load()

方法,但不适用于

Loader.loadBytes()

方法。

如果您從執行調用的 SWF 檔案所在的域之外加載圖像(JPEG、GIF 或 PNG),并且您預計将需要從 ActionScript 通路該圖像的内容,請将此标志設定為

true

。通路圖像内容的示例包括引用

Loader.content

屬性以獲得 Bitmap 對象,以及調用

BitmapData.draw()

方法以獲得所加載圖像像素的副本。如果您在加載時沒有指定

checkPolicyFile

就嘗試執行這些操作之一,您可能會得到一個

SecurityError

異常,這是因為尚未下載下傳所需的政策檔案。

LoaderContext.checkPolicyFile

設定為

true

的情況下調用

Loader.load()

方法時,應用程式直到成功下載下傳了相關的 URL 政策檔案或發現不存在此類政策檔案時才開始下載下傳

URLRequest.url

中的指定對象。Flash Player 或 AIR 首先考慮已經下載下傳的政策檔案,然後嘗試下載下傳調用

Security.loadPolicyFile()

方法過程中指定的任何待下載下傳政策檔案,然後嘗試從與

URLRequest.url

對應的預設位置(即

URLRequest.url

所在伺服器上的

/crossdomain.xml

)下載下傳政策檔案。在所有情況下,給定的政策檔案必須位于

URLRequest.url

(根據政策檔案的位置而定),且政策檔案必須通過一個或多個

<allow-access-from>

标簽允許進行通路。

如果将

checkPolicyFile

設定為

true

,則

Loader.load()

方法中指定的主下載下傳将在完全處理該政策檔案之後開始下載下傳。是以,隻要您需要的政策檔案存在,一旦您收到來自 Loader 對象的

contentLoaderInfo

屬性的任何

ProgressEvent.PROGRESS

Event.COMPLETE

事件,就說明該政策檔案下載下傳已完成,您就可以安全地開始執行需要該政策檔案的操作。

如果您将

checkPolicyFile

設定為

true

,并且未找到相關的政策檔案,則除非您嘗試執行的操作引發了

SecurityError

異常,否則您将不會收到任何錯誤訓示。但是,一旦 LoaderInfo 對象排程

ProgressEvent.PROGRESS

Event.COMPLETE

事件,您就可以通過檢查

LoaderInfo.childAllowsParent

屬性的值來測試是否找到了相關的政策檔案。

如果不需要對正在加載的圖像進行像素級的通路,則不應将

checkPolicyFile

屬性設定為

true

。在這種情況下不必再檢查是否存在政策檔案,因為這樣會延遲下載下傳的開始時間,并且可能會不必要地占用網絡帶寬。

如果是使用

Loader.load()

方法下載下傳 SWF 檔案,也盡量不要将

checkPolicyFile

設定為

true

。這是因為 SWF 到 SWF 的權限不是由政策檔案控制的,而是由

Security.allowDomain()

方法控制的,是以在加載 SWF 檔案時

checkPolicyFile

不起任何作用。在這種情況下不必再檢查是否存在政策檔案,因為這樣會延遲 SWF 檔案的下載下傳,并且可能會不必要地占用網絡帶寬 (Flash Player 或 AIR 無法判斷主下載下傳将是 SWF 檔案還是圖像,這是因為政策檔案下載下傳先于主下載下傳進行。)

如果是從可能使用伺服器端 HTTP 重定向的 URL 下載下傳對象,則使用

checkPolicyFile

時要小心。始終從

URLRequest.url

中指定的相應初始 URL 檢索政策檔案。如果由于 HTTP 重定向而導緻最終對象來自其它 URL,則最初下載下傳的政策檔案可能不适用于該對象的最終 URL,而最終 URL 對于安全性決策非常重要。如果發現處于這種情況,可以在收到

ProgressEvent.PROGRESS

Event.COMPLETE

事件後檢查

LoaderInfo.url

的值,它會告訴您該對象的最終 URL。接着,用一個基于該對象的最終 URL 的政策檔案 URL 調用

Security.loadPolicyFile()

方法。然後輪詢

LoaderInfo.childAllowsParent

的值,直到它變為

true

不需要為運作于應用程式沙箱中的 AIR 内容設定此屬性。AIR 應用程式沙箱中的内容調用

BitmapData.draw()

方法時可以使用任何已加載的圖像内容作為源。

securityDomain 屬性

public var securityDomain:SecurityDomain = null

語言版本:  ActionScript 3.0

指定用于

Loader.load()

操作的安全域。隻應在加載 SWF 檔案(而不是圖像)時使用此屬性。

隻有在被加載的 SWF 檔案與執行加載的 SWF 檔案可能來自不同的域(不同的伺服器)時,選擇安全域才有意義。從您自己的域加載 SWF 檔案時,始終會将它放置到您的安全域中。但是,在從其它域加載 SWF 檔案時,您有兩種選擇: 您可以允許将被加載的 SWF 檔案放置到其“自然的”安全域中,此安全域與執行加載的 SWF 檔案的安全域不同;這是預設設定。另一種選擇是通過将

myLoaderContext.securityDomain

設定為與

SecurityDomain.currentDomain

相同,指出您希望将被加載的 SWF 檔案放置到執行加載的 SWF 檔案所在的安全域中。這稱作導入加載 ,就安全性而言,它等同于将被加載的 SWF 檔案複制到您自己的伺服器,然後從該伺服器加載它。為使導入加載成功完成,被加載的 SWF 檔案的伺服器必須具有一個政策檔案,并且該政策檔案必須信任執行加載的 SWF 檔案的域。

您隻能在

LoaderContext.securityDomain

中傳遞您自己的安全域。如果試圖傳遞任何其它安全域,則會引發

SecurityError

異常。

AIR 應用程式安全沙箱中的内容無法将其他沙箱中的内容加載到其 SecurityDomain 中。

有關詳細資訊,請參閱《ActionScript 3.0 程式設計》 中的“安全性”一章。

繼續閱讀