[AS]FlashBuilder4.7(Beta)で「VerifyError: Error #1107: ABC データは破損しているため、境界外の読み取りが試行されました。」と出たときの対処法


****2012.10.11追記*****
FlashBuilder4.7Beta2では下記のエラーはでなくなった模様
ただ自分のボタンシンボルを含んだサンプルをパブリッシュしたら、レイアウトが盛大に崩壊したりしていて、なんか挙動がとても怪しい気がする・・・
(具体的にどういうときに崩れるかはちゃんと検証してない)
****************************

FlashBuilder4.7では新しいASコンパイラが搭載されているので、過去に作ったプロジェクトを書き出そうとエラーがでることがあります。

今日遭遇したのはこれ

その1:VerifyError: Error #1107: ABC データは破損しているため、境界外の読み取りが試行されました。

その2:Error #2022: Class [※hogehoge] must inherit from DisplayObject to link to a symbol.

[※hogehoge]の内容はいろいろ変わる

これは、FlashIDE上で作ったアセット的なSWCファイルからリンケージしたボタンシンボル(SimpleButton)を読み込もうとすると発生するエラーみたい。
リンケージしたムービークリップシンボルの中にボタンシンボルが含まれててもダメ。

リンケージしたボタンシンボルを呼ぼうとすると、上記:その1のエラーがでて
ボタンシンボルを含むリンケージしたムービークリップシンボルを呼ぼうとすると、その2のエラーがでました。

で、今再現確認してみたところ、リンケージしたムービークリップシンボルの中にボタンシンボルが含まれてる場合はエラーでなくなった・・・なんでだろう。
でも、そのムービークリップを表示してみると、含まれてるはずのボタンシンボルがひとつも表示されないのでやっぱり何かおかしいみたい。

とりあえずFlashBuilder4.7で使うアセットSWCにはボタンシンボルは使わないほうがいいみたい。

[ANE][iPhone]AIR for iOSにて、スクリーンショットをカメラロールに保存するANEを作ってみた、がiOS6では機能しなかったという悲しい現実

以前書いた記事、Air for iOSにて、スクリーンショットをカメラロールに保存するANEを作ってみた、への追加メモです。

まず結論から、
iOS6では「スクリーンショットをカメラロールに保存するANE」は正常に機能しなくなりました。。
(iOS5では機能します)

そして色々検証してみたところ、
現状AIR for iOS(AIR3.4SDK)ではANE内でスクリーンショット(UIImageとして取得)することは無理じゃね?
という結論に達しました。

以下、無理じゃね?と思う理由が続きマス。
(解決策わかる方がいました教えてください。。)


■Objective-Cでのスクリーンショットを取るコードをiOS6上で動かしてみる

上記aneで使ったこちらのコード
これを使って、Xcodeを使ったObjective-Cプロジェクト(Xcode4.5のOpenGL Gameテンプレートを使用)でOpenGLで描画したもののキャプチャを取ってみようとしましたが、iOS6実機ではキャプチャが正常に取れません。
(Xcodeのシミュレーター上では正常にキャプチャできるんですが、iOS6実機ではキャプチャ画像は真っ白になってしまう)
※iOS5実機ではなんら問題なくキャプチャできます。

あら、そもそもiOS6ではOpenGL描画のキャプチャができなくなったの?
と思いましたが、そういうわけでもありません。


■Apple公式のキャプチャ手順

こちらにOpenGLの描画についてのキャプチャの取り方について記載されているのですが、やり方としては2種類あるようす。

1) Call glReadPixels before calling EAGLContext/-presentRenderbuffer

2) Set the CAEAGLLayer’s retained backing property to true to retain the contents of the layer. However, this can have adverse performance implications so you are cautioned to use this setting only when necessary.

上記2通りのやり方を、まずはObjective-Cプロジェクトを使って実装してみると、どちらを使ってもではOpenGL描画のキャプチャは取れました。

じゃあ、その2通りのどちらかをANE使って実装したらいいじゃん、ってことなんだけどこれがどうやっていいかわからず。

以下、それぞれの無理じゃねって理由です。


■やり方1)について

1) Call glReadPixels before calling EAGLContext/-presentRenderbuffer

これはglReadPixels()は、presentRenderbufferする前に呼んでね、ってことなんだと思います。
glReadPixelsはスクリーンショットを取るときに呼ぶメソッドなので、presentRenderbuffer()を実行する前のタイミングでスクリーンショットを取る処理を実行するようにしたいわけですが、presentRenderbuffer()はOpenGL描画の更新毎に呼ぶメソッドっぽい。
で、AIR for iOSでは描画更新処理というコアな部分の処理が具体的にどうなっているのかわからんのです。
(LLVMが具体的にどのようにコンパイル(AS3→ObjC)してるのかわからんので)

