注意:桌面平台上支持 SystemUpdater API。
此类包含与
将 TouchscreenType 类定义的值与
在通过 Loader 类加载外部 SWF 文件时会使用应用程序域。加载的 SWF 文件中的所有 ActionScript 3.0 定义都存储在由 LoaderContext 对象的
SWF 文件中的所有代码被定义为存在于应用程序域中。主应用程序就在当前的应用程序域中运行。系统域中包含所有应用程序域(包括当前域),这意味着它包含所有 Flash Player 类。
除系统域以外,每个应用程序域都有一个关联的父域。主应用程序的应用程序域的父域是系统域。已加载的类仅在其父级中没有相关定义时才进行定义。不能用较新的定义覆盖已加载的类定义。
有关应用程序域的用法示例,请参阅《ActionScript 3.0 开发人员指南》。
使用
注意:
首先,使用下面的代码创建 RuntimeClasses.swf 文件:
然后实现下面的代码:
注意:
使用以下代码在“en”目录下创建一个 Greeter.as 文件:
然后在“es”目录下创建一个十分相似的 Greeter.as 文件:
编译两个 SWF 文件,然后实现以下代码:
在 Flash Professional 中,为了从使用 Flash 创作工具中“本地播放安全性”选项的“只访问网络”发布的本地 SWF 文件访问非本地 SWF 文件,指定“~~”是唯一的方法。
注意:通配符值在子域中不起作用。例如,不能在
注意:从 AIR 应用程序沙箱中的代码调用此方法会引发 SecurityError 异常。应用程序安全域以外的内容不能直接跨脚本访问应用程序沙箱中的内容。不过,应用程序沙箱以外的内容可以使用沙箱桥与应用程序安全沙箱中的内容进行通信。
如果两个 SWF 文件来自同一个域(例如,http://mysite.com/swfA.swf 和 http://mysite.com/swfB.swf),则 swfA.swf 可以检查和修改 swfB.swf 中的变量、对象、属性、方法等,而且 swfB.swf 也可以对 swfA.swf 执行同样的操作。这被称为跨影片脚本编写或跨脚本编写。
如果两个 SWF 文件来自不同的域(例如,http://siteA.com/swfA.swf 和 http://siteB.com/siteB.swf),则在默认情况下,Flash Player 既不允许 swfA.swf 编写 swfB.swf 的脚本,也不允许 swfB.swf 编写 swfA.swf 的脚本。通过调用
在任何跨域的情况下,明确所涉及的双方非常重要。为了便于进行此讨论,我们将执行跨脚本编写的一方称为访问方(通常是执行访问的 SWF),将另一方称为被访问方(通常是被访问的 SWF 文件)。当 siteA.swf 编写 siteB.swf 的脚本时,siteA.swf 是访问方,siteB.swf 是被访问方。
使用
除了防止 SWF 文件受到其他 SWF 文件发起的跨域脚本编写影响外,Flash Player 还可防止 SWF 文件受到 HTML 文件发起的跨域脚本编写的影响。可以使用旧版本的 浏览器函数(如
如果将 IP 地址指定为
特定于版本的差异
Flash Player 的跨域安全性规则随着版本的升级发生了演变。下表概述了这些差异。
控制 Flash Player 行为的版本是 SWF 版本(SWF 文件的发布版本),而不是 Flash Player 本身的版本。例如,当 Flash Player 8 正在播放为第 7 版发布的 SWF 文件时,它应用与第 7 版一致的行为。这种做法可确保播放器升级不会更改已部署 SWF 文件中的
上表中的版本列显示了涉及跨脚本编写操作的最新 SWF 版本。Flash Player 根据执行访问的 SWF 文件的版本或被访问的 SWF 文件的版本(以两者中的较高版本为准)来确定其行为。
下面的段落提供有关涉及
第 5 版。没有跨域脚本编写限制。
第 6 版。引入了跨域脚本编写安全性。默认情况下,Flash Player 禁止跨域脚本编写;
第 7 版。超级域匹配更改为域完全匹配。仅在这两个文件的 URL 中的主机名完全相同时才允许它们相互编写脚本;否则需要调用
第 8 版。主要有两项更改:
有时您也可能遇到下面这种情况:您从另一个域中加载一个子级 SWF 文件,并想让该子级 SWF 文件编写父级 SWF 文件的脚本,但您不知道该子级 SWF 文件的最终域。例如,当您使用负载平衡重定向或第三方服务器时就可能发生这种情况。
在这种情况下,您可以使用您传递给
请务必等待,直至子级 SWF 文件开始加载,以便获得
也可能出现相反的情况:即您可能创建一个子级 SWF 文件,并想要允许其父级编辑该子级 SWF 文件的脚本,但不知道该父级将来自哪个域。在这种情况下,可以访问作为该 SWF 根对象的显示对象的
如果正在为 Flash Player 8 或更高版本进行发布,也可以通过调用
有关安全性的详细信息,请参阅 Flash Player 开发人员中心主题:
为了从使用 Flash 创作工具中“本地播放安全性”设置(“文件”>“发布设置”>“Flash”选项卡)的“只访问网络”发布的本地 SWF 文件访问非本地 SWF 文件,指定“*”是唯一的方法。
注意:通配符值在子域中不起作用。例如,不能在
Flash Player 提供
注意:从 AIR 应用程序沙箱中的代码调用此方法会引发 SecurityError 异常。应用程序安全域以外的内容不能直接跨脚本访问应用程序沙箱中的内容。不过,应用程序沙箱以外的内容可以使用沙箱桥与应用程序安全沙箱中的内容进行通信。
此方法与
仅使用
请注意,下面的信息只是一种可能的情形,旨在通过一个具体的跨脚本编写示例来帮助您了解
假定您要创建一个电子商务站点,它由两个组件构成:一个是产品目录组件,它不必是安全的,因为它仅包含公共信息;另一个是购物车/结帐组件,它必须是安全的,以保护用户的财务信息和个人信息。假定您考虑从 http://mysite.com/catalog.swf 提供产品目录,从 https://mysite.com/cart.swf 提供购物车。对您站点的一个要求便是:第三方应不能通过利用您安全体系结构中的漏洞盗取用户的信用卡号码。
请设想:“中间方”攻击者在您的服务器和您的用户之间进行干预,试图盗取您的用户在购物车申请表中输入的信用卡号码。中间方是指这样的人员:对于在您的用户和服务器之间通过公共 Internet 传输的网络数据包,他能够进行查看或更改。例如,您的某些用户所使用的不道德的 ISP,或者,在用户工作区的怀有不良企图的管理员,都可能是中间方。这种情况并不罕见。
如果 cart.swf 使用 HTTPS 将信用卡信息传输到服务器,则中间方攻击者无法直接从网络数据包盗取此信息,因为 HTTPS 传输已加密。但是,攻击者可以使用其他技术:在您的 SWF 文件发送到用户时更改其中一个 SWF 文件的内容;将您的 SWF 文件替换为更改后的版本,此版本将用户的信息传输到由攻击者所有的其他服务器。
HTTPS 协议等可阻止此“修改”攻击发生作用,因为除了加密外,HTTPS 传输还是防篡改的。如果中间方攻击者更改数据包,则接收方将检测到更改并丢弃该数据包。因此在这种情况下,攻击者无法更改您的 cart.swf,因为它是通过 HTTPS 传递的。
不过,假设您希望允许 catalog.swf(通过 HTTP 提供)中的按钮将项目添加到 cart.swf(通过 HTTPS 提供)中的购物车,为实现此功能,cart.swf 调用
显然,这是您所不愿看到的,但是您仍希望站点上两个 SWF 文件之间可以进行跨脚本编写。要重新设计此假设的电子商务站点,以避免
多年来,Web 浏览器一直强制将 HTTPS 文件和非 HTTPS 文件分开,以上所描述的情形正是此限制的一个很好的理由。Flash Player 为您提供了在绝对必须时避开此安全限制的能力,但在这样做之前一定要仔细考虑后果。
有关安全性的详细信息,请参阅 Flash Player 开发人员中心主题:
使用
这使 Flash Player 或 AIR 尝试从指定的 URL 检索策略文件。由该位置处的策略文件授予的任何权限将适用于该服务器虚拟目录层次结构中的同一级别或更低级别中的所有内容。
例如,如果在上一段代码之后添加下面的代码行,则这些代码行不会引发异常:
但是,下面的代码则会引发安全性异常:
您可以使用
在检索主策略文件时,Flash Player 会用三秒钟等待服务器响应。如果未接收到响应,则 Flash Player 假定主策略文件不存在。但是,对
无法连接到常用的保留端口。有关已阻止的端口的完整列表,请参阅《ActionScript 3.0 开发人员指南》中的“限制网络 API”。
通过将
这会导致 Flash Player 或 AIR 尝试从指定的主机和端口检索策略文件。使用指定的端口建立连接后,Flash Player 或 AIR 将传输
可以在包含 SWF 内容的 HTML 页中设置
有关安全性的详细信息,请参阅 Flash Player 开发人员中心主题:
在 Flash Player 6 中,为这些播放器设置使用的域基于 SWF 文件的域的末尾部分。如果 SWF 文件的域包含的段数超过两个,如 www.example.com,则会去除该域的第一段(“www”),并使用该域的剩余部分:example.com。因此,在 Flash Player 6 中,www.example.com 和 store.example.com 都使用 example.com 作为这些设置的域。同样,www.example.co.uk 和 store.example.co.uk 都使用 example.co.uk 作为这些设置的域。在 Flash Player 7 及更高版本中,默认情况下是根据 SWF 文件的精确域来选择播放器设置;例如,来自 www.example.com 的 SWF 文件将使用 www.example.com 的播放器设置,来自 store.example.com 的 SWF 文件将使用 store.example.com 的不同播放器设置。
当
如果您以前发布了第 6 版 SWF 文件并从该文件创建了永久共享对象,并且现在您需要在将该 SWF 文件移植到第 7 版或更高版本后从该 SWF 文件中检索这些永久共享对象,或者从第 7 版或更高版本的其它 SWF 文件中检索这些永久对象,则需要在调用
有关安全性的详细信息,请参阅 Flash Player 开发人员中心主题:
使用
使用
如果是加载图像(JPEG、GIF 或 PNG)而不是 SWF 文件,则无需指定安全域或应用程序域,这是因为这些概念只对 SWF 有意义。此时您只需做出一个决定:是否需要以编程方式访问所加载图像的像素?如果需要,请参阅
注意:AIR 应用程序安全沙箱中的内容无法将其他沙箱中的内容加载到其 SecurityDomain 中。
当您要将图像内容导入到沙箱中时,此属性很有用(例如,当您要复制或处理来自不同的域的图像),但在只需要一个图像又不希望承担接收 SWF 文件的安全性风险时,此属性将很有用。由于 SWF 文件可能包含 ActionScript 代码,因此导入 SWF 文件操作比导入图像文件操作的风险大。
在位于应用程序安全沙箱的 AIR 内容中,默认值为
Flash Player 10.1 和 AIR 2.0 中添加了
每个安全域被分成一个或多个由 ApplicationDomain 对象表示的应用程序域。应用程序域并不是用于安全目的;它们用于管理 ActionScript 代码的协作单元。如果是从其他域加载 SWF 文件,并允许将它放置到另外一个安全域中,则您将无法控制所加载的 SWF 文件被放置到哪个应用程序域中;即使您指定应选择某个应用程序域,也会忽略。但是,如果是将 SWF 文件加载到您自己的安全域中(因为此 SWF 文件来自您自己的域,或者您正在将它导入到您的安全域中),您就可以控制为所加载的 SWF 文件选择哪个应用程序域。
在
有四种
加载完成后,为调用
有关详细信息,请参阅《ActionScript 3.0 开发人员指南》中“客户端系统环境”一章的“ApplicationDomain 类”部分。
如果您从执行调用的 SWF 文件所在的域之外加载图像(JPEG、GIF 或 PNG),并且您预计将需要从 ActionScript 访问该图像的内容,请将此标志设置为
在
如果将
如果您将
如果不需要对正在加载的图像进行像素级的访问,则不应将
如果是使用
如果是从可能使用服务器端 HTTP 重定向的 URL 下载对象,则使用
不需要为运行于应用程序沙箱中的 AIR 内容设置此属性。AIR 应用程序沙箱中的内容调用
在默认策略
在
在两种策略下,运行时在图像解码后均采用相同的缓存和刷新行为。运行时随时可以刷新和解码数据,并在下次需要时重新解码图像。
通常,通过分析请求 URL 来获得
此 API 的目的是使加载 SWF 文件能够将其参数转发给已加载的 SWF 文件。使用
例如,请考虑以下 URL:
以下代码使用 LoaderContext.parameters 属性复制传递到此 URL 的参数:
import flash.system.LoaderContext; import flash.display.Loader; var l:Loader = new Loader(); var lc:LoaderContext = new LoaderContext; lc.parameters = { "foo": "bar" }; l.load(new URLRequest("child.swf"), lc);
要验证参数是否正确传递,请在运行此代码之后使用以下跟踪语句:
如果内容成功加载,则此跟踪会输出“bar”。
在完全加载内容后,Loader 对象通常成为该内容的父对象。如果设置了
如果已加载的内容是 AVM1Movie 对象,或者如果在
如果请求的父对象和加载的内容位于不同的安全沙箱中,并且如果请求的父对象无权访问加载的内容,则发生下列操作:
以下代码使用
import flash.system.LoaderContext; import flash.display.Loader; import flash.display.Sprite; var lc:LoaderContext = new LoaderContext(); var l:Loader = new Loader(); var s:Sprite = new Sprite(); lc.requestedContentParent = s; addChild(s); l.load(new URLRequest("child.swf"), lc);
运行此代码时,舞台上将显示子 SWF 文件。这一事实确认了添加到舞台的 Sprite 对象是加载的 child.swf 文件的父级。
只有在被加载的 SWF 文件与执行加载的 SWF 文件可能来自不同的域(不同的服务器)时,选择安全域才有意义。从您自己的域加载 SWF 文件时,始终会将它放置到您的安全域中。但是,在从其他域加载 SWF 文件时,您有两种选择:您可以允许将被加载的 SWF 文件放置到其“自然的”安全域中,此安全域与执行加载的 SWF 文件的安全域不同;这是默认设置。另一种选择是通过将
您只能在
AIR 应用程序安全沙箱中的内容无法将其他沙箱中的内容加载到其 SecurityDomain 中。
有关详细信息,请参阅《ActionScript 3.0 开发人员指南》中的“安全性”一章。
指定是否可以使用
在位于应用程序安全沙箱的 AIR 内容中,默认值为
JPEGLoaderContext 类扩展了 LoaderContext 类。如果需要以编程方式访问所加载图像的像素(例如,如果要使用
但 Adobe AIR 的有些功能没有作为 Capabilities 类的属性列出。这些功能是其他类的属性:
请勿 使用
可使用
A=t&SA=t&SV=t&EV=t&MP3=t&AE=t&VE=t&ACC=f&PR=t&SP=t& SB=f&DEB=t&V=WIN%209%2C0%2C0%2C0&M=Adobe%20Windows& R=1600x1200&DP=72&COL=color&AR=1.0&OS=Windows%20XP& L=en&PT=External&AVD=f&LFD=f&WD=f&IME=t
下表列出了 Capabilities 类的属性和相应的服务器字符串:
还有一个
Capabilities 类的所有属性都是只读的。
对于 Adobe AIR™ 中的内容,此属性仅适用于应用程序安全沙箱以外的安全沙箱中的内容。应用程序安全沙箱中的内容始终可以访问用户的摄像头和麦克风。
trace(Capabilities.cpuArchitecture);
各种操作系统在区域设置字符串中返回的区域信息有所不同。一个操作系统可能返回
返回数组中的第一个条目的主语言 ID 通常与
服务器字符串为
在英文系统上,此属性仅返回语言代码 (
注意:
服务器字符串为
如果此属性设置为
服务器字符串为
如果存在更具体的功能属性,请勿 使用
服务器字符串为
服务器字符串为
如果存在更具体的功能属性,请勿 使用
服务器字符串为
以下示例显示了一个 URL 编码的字符串:
A=t&SA=t&SV=t&EV=t&MP3=t&AE=t&VE=t&ACC=f&PR=t&SP=t& SB=f&DEB=t&V=WIN%208%2C5%2C0%2C208&M=Adobe%20Windows& R=1600x1200&DP=72&COL=color&AR=1.0&OS=Windows%20XP& L=en&PT=External&AVD=f&LFD=f&WD=f
trace(Capabilities.supports32BitProcesses);
trace(Capabilities.supports64BitProcesses);
WIN 9,0,0,0 // Flash Player 9 for Windows MAC 7,0,25,0 // Flash Player 7 for Macintosh LNX 9,0,115,0 // Flash Player 9 for Linux AND 10,2,150,0 // Flash Player 10 for Android
如果存在更具体的功能属性,请勿 使用
服务器字符串为
In the following example, the fscommand()
function sets Flash Player to
scale the SWF file to the full monitor screen size when the fullscreen_btn
button or
unfullscreen_btn
is released:
this.fullscreen_btn.onRelease = function() { fscommand("fullscreen", true); }; this.unfullscreen_btn.onRelease = function() { fscommand("fullscreen", false); };
The following example uses the fscommand()
function applied to a button in Flash to
open a JavaScript message box in an HTML page. The message itself is sent to JavaScript as the
fscommand
parameter.
You must add a function to the HTML page that contains the SWF file. This function,
myDocument
_DoFSCommand
, sits in the HTML page and waits for an
fscommand()
function in Flash. When an fscommand
is triggered in Flash
(for example, when a user presses the button), the command
and args
strings
are passed to the myDocument
_DoFSCommand
function. You can use the
passed strings in your JavaScript or VBScript code in any way you like. In this example, the function
contains a conditional if
statement that checks to see if the command string is
"messagebox
". If it is, a JavaScript alert box (or "message box") opens
and displays the contents of the args
string.
function myDocument_DoFSCommand(command, args) { if (command == "messagebox") { alert(args); }
In the Flash document, add the fscommand()
function to a button:
fscommand("messagebox", "This is a message box called from within Flash.")
You can also use expressions for the fscommand()
function and parameters, as in the
following example:
fscommand("messagebox", "Hello, " + name + ", welcome to our website!")
To test the SWF file, select File > Publish Preview > HTML.
Note: If you publish your SWF file using the Flash with FSCommand template in the
HTML
tab of the Publish Settings dialog box, the myDocument_DoFSCommand
function is inserted
automatically. The SWF file's NAME
and ID
attributes will be the filename.
For example, for the file myDocument.fla, the attributes would be set to myDocument
.
可以在包含 SWF 内容的 HTML 页中设置
如果执行调用的 SWF 文件位于只能与本地文件系统内容交互的沙箱或只能与远程内容交互的沙箱中,并且包含 SWF 文件的 HTML 页在不受信任的沙箱中,则不允许使用
有关安全性的详细信息,请参阅 Flash Player 开发人员中心主题:
用法 1:要使用
并非表中所列的全部命令在所有应用程序中都可用:
用法 2:要使用
在 Web 浏览器中,
在包含 SWF 文件的网页中,设置
在浏览器中运行的 Flash Player 10 和更高版本中,以编程方式使用此方法打开弹出窗口可能不会成功。不同的浏览器(和浏览器配置)可能会随时阻止弹出窗口;不能保证可以显示任何弹出窗口。不过,为了尽可能成功,请仅在作为用户操作的直接结果执行的代码中使用此方法打开弹出窗口,例如,在鼠标单击或按键事件的事件处理函数中。
用法 3:
用法 4:在 VisualBasic、Visual C++ 和可承载 ActiveX 控件的其他程序中,
注意:ExternalInterface 类可为以下通信提供更好的功能:JavaScript 与 ActionScript 之间的通信(用法 2);ActionScript 与 VisualBasic、Visual C++ 或可承载 ActiveX 控件的其他程序之间的通信(用法 4)。应继续使用
注意:此示例应在独立的 Flash Player 中执行,而不是在 Web 浏览器中执行。
AIR 配置文件支持:桌面操作系统支持此功能,但所有移动设备均不支持此功能。用于电视的 AIR 设备也不支持此功能。您可以使用
利用 IME,用户可键入多字节语言(例如,中文、日语和韩语)的非 ASCII 文本字符。有关使用 IME 的详细信息,请参阅要为其开发应用程序的操作系统的文档。要获取其他资源,请参阅以下网站:
如果用户计算机上 IME 未处于活动状态,则对 IME 方法或属性(除
下表显示了此类适用的平台范围:
* 并非所有 Windows IME 都支持上述全部操作。唯一支持全部操作的 IME 是日语 IME。
** 在 Macintosh 上,只有日语 IME 支持这些方法,第三方 IME 不支持这些方法。
此类的 ActionScript 3.0 版本不支持 Macintosh Classic。
如果不存在具有焦点的文本字段,则此方法将会失败并引发错误。
其他属性和方法在 flash.system 包的其他类中:Capabilities 类、
此类只包含静态方法和属性。无法创建 System 类的新实例。
仅适用于独立的 Flash Player 调试版。
AIR 应用程序应调用
仅限于 Flash Player 调试版或 AIR Debug Launcher (ADL)。
仅限于 Flash Player 调试版或 AIR Debug Launcher (ADL)。
此方法是为 Flash Player 9 中运行的 SWF 内容提供的。它只允许向剪贴板添加 String 内容。
在 AIR 应用程序中,Flash Player 10 内容和应用程序安全沙箱中的内容可以调用
AIR 开发人员应使用此属性确定应用程序的总内存使用量。
对于 Flash Player,这包括容器应用程序(如 Web 浏览器)所使用的内存。
此属性表示为数字,允许使用比
此属性不返回由 Adobe AIR 应用程序
此属性不返回由 Adobe AIR 应用程序
如果分配的内存量大于 uint 对象的最大值(
作为外部文件加载(使用
如果加载的外部文本文件不是 Unicode 编码格式,则应将
System.useCodePage = true;
如果存在此代码,则应用程序将使用操作系统的传统代码页来解释外部文本。例如,对于英文 Windows 操作系统,这通常为 CP1252,而对于日语操作系统,这通常为 Shift-JIS。
如果将
为确保所有平台上的用户都能查看您的应用程序中使用的外部文本文件,应将所有外部文本文件按 Unicode 进行编码,并保留
Flash Player 通过调度 NetStatusEvent 事件确定需要进行 Flash Access 模块更新。此事件包含一个其值为
Flash Player 通过使用几种可能的
注意:所有桌面平台上都支持 SystemUpdater API。
更新开始后,侦听在此类中定义的事件。下列事件表示更新结束并允许进行新的更新或继续尝试进行更新,与调用