[AIR16.0] AIR for iOS でハマったこと (3)

AIR for iOS アプリ を iPad Air 2 (iOS 8.3) にインストールしようとして、ハマったことをメモしておくね。 :bouzu:

AIR SDK 16.0.0.292 [ASC2.0] を使ったよ。 :boy:

loader_iOS_case3

:caution: 要 Flash Player 11.8 以上

次のような構造にして、appA.swf, appB.swf, appC.swf を loader.swf に読み込む。

loader_iOS_case3_directory

Main.as (loader.swf)
package {

  import flash.display.Sprite;
  import flash.display.Loader;
  import flash.display.LoaderInfo;
  import flash.net.URLRequest;
  import flash.events.Event;

  import flash.system.LoaderContext;
  import flash.system.ApplicationDomain;

  import controls.Btn;

  [SWF(backgroundColor="#FFFFFF", width="600", height="800", frameRate="30")]

  public class Main extends Sprite {
    // プロパティ
    private var container:Sprite;
    private var controller:Sprite;
    private var buttons:Array;
    private var selectedId:int = -1;
    private var loader:Loader;
    private static var basePath:String = "assets/";
    private static var files:Array = ["appA.swf", "appB.swf", "appC.swf"];

    // コンストラクタ
    public function Main() {
      init();
    }

    // メソッド
    private function init():void {
      container = new Sprite();
      addChild(container);
      controller = new Sprite();
      addChild(controller);
      controller.y = 720;
      buttons = [];
      for (var n:uint = 0; n < max; n++) {
        var button:Btn = new Btn();
        controller.addChild(button);
        button.id = n;
        button.addEventListener(MouseEvent.CLICK, click, false, 0, true);
      }
      loader = new Loader();
    }
    private function click(evt:MouseEvent):void {
      selectedId = evt.target.id;
      for (var n:uint = 0; n < max; n++) {
        var button:Btn = buttons[n];
        button.selected = (n == selectedId);
      }
      load(selectedId);
    }
    private function load(id:uint):void {
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded, false, 0, true);
      try {
        var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null);
        var filePath:String = basePath + files[id];
        loader.load(new URLRequest(filePath), context);
      } catch (err:Error) {
        trace(err.message);
      }
    }
    private function loaded(evt:Event):void {
      loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaded);
      container.removeChildren();
      container.addChild(Sprite(evt.target.content));
    }

  }

}

Terminal を起動して、
$ cd /Users/****/development
$ ./bin/adt -package -target ipa-ad-hoc -useLegacyAOT no -storetype pkcs12 -keystore ios_distribution.p12 -storepass **** -provisioning-profile Distribution.mobileprovision loader.ipa loader-app.xml loader.swf assets icons
$ ./bin/adt -installApp -platform ios -package loader.ipa
と入力する。

これで、ちゃんと appA.swf, appB.swf, appC.swf が読み込めている。loader.ipa をインストールすることもできた。
が! 2度目にボタンを押すと、1度読み込んだSWFファイルが読み込めなくなってる! :rain:

どうやら、こんなエラーが発生している模様。
Error #3764: Reloading a SWF is not supported on this operating system.


参考資料「Loader – Adobe ActionScript® 3(AS3)API リファレンス
iOS では、ActionScript バイトコード(ABC)を含む SWF ファイルをロードしてからアンロードし、再度ロードすることはできません。これを行おうとすると、ランタイムでエラー 3764 が発生します。

つまり、SWFファイルはリロードするなと。