描画処理のコアな部分の処理をANEからオーバーライドなりして、修正することができればいけそうなんですけどね。どういう実装になってるのかわからんのでできません。
というわけで1)の案はANEで実装する方法がわからず。


■やり方2)について

2) Set the CAEAGLLayer’s retained backing property to true to retain the contents of the layer. However, this can have adverse performance implications so you are cautioned to use this setting only when necessary.

これは、CAEAGLLayer.drawablePropertiesにkEAGLDrawablePropertyRetainedBacking:YESを突っ込め、と。
ただそうするとパフォーマンス落ちるかもしれないから必要なときにだけYESにしてね、ということみたい。

CAEAGLLayerはANEからでも取得できました。

//UIWindowの下にCALayerがあってその下にCAEAGLLayerがありました。
UIWindow* win = [UIApplication sharedApplication].keyWindow;
UIView* uv = [[win subviews] objectAtIndex:0];
UIView* uv2 = [[uv subviews] objectAtIndex:0];
CAEAGLLayer* eagllayer = (CAEAGLLayer *) uv2.layer;

CAEAGLLayerが取得できればdrawablePropertiesにkEAGLDrawablePropertyRetainedBacking:YESを上書きするところまではできるのだけど、drawablePropertiesを変更した際にはEAGLContext.renderbufferStorage:fromDrawableを実行しないと反映されない。
で、これにはEAGLContextのインスタンスを取得しないとなのだけど、ここが無理っぽい。
先ほどと同様でLLVM後のコアな部分の処理が具体的にどうなっているのかわからんのです。
CAEAGLLayerをもつUIViewにEAGLContextは使われてると思うけど変数名がわからず、そもそも外部からアクセスできる変数かどうかもわからずです。

というわけで、Apple推奨のふたつの手順がAIR for iOSでは実装できないんじゃないかと思っているわけです。


というか、なんでiOS5ではできていたのかも謎です。
気になったのはTechnical Q&A QA1704 OpenGL ES View Snapshotに書かれたこの文章

Important: You must call glReadPixels before calling EAGLContext/-presentRenderbuffer: to get defined results unless you’re using a retained back buffer.

iOS6のベータが出回ったころに追記されたとかなら、iOS6で仕様が変わったのだと納得がいくんですけども。


これができないとiOSのTwitterAPIとかfacebookAPIのAPI使ってもアプリのキャプチャ画像添付ができないと思うんですよね。
Flash側で画面をBitmapDataでキャプチャしてそれをaneに送ってane側でBitmapDataをUIViewに変換することができればなんとかなりそうな気もするんですけども、Alternativa3Dで描画してる部分をBitmapDataにキャプチャしようとしたら(Web上ならできたのに)iOS上だとキャプチャとれず。

なんとかなる方法ないかなぁ・・・

p.s
iOS5以上から追加されたDLKViewクラス(CAEAGLLayerをもつUIView系クラス)にはsnapshotってメソッドがあって、これを実行するとUIImageがさくっととれちゃうんですよね。
AIR for iOSはiOS4もサポートしてるからDLKViewは使われてないんでしょうけど。
(ちなみにAIR for iOSではCAEAGLLayerをもつUIView系クラスはCTStageViewというクラスで定義されてるっぽい)
CTStageViewにもsnapshotみたいなAPI仕込まれていないかなぁ。。。

[iPhone][Alternativa3D][AIR]AIR for iOSでシンプルな3Dゲームをリリースしました。

メモ記事を書いてましたが先週やっとiPhoneアプリとしてリリースしました。

Live with the Wind.
support site
itunesStore

初めてFlash:Air for iOS(AIR3.3SDK)で作ってみたよ。
3DエンジンにはAlternativa3D(8.17.0)を使用したよ。

もろもろ苦戦したことは以前公開したStage3D勉強会#2の資料に書いたので興味ある方は読んでみてください。


■実装以外でのゲーム性について
▼気持ちよさの工夫
BGMのBPMに連動するような動きを意識
→風を連続で取ったときの効果音がBPMと連動するようにスピードを調整
→風車の首を降り始めは曲調が変わるタイミング
→あと風車が首を振るときのスピードもBPMと連動するような

▼飽きさせない工夫
上昇気流だけを取り続けて飛ばれるとゲームオーバーになりにくいが緊張感なくなりゲームが単調になる
追い風も取らせて緊張感のあるゲーム展開にしたい
→上昇気流だけを取りつづけた場合は無理ゲーになるような設定に。
 (風車の背がどんどん伸びていく)
→2種類のコンボ要素の追加
 (コンボを続けると風車の背が伸びにくくなるようにしている)
※「上昇気流を取る→風車がのびる」という部分がルール的には判りにくくなってしまったのでヒントの項目に記載したけど理解できてない人も多いかも。。

