[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一本でやりたいのになぁ、残念。


[AS][iPhone]AIR for iOSにおいてANEファイルを含めたビルドをするには、”mac版”のFlashBuilder4.6一択という残念な現実(GUIを頼りにする場合)

タイトル通りなんですが、そこにたどり着いた経緯をダラダラ書いておきます。

AIR for iOSで作ったアプリはマナーモード(正式にはサイレントスイッチ)ON状態でも音がなってしまいます。
(Flashからはそこを制御するAPIが用意されていないようです)
が、NativeExtension for Air(ANE)という機能が用意されており、自分で足りないAPIを補うANEを用意することでAIR for iOSでもできることを拡張することができます。

ANEはネイティブコード(Objective-Cとか)で作れますが、めんどくさい。
サイレントスイッチを何とかするANEもきっと誰かが作ってくれてるはず。

と、ググってみるとあっさり見つかりました。
StickSports / ANE-Silent-Switch

ソースからANEファイル、テスト用のコード(testフォルダ)まで入っていました。
とりあえずこのテストコードを実機で試してみよう!
と思ったら落とし穴いっぱいだったというお話です。


・はまりポイント1

testコードビルド方法がよくわからず。
READMEには

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

Antでビルド?なにそれおいしいの?
FlashDevelopとかFlashCS6でできないの?
できるだけ慣れてるやつでやりたいです。
まずはFlashDevelop。


・はまりポイント2

FlashDevelopでaneファイルを紐付けたビルドがよくわからず。

aneを使ってのFlashDevelopでのビルド例としてこの記事を教えてもらったけども、じっくり読む前にとりあえずFlashCS6にはaneの設定が増えているからきっと簡単にできるだろう、とFlashCS6に逃げる。

2012/06/18 追記
FlashDevelopでaneビルドできましたので記事書きました。


・はまりポイント3

FlashCS6でaneファイルを正しく設定していざパブリッシュ。
すると、こんなエラーが大量に出現。

ld warning: unexpected srelocation type 9

ググってみるといろいろ記事がでてきてiOSのsdkがなんちゃらとか、コマンドラインからもろもろ設定したADTを叩くとかさくっと解決できそうな方法は見つからず。
一番簡単そうなのは、MUSHIKAGO APPS MEMO さんの記事で、FlashBuilderなら「Apple iOS SDK」という項目に最新のiOSのSDKを指定しておけば大丈夫っぽいとのこと。

だがしかし、FlashCS6にはそのような項目がどこにも見あたらず・・・
せっかくaneファイルを簡単に設定できるようになってるのに世の中に落ちてるものを簡単に使えないんじゃ意味無いじゃん・・・
というわけで、解決策のあるFlashBuilderに逃げることに。


・はまりポイント4

Xcode4.3から最新のiOS5.1.sdkフォルダをまるっとwindowsにコピーしてさぁ設定しようかと思ったら。

Win版のFlashBuilderではこの機能が使えないとな・・・
値段一緒なのに。。Windowsユーザーをバカにしてんの。。

というわけで、macのFlashBuilderで試してみたらようやくと実機でテストが正常に動きましたよ、と。

・結論
GUIを使ってANEを含んだビルドしたい人は、とりあえずmac版のFlashBuilde4.6を使うしかないみたい。
とりあえずバージョンアップなりでもうちょっとなんとかしてくださいよ、アドビさん。