在ios上开发AIR应用程序中,Loader的使用解析

Loader 类可用于加载 SWF 文件或图像(JPG、PNG 或 GIF)文件。使用 load() 方法来启动加载。被加载的显示对象将作为 Loader 对象的子级添加。

使用 URLLoader 类加载文本或二进制数据。

Loader 类会覆盖其继承的以下方法,因为 Loader 对象只能有一个子显示对象 -- 其加载的显示对象。调用以下方法将引发异常:addChild()、addChildAt()、removeChild()、removeChildAt() 和 setChildIndex()。要删除被加载的显示对象,必须从其父 DisplayObjectContainer 子级数组中删除 Loader 对象。

 iOS 注意事项

在 iOS 上的 AIR 应用程序中,只能从应用程序包加载包含 ActionScript 的 SWF 文件。此限制针对的是任何 ActionScript,如为 ActionScript 导出类名称的资源。若想加载 SWF 文件,加载的 SWF 必须与父 SWF 使用相同的应用程序域,如下例所示:

var loader:Loader = new Loader();
 var url:URLRequest = new URLRequest("swfs/SecondarySwf.swf");
 var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null);
 loader.load(url, loaderContext);

此外,在 iOS 上,您不能在加载包含任何 ActionScript 字节码 (ABC) 的 SWF 文件之后卸载它然后再重新加载它。如果您试图这样做,运行时会引发错误 3764。

在 AIR 3.6 之前,无论是从应用程序包还是通过网络加载 SWF 文件,只能加载不包含 ActionScript 字节代码的 SWF 文件。若想使用包含 ActionScript 的外部 SWF 文件,可用一种替代方法,即创建一个 SWC 库,然后将其链接到您的主 SWF。

AIR 3.7 及更高版本支持加载外部托管的二级 SWF。有关此功能的详细说明可以在此处找到。

当应用程序运行在 iOS 模拟器中(ipa-test-interpreter-simulator 或 ipa-debug-interpreter-simulator)或解释器模式下(ipa-test-interpreter 或 ipa-debug-interpreter)时,这些 iOS 限制不适用。

Loader 安全性

在使用 Loader 类时,请考虑 Flash Player 和 Adobe AIR 的安全模型:

您可以加载来自任何可访问源的内容。
如果执行调用的 SWF 文件位于网络沙箱中并且要加载的文件是本地的,则不允许加载。
如果加载的内容为用 ActionScript 3.0 编写的 SWF 文件,那么除非可以通过调用加载的内容文件中的 System.allowDomain() 或 System.allowInsecureDomain() 方法来允许跨脚本排列,否则另一个安全沙箱中的 SWF 文件不能对它执行跨脚本操作。
如果被加载的内容为 AVM1 SWF 文件(用 ActionScript 1.0 或 2.0 编写),则 AVM2 SWF 文件(用 ActionScript 3.0 编写)不能对它执行跨脚本操作。但是,可以通过使用 LocalConnection 类在两个 SWF 文件之间实现通信。
如果加载的内容为图像,则安全沙箱之外的 SWF 文件将无法访问其数据,除非该 SWF 文件的域包含在该图像的原始域上的 URL 策略文件中。
在只能与本地文件系统的内容交互的沙箱中的影片剪辑不能对只能与远程内容交互的沙箱中的影片剪辑使用脚本,反之亦然。
无法连接到常用的保留端口。有关已阻止的端口的完整列表,请参阅《ActionScript 3.0 开发人员指南》中的“限制网络 API”。
但在 AIR 中,application 安全沙箱中的内容(使用 AIR 应用程序安装的内容)不受这些安全限制的约束。

有关安全性的详细信息,请参阅 Flash Player 开发人员中心主题:安全性。

当从不受信任的源(如除 Loader 对象的根 SWF 文件以外的域)加载 SWF 文件时,您可能需要为 Loader 对象定义遮罩,以防止将加载的内容(Loader 对象的子级)绘画到该遮罩之外的舞台部分中,如以下代码所示:

 import flash.display.*;
 import flash.net.URLRequest;
 var rect:Shape = new Shape();
 rect.graphics.beginFill(0xFFFFFF);
 rect.graphics.drawRect(0, 0, 100, 100);
 rect.graphics.endFill();
 addChild(rect);
 var ldr:Loader = new Loader();
 ldr.mask = rect;
 var url:String = "http://www.unknown.example.com/content.swf";
 var urlReq:URLRequest = new URLRequest(url);
 ldr.load(urlReq);
 addChild(ldr);

注意:App Transport Security(应用程序传输安全性)是在 Apple iOS9 中引入的,它不允许应用程序和 Web 服务之间的连接不安全。鉴于应用程序传输安全性会改变所有通过 Loader 与不安全网站建立的连接,URLLoader 将停止使用而不再起作用。请通过在应用程序中为 Info.plist 添加关键字来指定默认行为的例外情况。

要完全关闭此功能,可以在您的 Info.plist 中添加以下内容,工作方式就会像以前一样。

     <key>NSAppTransportSecurity</key>
               <dict>
                   <key>NSAllowsArbitraryLoads</key><true/>
               </dict>

请通过在应用程序中为应用程序描述符的 InfoAdditions 标签添加关键字来指定默认行为的例外情况。

  <iPhone>
  <InfoAdditions>
                   <![CDATA[
                          <key>NSAppTransportSecurity</key>
                              <dict>
                                        <key>NSExceptionDomains</key>
                              <dict>
                                       <key>www.example.com</key>
                              <dict>
                                     <!--Include to allow subdomains-->
                                     <key>NSIncludesSubdomains</key>
                                     <true/>
                                     <!--Include to allow HTTP requests-->
                                     <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                                     <true/>
                                      <!--Include to specify minimum TLS version-->
                                      <key>NSTemporaryExceptionMinimumTLSVersion</key>
                                      <string>TLSv1.1</string>
                              </dict>
                              </dict>
                              </dict>
                  ]]>
         </InfoAdditions>
  </iPhone>

参考文献

添加新评论