▼操作性について
iPhoneアプリというと傾きセンサーだけど今回は無しで。
プレイヤーが学習してやりこみ性あるゲームにしたかった。
傾きセンサーでは細かいコントロールができないので運要素が増えてしまう
個人的に思うようにコントロールできないのは嫌い、というのが一番の理由
あと電車でプレイしてる姿も少し恥かしくなるしね。


8月中は無料で9月から170円になりますので是非試してみてくださいまし。

※Flash製なので簡単にWEBおためしプレイ版も用意できますよ。
>FlashPlayer11.0
(音鳴ります)

[ANE][iPhone]Air for iOSにて、スクリーンショットをカメラロールに保存するANEを作ってみた

aneを使ってAir for iOS(AIR3.3SDK)でスクリーンショットを撮るお話。

ありそうでなかった、というかあったけどもうまく動かなかったので作ってみたらちょっとハマりました。


まず、タイトルどおりのaneのコードが公開されてました。
abhisek-mishra / ScreenShot

が、実装してみても想定通りに動作しない。。
Objective-C部分のコードを見てみると、UIGetScreenImage()というapple非公開APIを使用してる。
非公開APIを使うとリジェクト対象だそうでこれは使えないと。


とりあえず下の記事を参考にスタンダードな実装に変更してみる。
iPhoneアプリから画面のキャプチャー画像を取得する2つの方法

aneファイルをビルドしなおして再テスト。
が、画像はカメラロールに保存されたのは真っ白の画像。。

ちなみにObjective-CでiOSプロジェクトを作って、Xib上に適当にボタンとか画像とか配置した状態で上記の方法を実行すればスクリーンショットは問題なく取れるから根本的に間違ってるわけではなさげ。


肝はFlashの描画領域がどこにあるのか、ということ。
上記の記事のコードだと、

[app.keyWindow.layer renderInContext:UIGraphicsGetCurrentContext()];

UIWindowのkeyWindowのレイヤーをキャプチャしてるのだからFlashで言えばStage上のメインタイムラインをキャプチャしてるようなものなはずだから良さげな感じだけども結果は前述したとおりに真っ白。


で、結論。
上記の方法は使えないみたい。
app.xmlでのrenderMode要素をdirectを指定する場合はObjective-C側ではOpenGLESでのスクリーンショットを撮るような処理をしないといけないっぽい。
具体的なコードはここに書かれてるものを参考にしました。
GLPaint save image

このコードで取得したUIImageをキャプチャすることでとスクリーンショットを撮ることができました。


では、renderModeをcpu指定にすれば最初のコードでもスクリーンショットは撮れるのではないか?と思いましたが結果は否。
renderMode:cpuでは、上述のどちらのコードでもスクリーンショットを撮ることはできませんでした。
謎。。。
まぁrenderModeをcpuにする理由なんてない気もするのでまぁいいか。


各コードの詳細はQuiitaにあげてあります。
Qiita:AIR for iOSでスクリーンショットをカメラロールに保存するANEを作ってみたけど真っ白な画面しか取れない
(コメント欄で自己解決してます)

p.s.
ちなみに今回スクリーンショットを撮るのが最終目的ではなく、iOS5からのネイティブなTwitterAPIを使ってのスクリーンショットつきのTweet機能を実装したかったのでした。
これも無事にうまく実装できたので、また後で記事を書きます。

[Event]Stage3D 勉強会 (第2回)での発表資料

昨日、Stage3D 勉強会(第2回)にて発表したスライド資料を公開します。
自身が体験したair for iOS&Stage3D&aneでのハマリどころを紹介しております。
というかまだリリースできてないのでなんとか今月中にはリリースしたい。。
自分自身のケーススタディなので、「みたい」とか「らしい」とか語尾を濁しているのはご愛嬌ってことでw

64ページの「FDでaneを含んだリリースビルドが落ちる」問題について。
使用するAIRのSDKが3.4以上なら平気みたいです。
3.3を使う場合はFlashDevelopにて、コンパイラー設定のExternal Librariesにaneを設定してあげることで落ちなくなるということを別の記事のコメント欄で教えて頂きました。

[AIR]FlashCS5で作ったAIR用flaファイルをCS6で編集しようとするときの罠

ちょっとハマったのでメモしときます。
Windows版での話です。(mac版は持ってないのでわかりません。。)


FlashCS5で作ったAIR用(AIR2.0)flaファイルをFlashCS6で開いてムービープレビューしようとするとどうなるか。

何もおきません。
エラーもでません。
SWFのウィンドウも表示されません。
もう一度いいます、何もおきません。
パソコン再起動してもムービープレビューできません。


仕方ないのでCS6では保存せずにCS5で開いてムービープレビューしてみます。

何もおきません。
エラーもでません。
SWFのウィンドウも表示されません。
もう一度いいます、何もおきません。

