包 | flash.net |
类 | public class SharedObject |
继承 | SharedObject EventDispatcher Object |
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
可使用共享对象执行以下操作:
-
保持本地永久性。这是使用共享对象的最简单方法,并且无需使用 Flash Media Server。例如,可以调用
SharedObject.getLocal()
以在应用程序中创建共享对象,如带记忆功能的计算器。用户关闭计算器时,Flash Player 将在用户计算机的共享对象中保存最后一个值。计算器下一次运行时,将包含先前所拥有的值。或者,在计算器应用程序关闭之前,如果将共享对象的属性设置为null
,下次运行该应用程序时,它在打开时不包含任何值。维护本地永久性的另一示例就是跟踪用户首选项或复杂网站的其它数据,如用户在新闻网站上所阅读文章的记录。跟踪此信息将允许您以不同方式分别显示已经阅读的文章和新的未读文章。在用户计算机上存储此信息可减小服务器负载。 -
在 Flash Media Server 上存储并共享数据。共享对象可以在服务器上存储数据以供其它客户端进行检索。例如,调用
SharedObject.getRemote()
以创建一个在服务器上永久保留的远程共享对象,如电话簿。每次客户端对共享对象进行更改时,修改后的数据可供当前或以后连接到该对象的所有客户端使用。如果还在本地永久保留了该对象,并且客户端在未连接到服务器时更改了数据,下次客户端连接到远程共享对象时,则会将数据复制到该对象。 - 实时共享数据。共享对象可以实现多个客户端的实时数据共享。例如,您可以打开一个存储连接到聊天室的用户列表的远程共享对象,连接到该对象的所有客户端都能看到此列表。当用户进入或离开聊天室时,将更新该对象,连接到该对象的所有客户端都能看到修改的聊天室用户列表。
要创建本地共享对象,请调用 SharedObject.getLocal()
。要创建远程共享对象,请调用 SharedObject.getRemote()
。
当应用程序关闭时,将会刷新共享对象或将其写入磁盘。也可以调用 flush()
方法以明确地将数据写入磁盘。
本地磁盘空间注意事项。本地共享对象具有一些限制,这些限制很重要,您在设计应用程序时要予以考虑。有时可能不允许 SWF 文件写入本地共享对象,有时可能会在您不知情的情况下删除在本地共享对象中存储的数据。Flash Player 用户可以管理对单个域或所有域可用的磁盘空间。当用户减少可用磁盘空间时,一些本地共享对象可能会被删除。Flash Player 用户还具有隐私控制能力,它们可防止第三方域(当前浏览器地址栏中域之外的域)读取或写入本地共享对象。另请注意,在 Mac OS 上,从 AIR 3.3 开始,本地共享对象的位置将发生更改,所以如果您升级到 3.3 命名空间,它可能显得对象似乎消失了。
注意:在本地计算机(而不是远程服务器)上存储和运行的 SWF 文件始终可以将第三方共享对象写入磁盘。有关第三方共享对象的详细信息,请参阅“Flash Player 帮助”中的“全局存储设置”面板。
最好检查与磁盘空间数量和用户隐私控制有关的故障。在调用 getLocal()
和 flush()
时执行这些检查:
-
SharedObject.getLocal()
-- 调用此方法失败时(如用户禁用了第三方共享对象,并且您的 SWF 文件的域与浏览器地址栏中的域不匹配),Flash Player 将引发异常。 -
SharedObject.flush()
-- 调用此方法失败时,Flash Player 将引发异常。调用成功时,将返回SharedObjectFlushStatus.FLUSHED
。需要额外存储空间时,将返回SharedObjectFlushStatus.PENDING
。Flash Player 提示用户增加本地保存信息的存储空间。随后,对netStatus
事件进行调度,同时信息对象将表示刷新是否成功。
如果您的 SWF 文件尝试创建或修改本地共享对象,请确保 SWF 文件的宽度至少为 215 像素,高度至少为 138 像素,这是用于显示提示用户增加其本地共享对象存储限制的对话框的最小尺寸。如果您的 SWF 文件小于这些尺寸,且需要增加存储限制,则 SharedObject.flush()
失败,返回 SharedObjectFlushedStatus.PENDING
,并调度 netStatus
事件。
远程共享对象。如果使用 Flash Media Server,您可以创建并使用远程共享对象,这些对象是由连接到应用程序的所有客户端实时共享的。在一个客户端更改远程共享对象的属性时,也会为所有连接的客户端更改此属性。您可以使用远程共享对象同步客户端,例如,在玩多人游戏的用户。
每个远程共享对象具有一个 data
属性,此对象包含存储数据的属性。可以调用 setProperty()
以更改数据对象的属性。服务器将更新这些属性,调度 sync
事件,并将这些属性发回到连接的客户端。
您可以选择将远程共享对象永久保留在客户端和/或服务器上。默认情况下,Flash Player 最多在本地永久保存 100K 的远程共享对象。在尝试保存较大的对象时,Flash Player 将显示一个“本地存储”对话框,用户可以在其中允许或拒绝共享对象的本地存储。请确保舞台大小至少为 215 x 138 像素;这是 Flash 显示该对话框所需的最小大小。
如果用户选择“允许”,服务器将保存共享对象并调度 netStatus
事件,code
属性值为 SharedObject.Flush.Success
。如果用户选择“拒绝”,服务器不会保存共享对象并调度 netStatus
事件,code
属性值为 SharedObject.Flush.Failed
。
相关 API 元素
属性 | 由以下参数定义 | ||
---|---|---|---|
client : Object
表示对其调用回调方法的对象。 | SharedObject | ||
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
data : Object [只读]
赋给对象的 data 属性 (property) 的属性 (attribute) 集合;可以共享和存储这些属性 (attribute)。 | SharedObject | ||
defaultObjectEncoding : uint [静态]
在 SWF 文件中创建的所有本地共享对象的默认对象编码(AMF 版本)。 | SharedObject | ||
fps : Number [只写]
指定每秒钟客户端对共享对象所做的更改被发送到服务器的次数。 | SharedObject | ||
objectEncoding : uint
此共享对象的对象编码(AMF 版本)。 | SharedObject | ||
preventBackup : Boolean [静态]
指定是否将在 iOS 云备份服务上备份本地共享对象。 | SharedObject | ||
size : uint [只读]
共享对象的当前大小(以字节为单位)。 | SharedObject |
方法 | 由以下参数定义 | ||
---|---|---|---|
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。 | EventDispatcher | ||
对于本地共享对象,清除所有数据并从磁盘删除共享对象。 | SharedObject | ||
关闭远程共享对象和服务器间的连接。 | SharedObject | ||
通过指定的 NetConnection 对象连接到服务器上的远程共享对象。 | SharedObject | ||
将事件调度到事件流中。 | EventDispatcher | ||
将本地永久共享对象立即写入本地文件。 | SharedObject | ||
[静态]
返回对本地永久保留的共享对象的引用,该对象只能用于当前客户端。 | SharedObject | ||
getRemote(name:String, remotePath:String = null, persistence:Object = false, secure:Boolean = false):SharedObject [静态]
返回对 Flash Media Server 上可由多个客户端访问的共享对象的引用。 | SharedObject | ||
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。 | EventDispatcher | ||
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
从 EventDispatcher 对象中删除侦听器。 | EventDispatcher | ||
向连接到远程共享对象的所有客户端广播一条消息(包括发送该消息的客户端)。 | SharedObject | ||
通知服务器共享对象中的属性值已更改。 | SharedObject | ||
更新共享对象中某个属性的值,并通知服务器该属性的值已更改。 | SharedObject | ||
设置循环操作动态属性的可用性。 | Object | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object | ||
检查是否用此 EventDispatcher 对象或其任何祖代为指定事件类型注册了事件侦听器。 | EventDispatcher |
事件 | 摘要 | 由以下参数定义 | ||
---|---|---|---|---|
[广播事件] Flash Player 或 AIR 应用程序获得操作系统焦点并变为活动状态时将调度此事件。 | EventDispatcher | |||
在异步引发异常(即来自本机异步代码)时调度。 | SharedObject | |||
[广播事件] Flash Player 或 AIR 应用程序失去操作系统焦点并变为非活动状态时将调度此事件。 | EventDispatcher | |||
在 SharedObject 实例报告其状态或错误条件时调度。 | SharedObject | |||
在服务器更新了远程共享对象后调度。 | SharedObject |
client | 属性 |
data | 属性 |
data:Object
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
赋给对象的 data
属性 (property) 的属性 (attribute) 集合;可以共享和存储这些属性 (attribute)。每个特性都可以是任何 ActionScript 或 JavaScript 类型的对象(数组、数字、布尔值、字节数组、XML,等等)。例如,下面几行将值赋给共享对象的不同方面:
var items_array:Array = new Array(101, 346, 483); var currentUserIsAdmin:Boolean = true; var currentUserName:String = "Ramona"; var my_so:SharedObject = SharedObject.getLocal("superfoo"); my_so.data.itemNumbers = items_array; my_so.data.adminPrivileges = currentUserIsAdmin; my_so.data.userName = currentUserName; for (var prop in my_so.data) { trace(prop+": "+my_so.data[prop]); }
如果对象是永久的,将保存共享对象的 data
属性 (property) 的所有属性 (attribute),共享对象包含以下信息:
userName: Ramona adminPrivileges: true itemNumbers: 101,346,483
注意:切勿将值直接赋给共享对象的 data
属性,如同在 so.data = someValue
中一样;Flash Player 将忽略这些赋值。
要删除本地共享对象的属性,请使用诸如 delete so.data.attributeName
这样的代码;将本地共享对象的属性设置为 null
或 undefined
不会删除该属性。
要为共享对象创建私有 值(该对象正在使用时只有客户端实例才可以使用该值,并且该值在对象关闭时不与该对象存储在一起),请创建名称不是 data
的属性来存储它们,如下例所示:
var my_so:SharedObject = SharedObject.getLocal("superfoo"); my_so.favoriteColor = "blue"; my_so.favoriteNightClub = "The Bluenote Tavern"; my_so.favoriteSong = "My World is Blue"; for (var prop in my_so) { trace(prop+": "+my_so[prop]); }
共享对象包含以下数据:
favoriteSong: My World is Blue favoriteNightClub: The Bluenote Tavern favoriteColor: blue data: [object Object]
对于用于服务器的远程共享对象,data
属性 (property) 的所有属性 (attribute) 可供连接到共享对象的所有客户端使用;如果永久保留这些对象,则会保存所有属性 (attribute)。如果一个客户端更改了属性的值,所有客户端可以立即看到新的值。
实现
public function get data():Object
相关 API 元素
defaultObjectEncoding | 属性 |
defaultObjectEncoding:uint
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
在 SWF 文件中创建的所有本地共享对象的默认对象编码(AMF 版本)。在将本地共享对象写入磁盘时,SharedObject.defaultObjectEncoding
属性将表示应使用的 Action Message Format 的版本:ActionScript 3.0 格式 (AMF3)、ActionScript 1.0 还是 2.0 格式 (AMF0)。
关于对象编码的详细信息(包括本地和远程共享对象编码的差异),请参阅 objectEncoding
属性的描述。
SharedObject.defaultObjectEncoding
的默认值设置为使用 ActionScript 3.0 格式 (AMF3)。如果要创建 ActionScript 2.0 或 1.0 SWF 文件可以读取的本地共享对象,则应在创建任何本地共享对象之前,在脚本起始处将 SharedObject.defaultObjectEncoding
设置为使用 ActionScript 1.0 或 ActionScript 2.0 格式 (flash.net.ObjectEncoding.AMF0
)。随后创建的所有本地共享对象都将使用 AMF0 编码,并可与旧内容交互。本地共享对象创建后,将无法更改现有本地共享对象的 objectEncoding
值,通过设置 SharedObject.defaultObjectEncoding
。
为了以每个对象为基础设置对象编码,而不是为 SWF 文件创建的所有共享对象设置对象编码,则应设置本地共享对象的 objectEncoding
属性。
实现
public static function get defaultObjectEncoding():uint
public static function set defaultObjectEncoding(value:uint):void
相关 API 元素
fps | 属性 |
fps:Number
[只写] 语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
指定每秒钟客户端对共享对象所做的更改被发送到服务器的次数。
如果希望控制客户端与服务器之间的通信量,可以使用此方法。例如,如果客户端与服务器之间的连接相对较慢,可以将 fps
设置为一个相对较小的值。相反,如果客户端连接到一个对时间具有高要求的多用户应用程序,可能需要将 fps
设置为一个相对较大的值。
设置 fps
将触发 sync
事件并更新对服务器的所有更改。如果只想手动更新服务器,可将 fps
为 0。
在调度 sync
事件之前,不会将更改发送给服务器。也就是说,如果服务器的响应时间较慢,向服务器发送更新的频率则可能小于此属性中的指定值。
实现
public function set fps(value:Number):void
objectEncoding | 属性 |
objectEncoding:uint
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
此共享对象的对象编码(AMF 版本)。在将本地共享对象写入磁盘时,objectEncoding
属性将表示应使用的 Action Message Format 的版本:ActionScript 3.0 格式 (AMF3)、ActionScript 1.0 还是 2.0 格式 (AMF0)。
根据共享对象是本地还是远程来执行不同的对象编码操作。
- 本地共享对象。您可以为本地共享对象获取或设置
objectEncoding
属性值。objectEncoding
的值影响在写入 此本地共享对象时使用的格式设置。如果此本地共享对象必须能被 ActionScript 2.0 或 1.0 SWF 文件读取,则应将objectEncoding
设置为ObjectEncoding.AMF0
。即便对象编码设置为写入 AMF3,Flash Player 仍然能够读取 AMF0 本地共享对象。也就是说,如果使用此属性的默认值,即ObjectEncoding.AMF3
,则您的 SWF 文件仍然能够读取由 ActionScript 2.0 或 1.0 SWF 文件创建的共享对象。 - 远程共享对象。连接到服务器时,远程共享对象从关联的 NetConnection 实例(此实例用于连接到远程共享对象)继承其
objectEncoding
设置。未连接到服务器时,远程共享对象从关联的 NetConnection 实例继承defaultObjectEncoding
设置。因为远程共享对象的objectEncoding
属性值由 NetConnection 实例决定,所以此属性对远程共享对象为只读。
实现
public function get objectEncoding():uint
public function set objectEncoding(value:uint):void
引发
ReferenceError — 您尝试为某个远程共享对象设置 objectEncoding 属性值。对于远程共享对象而言,此属性为只读,因为其值由关联的 NetConnection 实例决定。
|
相关 API 元素
preventBackup | 属性 |
preventBackup:Boolean
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 3.7 |
指定是否将在 iOS 云备份服务上备份本地共享对象。
指定 true 或 false:
- true - 不在 iOS 备份云服务上备份任何本地共享对象。
- false(默认)- 将在 iOS 备份云服务上备份本地共享对象。
此属性仅适用于本地共享对象,且仅针对 iOS。
实现
public static function get preventBackup():Boolean
public static function set preventBackup(value:Boolean):void
size | 属性 |
size:uint
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
共享对象的当前大小(以字节为单位)。
Flash 通过逐一计算共享对象的每个数据属性计算该对象的大小;对象具有的数据属性越多,评估其大小所花的时间就越长。评估对象大小可能要耗费相当长的处理时间,因此,除非您对它具有特定的需要,否则您可能希望避免使用此方法。
实现
public function get size():uint
示例 ( 如何使用本示例 )
"thehobbit"
创建 SharedObject 对象。将名为 username
的属性添加到 SharedObject 对象的数据属性中。然后跟踪 size
属性,这将返回表示的值。
import flash.net.SharedObject; // if these get copied or not var mySo:SharedObject = SharedObject.getLocal("thehobbit"); mySo.data.username = "bilbobaggins"; trace(mySo.size); // 55
clear | () | 方法 |
public function clear():void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
对于本地共享对象,清除所有数据并从磁盘删除共享对象。对共享对象的引用仍然处于活动状态,但其数据属性被删除。
对于用于 Flash Media Server 的远程共享对象,clear()
将断开该对象并清除所有数据。如果在本地永久保留了共享对象,此方法还会从磁盘中删除该共享对象。对共享对象的引用仍然处于活动状态,但其数据属性被删除。
示例 ( 如何使用本示例 )
hostName
的 ID 创建(并在后续执行过程中检索)一个 SharedObject 对象。将名为 username
的属性添加到 SharedObject 对象的数据属性中。最后调用 clear()
方法,以清除添加到数据对象的所有信息(在本例中是一个名为 username
属性)。
package { import flash.net.SharedObject; public class SharedObject_clear { private var hostName:String = "yourDomain"; private var username:String = "yourUsername"; public function SharedObject_clear() { var mySo:SharedObject = SharedObject.getLocal(hostName); if(mySo.data.username == null) { mySo.data.username = username; trace("set: " + mySo.data.username); // yourUsername } else { mySo.clear(); trace("cleared: " + mySo.data.username); // undefined } } } }
close | () | 方法 |
public function close():void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
关闭远程共享对象和服务器间的连接。如果一个远程共享对象永久储存在本地,那么在此方法被调用后,用户可以对该对象的本地副本进行更改。对本地对象的任何更改都将在用户下一次连接到远程共享对象时发送给服务器。
connect | () | 方法 |
public function connect(myConnection:NetConnection, params:String = null):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
通过指定的 NetConnection 对象连接到服务器上的远程共享对象。应在调用 getRemote()
后使用此方法。在连接成功时,将调度 sync
事件。
在尝试使用远程共享对象时,应先使用 try..catch..finally
语句。接着,侦听并处理 sync
事件,然后再对共享对象进行更改。在调度 sync
事件之前,进行的任何本地更改可能会丢失。
可以调用 connect()
方法以连接到远程共享对象,例如:
var myRemoteSO:SharedObject = SharedObject.getRemote("mo", myNC.uri, false); myRemoteSO.connect(myNC);
参数
myConnection:NetConnection — 使用实时消息传递协议 (RTMP) 的 NetConnection 对象,如用于与 Flash Media Server 进行通信的 NetConnection 对象。
| |
params:String (default = null ) — 一个字符串,用于定义将传递给服务器上的远程共享对象的消息。不能用于 Flash Media Server。
|
引发
Error — Flash Player 无法连接到指定的远程共享对象。确认 NetConnection 实例有效并已连接,且已在服务器上成功创建远程共享对象。
|
相关 API 元素
flush | () | 方法 |
public function flush(minDiskSpace:int = 0):String
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
将本地永久共享对象立即写入本地文件。如果不使用此方法,则 Flash Player 会在共享对象会话结束时(也就是说,在 SWF 文件关闭时,在由于不再有对共享对象的任何引用而将其作为垃圾回收时,或者在调用 SharedObject.clear()
或 SharedObject.close()
时),将共享对象写入文件。
如果此方法返回 SharedObjectFlushStatus.PENDING
,则 Flash Player 将显示一个对话框,要求用户增加磁盘空间量以供此域中的对象使用。要允许将来保存共享对象时其空间能够增长,从而避免返回值 PENDING
,请为 minDiskSpace
传递一个值。当 Flash Player 尝试写入文件时,它将查找传递给 minDiskSpace
的字节数,而不是查找足够的空间以共享对象的当前大小来保存共享对象。
例如,如果预期共享对象增长到最大为 500 个字节,则即使它开始时要小得多,也为 minDiskSpace
传递 500。如果 Flash 要求用户为该共享对象分配磁盘空间,它将要求 500 个字节。在用户分配了请求的空间量之后,当以后尝试对齐该对象时(只要其大小不超过 500 个字节),Flash 将无需要求更多的空间。
在用户响应此对话框后,则会再次调用此方法。将调度 netStatus
事件,code
属性值为 SharedObject.Flush.Success
或 SharedObject.Flush.Failed
。
参数
minDiskSpace:int (default = 0 ) — 必须分配给此对象的最小磁盘空间(以字节为单位)。
|
String — 下列任一值:
|
引发
Error — Flash Player 不能将共享对象写入磁盘。如果用户已永久禁止对来自该域的对象进行本地信息存储,则可能出现此错误。
注意:本地内容始终可以将来自第三方域(当前浏览器地址栏中的域以外的域)的共享对象写入磁盘,即使禁止将第三方共享对象写入磁盘。 |
相关 API 元素
示例 ( 如何使用本示例 )
hostName
的 ID 创建(并在后续执行过程中检索)一个 SharedObject 对象。将名为 username
的属性添加到 SharedObject 对象的数据属性中。然后调用 flush()
方法,并检查以确定返回的是字符串 pending
还是 true
或 false
的布尔值。务必注意:打开的所有 SharedObject 实例都将在 Flash Player 的当前实例关闭时自动刷新。
package { import flash.net.SharedObject; public class SharedObject_flush { private var hostName:String = "yourDomain"; private var username:String = "yourUsername"; public function SharedObject_flush() { var mySo:SharedObject = SharedObject.getLocal(hostName); mySo.data.username = username; var flushResult:Object = mySo.flush(); trace("flushResult: " + flushResult); trace(mySo.data.username); // yourUsername } } }
getLocal | () | 方法 |
public static function getLocal(name:String, localPath:String = null, secure:Boolean = false):SharedObject
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
返回对本地永久保留的共享对象的引用,该对象只能用于当前客户端。如果尚不存在共享对象,则此方法将创建一个共享对象。如果传递给 getLocal()
的任何值均无效,或如果调用失败,Flash Player 将引发异常。
以下代码显示如何将返回的共享对象引用赋给变量:
var so:SharedObject = SharedObject.getLocal("savedData");
注意:如果用户已选择了从不允许此域进行本地存储,则即使指定了 localPath
的值,对象也不会在本地保存。本地内容不遵循此规则。本地内容始终可以将第三方域(当前浏览器地址栏中域之外的域)中的共享对象写入磁盘,即使禁止将第三方共享对象写入磁盘。
为了避免名称冲突,Flash 会考虑创建共享对象的 SWF 文件的位置。例如,如果位于 www.myCompany.com/apps/stockwatcher.swf 的 SWF 文件创建了一个名为 portfolio
的共享对象,则该共享对象不会与位于 www.yourCompany.com/photoshoot.swf 的 SWF 文件所创建的另一个名为 portfolio
的对象冲突,这是因为这两个 SWF 文件源于不同的目录。
虽然 localPath
参数是可选的,但是您应该考虑该参数的用途,特别是其它 SWF 文件需要访问共享对象时。如果共享对象中的数据特定于一个不会移动到其它位置的 SWF 文件,则使用默认值将会解决问题。如果其它 SWF 文件需要访问共享对象,或如果创建共享对象的 SWF 文件以后将发生移动,则此参数的值将影响共享对象的可访问性。例如,如果在 localPath
设置为等于 SWF 文件完整路径的默认值时创建一个共享对象,那么其它任何 SWF 文件都将无法访问该共享对象。如果您以后将原始的 SWF 文件移动到另一个位置,那么,即便是该 SWF 文件也将无法访问已经存储在共享对象中的数据。
为避免意外限制对共享对象的访问,请使用 localpath
参数。允许级别最高的方法是将 localPath
设置为 /
(斜杠),这样做可使域中的所有 SWF 文件都可访问该共享对象,但会增加与域中其它共享对象发生名称冲突的可能性。限制级别较高的方法是向 localPath
追加 SWF 文件完整路径中的文件夹名。例如,对于位于 www.myCompany.com/apps/stockwatcher.swf 的 SWF 文件创建的 portfolio
共享对象,可以将 localPath
参数设置为/
、/apps
或 /apps/stockwatcher.swf
。您必须确定哪种方法能为您的应用程序提供最佳的灵活性。
在使用此方法时,请考虑以下安全模型:
- 无法跨沙箱边界访问共享对象。
- 用户可通过使用“Flash Player 设置”对话框或“设置管理器”来限制共享对象访问。默认情况下,应用程序可在每个域创建高达 100 KB 数据的共享对象。管理员和用户还可限制写入文件系统的能力。
假定您将要播放的 SWF 文件内容发布为本地文件(本地安装的 SWF 文件或 EXE 文件)而且,您需要从多个本地 SWF 文件访问某个特定的共享对象。在这种情况下,请注意:对于本地文件而言,可能会使用两个不同位置来存储共享对象。所用的域取决于为创建该共享对象的本地文件授予的安全权限。本地文件可以具有三种不同级别的权限:
- 仅能访问本地文件系统。
- 仅能访问网络。
- 既能访问网络,也能访问本地文件系统。
可以访问本地文件系统(1 级或 3 级)的本地文件将其共享对象存储在一个位置。无法访问本地文件系统(2 级)的本地文件将其共享对象存储在另一位置。
可以在包含 SWF 内容的 HTML 页中设置 object
和 embed
标签的 allowNetworking
参数,防止 SWF 文件使用此方法。
有关详细信息,请参阅 Flash Player 开发人员中心主题:安全性。
参数
name:String — 对象的名称。该名称可以包含正斜杠 (/ );例如,work/addresses 是合法名称。共享对象名称中不允许使用空格,也不允许使用以下字符:
~ % & \ ; : " ' , < > ? # | |
localPath:String (default = null ) — 创建了共享对象的 SWF 文件的完整路径或部分路径,这将确定共享对象的本地存储位置。如果未指定此参数,则使用完整路径。
| |
secure:Boolean (default = false ) — 确定对此共享对象的访问是否只限于通过 HTTPS 连接传递的 SWF 文件。如果 SWF 文件通过 HTTPS 传递,则此参数值具有以下效果:
如果您的 SWF 文件是通过非 HTTPS 连接传递的,并且您尝试将此参数设置为 下面的图示说明了 |
SharedObject — 一个对共享对象的引用,该共享对象永久贮存在本地并且只可用于当前客户端。如果 Flash Player 无法创建或找到共享对象(例如,指定了 localPath 但不存在此目录时),此方法将引发异常。
|
引发
Error — 不论什么原因,Flash Player 均不能创建共享对象。如果禁止第三方 Flash 内容创建或存储永久共享对象,将出现此错误。用户可以在“设置管理器”的“全局存储设置”面板上禁止第三方永久共享对象,相关设置请参阅 http://www.adobe.com/support/documentation/cn/flashplayer/help/settings_manager03.html。
|
getRemote | () | 方法 |
public static function getRemote(name:String, remotePath:String = null, persistence:Object = false, secure:Boolean = false):SharedObject
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
返回对 Flash Media Server 上可由多个客户端访问的共享对象的引用。如果远程共享对象尚不存在,此方法将创建一个共享对象。
要创建远程共享对象,请调用 getRemote()
,然后调用 connect()
以将远程共享对象连接到服务器,如下所示:
var nc:NetConnection = new NetConnection(); nc.connect("rtmp://somedomain.com/applicationName"); var myRemoteSO:SharedObject = SharedObject.getRemote("mo", nc.uri, false); myRemoteSO.connect(nc);
要确认共享对象的本地副本和远程副本是否已同步,请侦听并处理 sync
事件。希望共享此对象的所有客户端必须为 name
和 remotePath
参数传递相同的值。
要创建只能用于当前客户端的共享对象,请使用 SharedObject.getLocal()
。
参数
name:String — 远程共享对象的名称。该名称可以包含正斜杠 (/);例如,work/addresses 是合法名称。共享对象名称中不允许使用空格,也不允许使用以下字符:
~ % & \ ; : " ' , > ? ? # | |
remotePath:String (default = null ) — 将存储共享对象的服务器的 URI。此 URI 必须与传递给 connect() 方法的 NetConnection 对象的 URI 相同。
| |
persistence:Object (default = false ) — 指定共享对象的数据属性的特性是本地永久储存还是远程永久储存,或者是同时进行本地永久储存和远程永久储存。此参数还可指定共享对象的本地存储位置。可接受的值包括:
注意:如果用户已选择了从不允许此域的本地存储,则即使将本地路径指定为永久性,对象也不会在本地保存。有关详细信息,请参阅类的描述。 | |
secure:Boolean (default = false ) — 确定对此共享对象的访问是否只限于通过 HTTPS 连接传递的 SWF 文件。有关详细信息,请参阅对 secure 参数的描述(getLocal 方法条目中)。
|
SharedObject — 对可在多个客户端间共享的对象的引用。
|
引发
Error — Flash Player 无法创建或找到共享对象。如果为 remotePath 和 persistence 参数指定不存在的路径,则将出现这种情况。
|
相关 API 元素
send | () | 方法 |
public function send(... arguments):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
向连接到远程共享对象的所有客户端广播一条消息(包括发送该消息的客户端)。要处理并响应该消息,请创建一个附加到共享对象的回调函数。
参数
... arguments — 一个或多个参数:标识消息的字符串、附加到共享对象的一个或多个处理函数的名称以及任意类型可选参数。处理函数的名称只能为单级形式(即不能是父/子级形式)并相对于共享对象。这些参数已进行序列化处理并通过连接进行发送,而接收处理函数按相同的顺序接收它们。如果某个参数为循环对象(如循环的链接列表),则序列化函数可以正确处理引用。
注意:函数名称切勿使用保留术语。例如, |
setDirty | () | 方法 |
public function setDirty(propertyName:String):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
通知服务器共享对象中的属性值已更改。此方法将属性标记为 dirty,这表明属性已更改。
可以调用 SharedObject.setProperty()
为共享对象创建属性。
SharedObject.setProperty()
方法实现了 setDirty()
。大多数情况下,例如,当属性的值为 String 或 Number 等原始类型时,您可以调用 setProperty()
而不是调用 setDirty()
。然而,如果属性值是一个包含其自己的属性的对象,则调用 setDirty()
以表示该对象中的值的更改时间。
参数
propertyName:String — 已更改的属性名称。
|
相关 API 元素
setProperty | () | 方法 |
public function setProperty(propertyName:String, value:Object = null):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
更新共享对象中某个属性的值,并通知服务器该属性的值已更改。setProperty()
方法明确地将属性标签为已更改或 dirty。
有关远程共享对象的详细信息,请参阅 Flash Media Server 文档。
注意:SharedObject.setProperty()
方法实现了 setDirty()
方法。大多数情况下,例如当属性的值为 String 或 Number 等原始类型时,应使用 setProperty()
,而不使用 setDirty
。然而,当某个属性的值是一个包含其自身属性的对象时,则使用 setDirty()
来表示该对象中的值的更改时间。通常,最好调用 setProperty()
而不要调用 setDirty()
,因为 setProperty()
只在值被更改的时候更新属性值,而 setDirty()
则强制所有订阅客户端进行同步。
参数
propertyName:String — 共享对象中属性的名称。
| |
value:Object (default = null ) — 属性值(一个 ActionScript 对象),如果为 null 则删除属性。
|
相关 API 元素
asyncError | 事件 |
flash.events.AsyncErrorEvent
属性 AsyncErrorEvent.type =
flash.events.AsyncErrorEvent.ASYNC_ERROR
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
在异步引发异常(即来自本机异步代码)时调度。
AsyncErrorEvent.ASYNC_ERROR
常数定义 asyncError
事件对象的 type
属性值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 调度事件的对象。 |
error | 触发此事件的错误。 |
netStatus | 事件 |
flash.events.NetStatusEvent
属性 NetStatusEvent.type =
flash.events.NetStatusEvent.NET_STATUS
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
在 SharedObject 实例报告其状态或错误条件时调度。netStatus
事件包含 info
属性,该属性为包含事件特定信息(例如,连接尝试是否成功或共享对象是否被成功写入本地磁盘)的信息对象。
netStatus
事件对象的 type
属性值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
info | 一个对象,具有描述对象的状态或错误条件的属性。 |
target | 报告其状态的 NetConnection 或 NetStream 对象。 |
相关 API 元素
sync | 事件 |
flash.events.SyncEvent
属性 SyncEvent.type =
flash.events.SyncEvent.SYNC
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
在服务器更新了远程共享对象后调度。
定义sync
事件对象的 type
属性值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
changeList | 一个数组,具有描述其状态的属性。 |
target | 已由服务器更新的 SharedObject 实例。 |
相关 API 元素
"application-name"
创建(并在后续执行过程中检索)一个共享对象: 单击“保存”按钮时,saveValue()
方法尝试将一个名为 savedValue
的属性保存到 SharedObject 对象的 data
的属性。如果 Flash Player 要求提供保存数据的权限,当用户授予或拒绝授予权限时,将调用 onFlushStatus()
方法。单击“清除”按钮时,clearValue()
方法将删除 savedValue
中保存的值;下次加载 SWF 文件时,所检索的值为 undefined
。
package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.NetStatusEvent; import flash.net.SharedObject; import flash.net.SharedObjectFlushStatus; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFieldType; public class SharedObjectExample extends Sprite { private var mySo:SharedObject; public function SharedObjectExample() { buildUI(); saveBtn.addEventListener(MouseEvent.CLICK, saveValue); clearBtn.addEventListener(MouseEvent.CLICK, clearValue); mySo = SharedObject.getLocal("application-name"); output.appendText("SharedObject loaded...\n"); output.appendText("loaded value: " + mySo.data.savedValue + "\n\n"); } private function saveValue(event:MouseEvent):void { output.appendText("saving value...\n"); mySo.data.savedValue = input.text; var flushStatus:String = null; try { flushStatus = mySo.flush(10000); } catch (error:Error) { output.appendText("Error...Could not write SharedObject to disk\n"); } if (flushStatus != null) { switch (flushStatus) { case SharedObjectFlushStatus.PENDING: output.appendText("Requesting permission to save object...\n"); mySo.addEventListener(NetStatusEvent.NET_STATUS, onFlushStatus); break; case SharedObjectFlushStatus.FLUSHED: output.appendText("Value flushed to disk.\n"); break; } } output.appendText("\n"); } private function clearValue(event:MouseEvent):void { output.appendText("Cleared saved value...Reload SWF and the value should be \"undefined\".\n\n"); delete mySo.data.savedValue; } private function onFlushStatus(event:NetStatusEvent):void { output.appendText("User closed permission dialog...\n"); switch (event.info.code) { case "SharedObject.Flush.Success": output.appendText("User granted permission -- value saved.\n"); break; case "SharedObject.Flush.Failed": output.appendText("User denied permission -- value not saved.\n"); break; } output.appendText("\n"); mySo.removeEventListener(NetStatusEvent.NET_STATUS, onFlushStatus); } // UI elements private var inputLbl:TextField; private var input:TextField; private var output:TextField; private var saveBtn:Sprite; private var clearBtn:Sprite; private function buildUI():void { // input label inputLbl = new TextField(); addChild(inputLbl); inputLbl.x = 10; inputLbl.y = 10; inputLbl.text = "Value to save:"; // input TextField input = new TextField(); addChild(input); input.x = 80; input.y = 10; input.width = 100; input.height = 20; input.border = true; input.background = true; input.type = TextFieldType.INPUT; // output TextField output = new TextField(); addChild(output); output.x = 10; output.y = 35; output.width = 250; output.height = 250; output.multiline = true; output.wordWrap = true; output.border = true; output.background = true; // Save button saveBtn = new Sprite(); addChild(saveBtn); saveBtn.x = 190; saveBtn.y = 10; saveBtn.useHandCursor = true; saveBtn.graphics.lineStyle(1); saveBtn.graphics.beginFill(0xcccccc); saveBtn.graphics.drawRoundRect(0, 0, 30, 20, 5, 5); var saveLbl:TextField = new TextField(); saveBtn.addChild(saveLbl); saveLbl.text = "Save"; saveLbl.selectable = false; // Clear button clearBtn = new Sprite(); addChild(clearBtn); clearBtn.x = 230; clearBtn.y = 10; clearBtn.useHandCursor = true; clearBtn.graphics.lineStyle(1); clearBtn.graphics.beginFill(0xcccccc); clearBtn.graphics.drawRoundRect(0, 0, 30, 20, 5, 5); var clearLbl:TextField = new TextField(); clearBtn.addChild(clearLbl); clearLbl.text = "Clear"; clearLbl.selectable = false; } } }
Tue Jun 12 2018, 11:04 AM Z