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からだからみたいです。