なにこれ、ばかなの、死ぬの、という言葉が頭を巡りました。


んで結論からいうと[ファイル名-app.xml]に不具合が起きていました。


通常app.xmlはIDE側で各パラメーターを設定すればそれがapp.xmlに反映されるものなので中をみなくてもいいものだったりします。

まずはCS5で作ったflaファイルをCS6で開こうとすると

こんなアラートがでて、ターゲットがAIR3.2 for Desktopに変更されます。

でそれに伴いapp.xmlの2行目のairsdkのバージョンの項目も3.2に修正されます。

<!-- hoge-app.xmlの2行目 -->
<application xmlns="http://ns.adobe.com/air/application/3.2">

親切ですね!

でもムービープレビューできません。
なぜでしょうか?

それはAIR2.0からAIR2.5へ変わる際に1箇所app.xmlの仕様が変更になったからです。
具体的にはapp.xmlの4行目。

<!-- AIR2.0以下での4行目 -->
<version>1.0</version>
<!-- AIR2.5以上での4行目 -->
<versionNumber>1.0</versionNumber>

varsion要素がversionNumber要素に変わったようです。
ここの変更はFlashCS6は自動で直してくれません。

不親切ですね!

というわけでxmlのここの部分を修正してあげるとFlashCS6でムービープレビューができるようになります。


さてもう一点、
CS6で開いたflaファイルを保存せずに閉じて、CS5で開き直したらムービープレビューできなくなってしまう件。

これもxml2行目の部分が原因です。
先ほどCS6で開いた時点で、sdkバージョンの項目が3.2に書き換えられました。
でもCS5で開きなおしたときにはとくに何のアラートも表示されません。
パブリッシュ設定上はAIR2.0設定になってるんですが、app.xmlをみてみると2行目は3.2のままです。
どうやらCS5では自動で修正してくれないようです。

不親切ですね!

というわけで一度CS6で開いてしまうとxml2行目が書き換わってしまうので手動で修正してあげましょう。
あと4行目のversion,versionNumbber要素の部分も当然CS5は自動で書き直してはくれないのでversionに戻しておきましょう。


まとめ。
中途半端な親切はかえって迷惑。

[AS][Alternativa3D]Blender(2.6.3)で書き出したcollada(.dae)ファイルをAlternativa3Dで読み込むときの注意

教えて頂いたのでメモメモ

collada(.dae)ファイルって方言が多いようです。
Blender(2.6.3)で書き出したものをそのままAlternativa3Dの公式サンプル(parsersexample/ParsersExample.as)で読ませようとするとうまくできませんでした。
(公式サンプルに含まれているcolladaファイルは問題なく表示されるので、Blenderでのcollada書き出しがalternativa3D的にはイマイチみたい)


該当箇所はここの8行目

//parsersexample/ParsersExample.as内のonColladaLoadメソッド抜粋
private function onColladaLoad(e:Event):void {
	// Model parsing
	// Парсинг модели
	var parser:ParserCollada = new ParserCollada();
	parser.parse(XML((e.target as URLLoader).data), "parsersexample/", true);
	trace(parser.objects);
	var mesh:Mesh = parser.getObjectByName("Cylinder01") as Mesh;
	mesh.x = 0;
	scene.addChild(mesh);

	// Загрузка ресурсов
	uploadResources(mesh.getResources(false, Geometry));
	
	// Собираем текстуры и назначаем материалы
	var textures:Vector.<ExternalTextureResource> = new Vector.<ExternalTextureResource>();
	for (var i:int = 0; i < mesh.numSurfaces; i++) {
		var surface:Surface = mesh.getSurface(i);
		var material:ParserMaterial = surface.material as ParserMaterial;
		if (material != null) {
			var diffuse:ExternalTextureResource = material.textures["diffuse"];
			if (diffuse != null) {
				textures.push(diffuse);
				surface.material = new TextureMaterial(diffuse);
			}
		}
	}

	// Loading of textures
	// Загрузка текстур
	var texturesLoader:TexturesLoader = new TexturesLoader(stage3D.context3D);
	texturesLoader.loadResources(textures);
}

parser.getObjectByName(“Cylinder01″)でオブジェクトの名前を拾おうとしてますが、Blenderで書き出したcolladaファイルはこの名前が含まれていないのでエラーになります。
とりあえずはcolladaファイルの中身を以下のように修正すればOK。

<library_visual_scenes>タグの中<node id=”hoge” type=”NODE”>にid属性と同じ値を持ったname属性を追加。
<node id=”hoge” name=”hoge” type=”NODE”> こんな感じ
Blender側で用意したオブジェクトの数だけ修正してあげましょう。

[iPhone][AIR]FlashDevelopにてaneを含んだiPhoneアプリのビルド方法

