Mar 19

弄了整整一个晚上,查阅了大量中英文资料,终于搞定了Flash的Security Policy..简直是太tricky了,写下来供后人参考。

问题是这样的,假设有一个swf文件,存放在http://domain.com/example.swf, 这个swf需要访问example,com或者其他域名。访问的形式可能是ftp, http, 或者socket等等。在老版本的flash player中是没有问题。但是,新版本的flash采用了安全策略文件来控制远程访问。在被访问的服务器上需要存放一个安全策略文件。

安全策略文件有两种:master和meta. master文件存放在服务器根目录下,即http://example.com/crossdomain.xml. meta文件是其他服务自己所提供的policy文件。当一个swf文件访问example.com时,首先在根目录下寻找crossdomain.xml,如果crossdomain.xml允许其他meta file存在,那么flash会根据程序指定端口去寻找meta file.  这里要特别注意,如果你是使用xmlsocket,并且有自己的meta policy file, 在master policy file内要特别注意,permitted-cross-domain-policies = "all"

其次要注意的是,如果使用xmlsocket, flash会先默认访问843端口,然后才访问我们自己指定的端口,会造成一定的延时。所以最好把需要访问的服务在843端口运行。

另外,在flash客户端中,socket.connect(domain. port)这段话之前,必须调用flash.system.Security.loadPolicyFile("xmlsocket://example.com:port");

这句话来得到policy文件。注意大小写。另外,从flash 9的某个版本之后,必须使用xmlsocket这个协议,http已经不被支持。

总接一下所有的步骤:

  1. 在action script里面,socket.connect之前加上loadPolicyFile这一行。
  2. 在服务器根目录建立master policy file,网上example很多。如果使用xmlsocket, 且有自己的meta policy file (比如palabre),必须在master policy file里写明permitted-cross-domain-policies = "all“
  3. 如果需要的话,建立meta policy file.
  4. 尽量把服务开在843端口
  5. 如果使用palabre的,需要注意palabre只处理大于3个字节的域名。如果只写一个*是无效的。所以如果要把服务对所有域名开放,自己改一下palabre的源代码。

附一个master policy file例子:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports= "*" secure="false" />
<allow-http-request-from domain="*" to-ports = "*" secure="false" />
</cross-domain-policy>
 

  • Facebook
  • Twitter
  • Share/Bookmark
Feb 23

最好的方法是使用Singleton,也看到有人使用AppDelegate来共享数据。

Singleton的例子网上很多,比如:

http://iphone.galloway.me.uk/iphone-sdktutorials/singleton-classes/

  • Facebook
  • Twitter
  • Share/Bookmark