FlashDevelop(以下FD)のAIR Mobile AS3 AppプロジェクトにてANE(Native Extension for AIR)ファイルを含んでのipaファイルが書き出せたので手順をメモしておきます。


aneファイルはSTICKSPORTSさんが公開されてるANE-Silent-SwitchとANE-Game-Centerの二つを使ってみます。
どちらもDLしたサンプル一式の中にテスト用のドキュメントクラスが入っていますので、それを組み合わせてふたつの機能を持ったipaを作ってみます。

SilentSwitchはいわゆるマナーモードスイッチのこと。
ハードウェアスイッチのオンオフでサウンドのオンオフをする機能です。
(AIR for iOSだけではこの機能を使えない)
GameCenterはオンラインランキング等の機能が使えます。

この二つでとりあえずユーザーフレンドリーな簡単なゲームが作れますよね。


以下、必要なもの

  1. Windows環境(FlashDevelop使うので)
  2. FlashDevelop 4.0.3(現状での最新)
    http://www.flashdevelop.org/
  3. Flex 4.6 SD(現状での最新)
    http://www.adobe.com/devnet/flex/flex-sdk-download.html
  4. AIR 3.3 SDK(現状での最新)
    http://www.adobe.com/devnet/air/air-sdk-download.html
  5. aneファイル
    ANE-SilentSwitch
    ANE-Game-Center
    (テスト用ドキュメントクラスも含む)
  6. iOS 5.1 SDK
    (Xcode4.3からフォルダ抽出:macが無いと無理かも)
  7. iPhoneアプリ証明書ファイル(.p12)
  8. プロビジョニングファイル(.mobileprovision)

※5,6,7はiOS DevCenterより入手(要iOS developper登録)


手順

0.AIR 3.3 SDK対応のFlex 4.6 SDKを作る
DLしたAIR SDKをFlex SDKのフォルダに上書きコピー
(Flex SDKのフォルダ名をflex_sdk_4.6_air3.3としました)


1.FDで新規プロジェクト(AIR Mobile AS3 App)を作る


2.aneファイルとswcファイルをlibフォルダに格納し[ライブラリに追加]
・aneファイル2つとswcファイル1つ

  • StickSports-ANE-Silent-Switch-b70e35b\bin\SilentSwitch.ane
  • StickSports-ANE-Game-Center-a2d0263\bin\GameCenter.ane
  • StickSports-ANE-Silent-Switch-b70e35b\test\libs\sounds.swc

(aneファイルが入ってるフォルダ内のswcは使いません)


3.テスト用ドキュメントクラスをsrcフォルダに格納
(GameCenterExtensionTest.asをドキュメントクラスに)

  • StickSports-ANE-Silent-Switch-b70e35b\test\src\SilentSwitchExtensionTest.as
  • StickSports-ANE-Game-Center-a2d0263\test\src\GameCenterExtensionTest.as

4.GameCenterExtensionTest.asを修正

public function GameCenterExtensionTest()
{
	shape = new Shape();
	shape.graphics.beginFill( 0x666666 );
	shape.graphics.drawCircle( 0, 0, 100 );
	shape.graphics.endFill();
	shape.x = 0;
	shape.y = 240;
	addChild( shape );
	
	feedback = new TextField();
	var format : TextFormat = new TextFormat();
	format.font = "_sans";
	format.size = 16;
	format.color = 0xFFFFFF;
	feedback.defaultTextFormat = format;
	feedback.width = 320;
	feedback.height = 260;
	feedback.x = 10;
	feedback.y = 210;
	feedback.multiline = true;
	feedback.wordWrap = true;
	feedback.text = "Hello";
	addChild( feedback );
	
	addEventListener( Event.ENTER_FRAME, animate );

	GameCenter.init();
	createButtons();
	
	//以下の2行を追加
	var silentSwitch:SilentSwitchExtensionTest =  new SilentSwitchExtensionTest();
	addChild(silentSwitch).y = 230;
}

5.証明書ファイルとプロビジョニングファイルをcertフォルダへ格納
必要ファイルのプロジェクトへの設置はこれで完了
↓のようになりました


6.bat/SetupSDK.batを修正
4行目に手順0で作ったFlexSDKのパスを記述

:: Path to Flex SDK
:: 例
set FLEX_SDK=E:\00_flash\flex_sdk_4.6_air3.3

7.bat/SetupApplication.batを修正
18~22行目のiOSに関する部分を設定

:: iOS packaging
set IOS_DIST_CERT_FILE=
set IOS_DEV_CERT_FILE=cert\hoge.p12
:: ↓証明書を書き出す際に設定したパスワード
set IOS_DEV_CERT_PASS=certification_no_passward
set IOS_PROVISION=cert\fortest.mobileprovision
set IOS_ICONS=icons/ios

35行目のapplication IDを設定

:: Your application ID (must match <id> of Application descriptor)
:: ↓プロビジョニングファイルに紐付けたApp ID
set APP_ID=bz.393.forTest

8.Run.batを修正
6~11行目あたりのtarget項目を修正

:target
::↓ここをコメントアウトする
::goto desktop
::goto android-debug
::goto android-test
::goto ios-debug
::↓ここのコメントアウトを解除
goto ios-test

14~18行目あたりのdesktop項目を修正

:desktop
:: http://help.adobe.com/en_US/air/build/WSfffb011ac560372f-6fa6d7e0128cca93d31-8000.html
:: ↓をコメントアウト
:: set SCREEN_SIZE=NexusOne
:: ↓をコメントアウト解除
set SCREEN_SIZE=iPhoneRetina

9.application.xmlを修正

<?xml version="1.0" encoding="utf-8" ?> 
<application xmlns="http://ns.adobe.com/air/application/3.1">
	
	<!-- プロビジョニングファイルに紐付けたApp ID -->
	<id>bz.393.forTest</id>
	<versionNumber>0.1</versionNumber>
	<supportedProfiles>mobileDevice</supportedProfiles>
	<filename>SilentSwitchGameCenter</filename>
	
	<name>SilentSwitch-GameCenter</name>
	<description></description>
	<copyright></copyright>
	
	<android>
		<manifestAdditions><![CDATA[
			
			<manifest android:installLocation="auto">
				<uses-permission android:name="android.permission.INTERNET"/>
				<uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch"/>
			</manifest>
			
		]]></manifestAdditions>
	</android>
    <iPhone> 
        <InfoAdditions><![CDATA[ 
		
			<key>UIStatusBarStyle</key> 
			<string>UIStatusBarStyleBlackOpaque</string> 
			<key>UIRequiresPersistentWiFi</key> 
			<string>NO</string>
			<key>UIPrerenderedIcon</key>  
			<true/>
			<key>UIApplicationExitsOnSuspend</key>
			<true/>
			
			<key>UIDeviceFamily</key>
			<array>
				<!-- iPhone support -->
				<string>1</string> 
				<!-- iPad support -->
				<!--<string>2</string>-->
			</array>
				
        ]]></InfoAdditions> 
		<requestedDisplayResolution>high</requestedDisplayResolution>
    </iPhone> 
	
	<initialWindow>
		<title>SilentSwitch-GameCenter</title>
		<content>SilentSwitchGameCenter.swf</content>
		<visible>true</visible>
		<fullScreen>true</fullScreen>
		<!--<autoOrients>false</autoOrients>-->
		<!--<aspectRatio>landscape</aspectRatio>-->
		<renderMode>direct</renderMode>
	</initialWindow>
	
	<icon>
		<image48x48>icons/icon_48.png</image48x48>
		<image57x57>icons/icon_57.png</image57x57>
		<image72x72>icons/icon_72.png</image72x72>
		<image114x114>icons/icon_114.png</image114x114>
		<image512x512>icons/icon_512.png</image512x512>
	</icon>
	
	<!-- extensions要素を追加(ane内のクラスを指定するってことかな?) -->
	<extensions>
		<extensionID>com.sticksports.nativeExtensions.SilentSwitch</extensionID>
		<extensionID>com.sticksports.nativeExtensions.GameCenter</extensionID>
	</extensions>
	
	<!-- 
	AIR options:
	http://livedocs.adobe.com/flex/3/html/File_formats_1.html#1043413
	
	AIR mobile options:
	http://help.adobe.com/en_US/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html
	
	Android manifest documentation:
	http://developer.android.com/guide/topics/manifest/manifest-intro.html
	-->
</application>

10.bat/Packager.batを修正
34~47のstart項目内の44行目を修正

if not exist "%CERT_FILE%" goto certificate
:: Output file
set FILE_OR_DIR=%FILE_OR_DIR% -C "%ICONS%" .
if not exist "%DIST_PATH%" md "%DIST_PATH%"
set OUTPUT=%DIST_PATH%\%DIST_NAME%%TARGET%.%DIST_EXT%
:: Package
echo Packaging: %OUTPUT%
echo using certificate: %CERT_FILE%...
echo.
:: aneファイルの入っているフォルダとiOS SDKのフォルダを指定する
:: (相対パスで指定する場合はプロジェクトのルートが基準)
call adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR% -extdir lib/ -platformsdk E:/iPhoneOS51/
echo.
if errorlevel 1 goto failed
goto end

以上で準備完了です。


ctrl + Eneterでコマンドプロンプトが立ち上がり、大量のwarningが出ますが、distフォルダにipaファイルが書き出されます。
ipaの実機に転送がうまくいけばこんな画面が確認できます。

画面中央より上がGameCenter、下がSilentSwitchの操作となります。


動作確認の例として、[playSound1]を押すと音が鳴り始めます。
そのままiPhoneのサイレントスイッチ(いわゆるマナーモードのスイッチ)をオンオフしても音は鳴り続けますが、[silentSwitch]ボタンを押すとiPhoneのサイレントスイッチを切り替えることで音のオンオフが制御できるようになります。


GameCenterの確認方法は、iTunes Connect側での設定も必要です。
GameCenterExtensionTest.as内のleaderboardNameがiTunes Connectで設定したLeaderBoard IDと紐付けられますとなります。
achievementNameが、Achievement IDとなります。

これでFlashを使ってランキング機能付きのゲームも簡単に作れそうですね。


※その他、補足
aneファイルによってはiOS SDKの指定をせずともビルドできる場合があります。
その際、変更となるのは、手順10で以下のようになります

if not exist "%CERT_FILE%" goto certificate
:: Output file
set FILE_OR_DIR=%FILE_OR_DIR% -C "%ICONS%" .
if not exist "%DIST_PATH%" md "%DIST_PATH%"
set OUTPUT=%DIST_PATH%\%DIST_NAME%%TARGET%.%DIST_EXT%
:: Package
echo Packaging: %OUTPUT%
echo using certificate: %CERT_FILE%...
echo.
:: aneファイルの入っているフォルダのみを指定
:: (相対パスで指定する場合はプロジェクトのルートが基準)
call adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR% -extdir lib/
echo.
if errorlevel 1 goto failed
goto end

aneファイルを作る際に使ったiOS SDKのバージョンに依存するみたい。
FlexSDKかAIR SDKのデフォルトで用意されてるiOS SDKがiOS4.2らしく、それでビルドされたaneファイルならiOS SDKを指定しなくてよいみたいです。
(最新のiOS SDKを指定しておけば下位互換があるかは試してません。。)

ちなみに現状Windows版のFlashCS6ではiOS SDKの指定ができないっぽいので上記2つのaneを実装したipaを作ることってできないんですよね。
WindowsでのiOS SDK指定が可能になったのはAIR3.3SDKからだからみたいです。

[AS][iPhone]AIR SDK 3.3でANEを含めたビルドがWindowsでもできた

ひとつ前の記事のさらなる補足です。

前の記事で、
Windowsではaneファイルの仕様によってはipaパッケージングができない
(windowsではiosのplatformsdkの指定ができない仕様なので)
と書きましたが、
AIR SDK 3.3ではこれが解消されたと教えてもらいましたので試してみました。

http://twitter.com/Hiiragi3/status/212455016550776834

これまで同様ANE-SilentSwitchのテストプロジェクトをANTでビルドしてみたらipaを生成することができました。


※AIRSDK3.3を指定してもFlashBuilder4.6ではやはりplatformsdkの設定はできませんでした


あとビルド時には大量のWarningも発生。。
実機転送して問題なく動いてたようなので無視していいのかしら。。

[exec] ld: warning: -ios_version_min not specificed, assuming 4.0
[exec] ld: warning: ARM function not 4-byte aligned: _IDctSlow_ARM from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowProcessRowLoop from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowSkipArithmeticInRow from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowProcessColumnLoop from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowConstantxC1S7 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowConstantTable from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowConstantxC7S1 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowConstantxC3S5 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowConstantxC5S3 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowConstantxC4S4 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowConstantxC2S6 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDctSlowConstantxC6S2 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: _IDct10_ARM from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDct10ComputeRow0 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDct10ComputeRow1 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDct10ComputeRow2 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDct10ComputeRow3 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDct10_skip_Row3 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDct10ProcessColumns from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDct10ProcessColumnLoop from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDct10Fill2WithZero from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDct10Fill1WithZero from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDct10Fill0WithZero from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: _IDct1_ARM from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: _IDCT1_plus_ReconBlock_ARM from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDCT1_plus_ReconBlock_loop from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: _IDCT1_plus_ReconInter_ARM from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: IDCT1_plus_ReconInter_loop from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(idct_part.o)
[exec] ld: warning: ARM function not 4-byte aligned: _FilterBlock1dH_ARM11 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: loop1 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: _FilterBlock1dV_ARM11 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: loop3 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: loop4 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: _FilterBlock2dFirstPass_ARM11 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: loop5 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: _FilterBlock1dBilH_ARM11 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: FilterBlock1dBilH_next_row from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: _FilterBlock1dBilV_ARM11 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: FilterBlock1dBilV_outer_loop from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: FilterBlock1dBilV_inner_loop from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: _FilterBlock2dBil_FirstPass_ARM11 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: FilterBlock2dBil_FirstPass_next_row from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(predfilters.o)
[exec] ld: warning: ARM function not 4-byte aligned: _Copy12x12_ARM9E from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(copy12x12.o)
[exec] ld: warning: ARM function not 4-byte aligned: Copy12x12_CSrcAlign0 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(copy12x12.o)
[exec] ld: warning: ARM function not 4-byte aligned: Copy12x12_CSrcAlign1 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(copy12x12.o)
[exec] ld: warning: ARM function not 4-byte aligned: Copy12x12_CSrcAlign2 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(copy12x12.o)
[exec] ld: warning: ARM function not 4-byte aligned: Copy12x12_CSrcAlign3 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(copy12x12.o)
[exec] ld: warning: ARM function not 4-byte aligned: _ReconIntra_ARM11 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(reconstruct-F6251070C86EBC8D.o)
[exec] ld: warning: ARM function not 4-byte aligned: loop from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(reconstruct-F6251070C86EBC8D.o)
[exec] ld: warning: ARM function not 4-byte aligned: _ReconInter_ARM11 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(reconstruct-F6251070C86EBC8D.o)
[exec] ld: warning: ARM function not 4-byte aligned: loop1 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(reconstruct-F6251070C86EBC8D.o)
[exec] ld: warning: ARM function not 4-byte aligned: _ReconBlock_ARM11 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(reconstruct-F6251070C86EBC8D.o)
[exec] ld: warning: ARM function not 4-byte aligned: ReconBlock_ARM11_LOOP from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(reconstruct-F6251070C86EBC8D.o)
[exec] ld: warning: ARM function not 4-byte aligned: _tDecodeBool from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(tDecodeBool.o)
[exec] ld: warning: ARM function not 4-byte aligned: _tDecodeBool128 from E:\\00_flash\\flex_sdk_4.6_air3.3\\lib\\aot/lib/libRuntimeInterpreter.arm-air.a(tDecodeBool.o)

[AS][iPhone]AIR for iOSにおいてANEを含めたビルドにはやはりMAC一択

昨日の記事の補足です。

StickSports / ANE-Silent-Switch
 ↑こちらのtestプロジェクトをビルドをなんとかwindowsでできないかと再挑戦しましたがやっぱり無理だったというお話。
(AIR SDK 3.2でのお話です)


昨日はスルーしていた開発者が指示しているビルド方法を試しました。

Antビルドスクリプトのテスト/ build.xmlをビルドし実行します。これは、テストの/ binフォルダ内のテストのIPAを作成します。

Antなにそれ?状態でしたが、FlashBuilderからAntの実行ができます。

手順としては、
1.何でもいいからプロジェクトを一個作る。
(AS3プロジェクトを作りました)


2.プロジェクトにANE-Silent-SwitchからDLしたデータを突っ込む
(具体的には[test][bin]の3つのフォルダ)


3.test/build.xmlの修正
これはUNIX向けのANTらしいのでそのまま実行するとWindowsでエラーります。
test/buildフォルダ内build.xmlを2箇所修正します。

<!--12行目内の"amxmlc"の後ろに".bat"を追加-->
<exec executable="${sdk.home}/bin/amxmlc.bat" failonerror="true" dir="../bin">
<!--35行目内の"adt"の後ろに".bat"を追加-->
<exec executable="${sdk.home}/bin/adt.bat" failonerror="true" dir="../bin">

4.設定ファイルへの記述
test/buildフォルダ内にexample.build.configがあります。
ここにflexsdkのパスやらipaにパッケージする際の証明書ファイル(.p12)やモバイルプロビジョニングファイルのパスやら、iossdkのパスを設定します。
さらにファイル名をexample.build.config→build.configと変更します。
(ボクの設定例)

# The location of the flex sdk with Air 3.1 or later
sdk.home = E:/00_flash/flex_sdk_4.6_air3.2

# The location of the .p12 developer certificate file
ios.keystore.file = E:/cert/hoge.p12

# The password of the .p12 developer certificate file
ios.keystore.password = passpass

# Provisioning profile
ios.provisioning.profile = E:/cert/forTest.mobileprovision

# The iOS SDK location
ios.sdk = E:/iPhoneOS51/

※iossdkは別途macに入ってるXcode4.3の中から持ってきました。


5.buld.xmlの実行
test/build.xmlにカーソルを合わせて右クリック→実行でantの実行ができます。

がしかし、全ての設定を正しくしていてもエラーになるのです。
FlashBuilderのコンソールにたくさん表示される中の一文で

-platformsdk option for IPA targets is supported only on Mac

とでてまして、つまりはmacでしかiosのsdk指定はできないよ、と。

もちろん全てのaneが使えないということじゃないけども、昨日書いたように

ld warning: unexpected srelocation type 9

このエラーがでちゃったらもうane自体をXcode4.1でビルドしなおすか、aneはそのままでやるなら、ipaのビルドはmacを使う(iossdkを指定して)しかないっぽい。
windows一本でやりたいのになぁ、残念。