Xcode でネイティブ ウィンドウを作成し、それを Mobile Flex アプリケーションと統合する方法。ネイティブ ウィンドウは、StageWebView コンポーネントと同様に動作する必要があります。これにより、ネイティブ コンテンツは、Flex アプリの残りの部分の上の長方形の領域に浮かびます。
1 に答える
フレックスプログラマーであるため、これは退屈なプロセスであり、理解するのに数週間かかりました。これが他のXcode初心者に役立つことを願っています。
まず、Objective-CとXcodeの基本を理解している必要があります。簡単なHelloWorldXcodeプログラムを作成できるはずです。これを行う方法を理解すると、各ビジュアルウィンドウには、通常、xibファイル、ヘッダーファイル、および実装ファイルがあることがわかります。通常のXcodeアプリケーションの作成を開始する方が簡単であることがわかりました。次に、正常に動作して正常に見えるようになったら、これら3つのファイル(およびもちろんヘルパーファイル)をXcode静的ライブラリプロジェクトに手動でプルします。それで、先に進んで、私はあなたがこのステップを過ぎていると仮定するつもりです。ANEを使用してXcodeとFlexmobileを統合する方法のステップバイステップの説明は次のとおりです。
- XCodeを開きます。新しいプロジェクトを作成します。iOS->CocoaTouch静的ライブラリ。私は自分のプロジェクトをFWAneと呼びました
FWAne.hファイルを削除します。FWAne.mファイルの内容を次のように置き換えます。
'#import "FloatingWindow.h" '#import "FlashRuntimeExtensions.h" FREObject openFloatingWindow(FREContext ctx、void * funcData、uint32_t argc、FREObject argv []) {{ uint32_t parm0Length、parm1Length、parm2Length、parm3Length、parm4Length、parm5Length、parm6Length、parm7Length、parm8Length、parm9Length、parm10Length、parm11Length、parm12Length、parm13Length; const uint8_t * uparm0、* uparm1、* uparm2、* uparm3、* uparm4、* uparm5、* uparm6、* uparm7、* uparm8、* uparm9、* uparm10、* uparm11、* uparm12、* uparm13; FREGetObjectAsUTF8(argv [0]、&parm0Length、&uparm0); NSString * parm0 = [NSString stringWithUTF8String:(char *)uparm0]; // FREGetObjectAsUTF8(argv [1]、&parm1Length、&uparm1); // NSString * parm1 = [NSString stringWithUTF8String:(char *)uparm1]; // FREGetObjectAsUTF8(argv [2]、&parm2Length、&uparm2); // NSString * parm2 = [NSString stringWithUTF8String:(char *)uparm2]; // FREGetObjectAsUTF8(argv [3]、&parm3Length、&uparm3); // NSString * parm3 = [NSString stringWithUTF8String:(char *)uparm3]; // FREGetObjectAsUTF8(argv [4]、&parm4Length、&uparm4); // NSString * parm4 = [NSString stringWithUTF8String:(char *)uparm4]; // FREGetObjectAsUTF8(argv [5]、&parm5Length、&uparm5); // NSString * parm5 = [NSString stringWithUTF8String:(char *)uparm5]; // FREGetObjectAsUTF8(argv [6]、&parm6Length、&uparm6); // NSString * parm6 = [NSString stringWithUTF8String:(char *)uparm6]; // FREGetObjectAsUTF8(argv [7]、&parm7Length、&uparm7); // NSString * parm7 = [NSString stringWithUTF8String:(char *)uparm7]; // FREGetObjectAsUTF8(argv [8]、&parm8Length、&uparm8); // NSString * parm8 = [NSString stringWithUTF8String:(char *)uparm8]; // FREGetObjectAsUTF8(argv [9]、&parm9Length、&uparm9); // NSString * parm9 = [NSString stringWithUTF8String:(char *)uparm9]; // FREGetObjectAsUTF8(argv [10]、&parm10Length、&uparm10); // NSString * parm10 = [NSString stringWithUTF8String:(char *)uparm10]; // FREGetObjectAsUTF8(argv [11]、&parm11Length、&uparm11); // NSString * parm11 = [NSString stringWithUTF8String:(char *)uparm11]; // FREGetObjectAsUTF8(argv [12]、&parm12Length、&uparm12); // NSString * parm12 = [NSString stringWithUTF8String:(char *)uparm12]; // FREGetObjectAsUTF8(argv [13]、&parm13Length、&uparm13); // NSString * parm13 = [NSString stringWithUTF8String:(char *)uparm13];
} // ContextFinalizer()。 void ContextFinalizer(FREContext ctx) {{ NSLog(@ "ContextFinalizer"); //ここでクリーンアップします。 戻る; } // ContextInitializer() void ContextInitializer(void * extData、const uint8_t * ctxType、FREContext ctx、 uint32_t * numFunctionsToTest、const FRENamedFunction ** FunctionsToSet) {{ NSLog(@ "ContextInitializer"); * numFunctionsToTest = 1;NSLog(@"Initializing delegate and window"); id delegate = [[UIApplication sharedApplication] delegate]; UIWindow *window = [delegate window]; NSLog(@"Creating FloatingWindow"); FloatingWindow* fw = [[FloatingWindow alloc] initWithNibName:@"FloatingWindow" bundle:nil]; NSLog(@"Adding FloatingWindow"); [window addSubview:fw.view]; NSLog(@"Setting frame size"); fw.view.frame = CGRectMake(100, 100, 200, 200); NSLog(@"Done openFloatingWindow"); return NULL;
} // ExtInitializer() void ExtInitializer(void ** extDataToSet、FREContextInitializer * ctxInitializerToSet、 FREContextFinalizer * ctxFinalizerToSet) {{ NSLog(@ "ExtInitializer"); * extDataToSet = NULL; * ctxInitializerToSet =&ContextInitializer; * ctxFinalizerToSet =&ContextFinalizer; } // ExtFinalizer() void ExtFinalizer(void * extData){ NSLog(@ "ExtFinalizer"); //ここでクリーンアップを実行します。 戻る; }FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * 1); func[0].name = (const uint8_t*) "openFloatingWindow"; func[0].functionData = NULL; func[0].function = &openFloatingWindow; *functionsToSet = func;
FlashRuntimeExtensions.hをXcodeプロジェクトに追加します。このファイルは、/ Applications / Adobe Flash Builder 4.6 / sdks / 4.6.0/includeフォルダーにあります。
- FloatingWindow.hとFloatingWindow.m(またはxibの所有者に関連付けられているファイルと呼ばれるもの)をXcodeプロジェクトに追加します。
- また、UIKitフレームワークをxcodeプロジェクトに追加する必要がある場合もあります(/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/UIKit.framework)
- プロジェクトビルド設定に移動し、次のフラグを変更します(これを怠ると、セグメンテーション違反が発生します。これを理解するのにしばらく時間がかかりました。これが変更したすべてのフラグであることを願っています):
- ターゲットデバイスファミリ=iPhone/ iPad
- Mach-Oタイプ=静的ライブラリ
- その他のリンカーフラグ=-OjbC–v
- Info.plistファイルのビルド設定を展開=いいえ
- 共有ライブラリとのリンクを有効にする=いいえ
- Xcode静的ライブラリを構築する
- 次に、FlashBuilderに移動して、Flexライブラリプロジェクトを作成します。必ずAdobeAirライブラリを含めてください
次のように、ExtensionContextを使用してFlexコードをXcodeコードにワイヤリングするクラスを作成します。
パッケージfwane {{ インポートflash.events.EventDispatcher; インポートflash.events.StatusEvent; import flash.external.ExtensionContext;
}public class FWAne { private static const EXTENSION_ID : String = "fwane.FWAne"; private var context : ExtensionContext; public function FWAne() { context = ExtensionContext.createExtensionContext( EXTENSION_ID, null ); if (context == null) { trace("WARNING: ExtensionContext cannot initialize"); } } public function openFloatingWeendow(fileName : String) : void { trace("Calling openFloatingWeendow"); context.addEventListener( StatusEvent.STATUS, onAneWinHander ); trace("Invoking native call"); context.call( "openFloatingWindow", fileName); trace("Returning from openFloatingWeendow"); } private function onAneWinHander( event : StatusEvent ) : void { trace(event.level); } }
FWAneswcを構築する
次に、ANEをコンパイルするためのビルドスクリプトが必要になります。これが私のbuild.shスクリプトです:
XLIB = "/ Users / christo.smal / Library / Developer / Xcode / DerivedData/wherever-lib.a"をエクスポートします エクスポートCERT="/ whereever / if / you / want / to / sign / ane.p12" FLEXLIBPATH = "../ Path / of / flex / library/project"をエクスポートします XIBPATH = "/ Path / of / where / xib / files/are"をエクスポートします SWCFNAME="FWAne.swc"をエクスポートします ANEFNAME="FWAne.ane"をエクスポートします ls -la $ XLIB echoファイルのコピー..。 rm -rf debug / * cp $ FLEXLIBPATH / src/extension.xml。 cp $ FLEXLIBPATH / bin /$SWCFNAME。 cp $ XLIB ./debug '#画像などのリソースファイルをデバッグフォルダにコピーします cp /path/to/my/images/referenced/from/xcode/*.png ./debug エコーコンパイルxib''s cp $ XIBPATH/*。xib./debug cp /wherever/FloatingWindow.xib ./debug / Developer / usr / bin / ibtool --errors --warnings --notices --output-format human-readable-text --compile debug / FloatingWindow.nib debug / FloatingWindow.xib --sdk / Developer / Platforms/iPhoneOS。プラットフォーム/開発者/SDK/iPhoneOS5.0.sdk rm -rf debug/*。xib echo Extractinglibrary.swc..。 cp $ SWCFNAME kak cd kak unzip -xo $ SWCFNAME cp -X library.swf ../debug CD .. echoさらにいくつかのファイルをコピーしています..。 rm -rf debug/*。ane cpextension.xmlデバッグ エコービルディングANE..。 '#-package -target ane / extension.xml -swc-platform-C。 / Applications / Adobe \ Flash \ Builder \ 4.6 / sdks / 4.6.0 / bin / adt -package -target ane debug / unsigned.ane extension.xml -swc $ SWCFNAME -platform iPhone-ARM -platformoptions ios-platformoptions.xml- Cデバッグ。 エコー署名ANE..。 '#/ Applications / Adobe \ Flash \ Builder \ 4.6 / sdks / 4.6.0 / bin / adt -sign -storetype pkcs12 -keystore $ CERT -storepass password -target ane debug / unsigned.ane $ ANEFNAME cp debug / unsigned.ane $ ANEFNAME エコー完了
ビルドスクリプトに関する重要な注意事項:xibはnibにコンパイルされ、これらのnibは他のリソースファイル(イメージなど)とともにANEに含まれます。静的ライブラリにはリソースファイルを含めることができないことに注意してください。
また、ios-platformoptions.xmlファイルも必要になります。これには、必要なすべてのフレームワークが含まれます。ここに、追加のサードパーティライブラリを検索パスとともに含めることもできます。
<platform xmlns = "http://ns.adobe.com/air/extension/3.1"> <sdkVersion> 5.0 </ sdkVersion> <linkerOptions> <option>-フレームワークの基盤</option> <option>-フレームワークUIKit</option> <オプション>-フレームワークQuartzCore</option> <option>-フレームワークCoreGraphics</option> <!-option> -lthirdparty </ option> <オプション>-L/ searhPath / for / thirdlibrary </ option--> </linkerOptions> </ platform>
次に、FlashBuilderで、サンプルのテストアプリケーションプロジェクトを作成します。プロジェクトのプロパティに移動します。Flexビルドパスで、aneが追加されていることを確認します。また、Flex Build Packaging-> Apple iOS-> Native Extensionsの下に、ANEが追加され、パッケージがチェックされます。また、ネイティブ拡張機能の下にAppleiOSSDKフォルダーを追加します。最後に、拡張子が-app.xmlファイルに追加されていることを確認します。
- FlashBuilderで、適切なパッケージ設定を使用してデバイスにデバッグ構成を作成します。ネイティブ拡張機能が含まれ、パッケージ化されていることを再確認してください。プロジェクトをクリーンアップしてデバッグします。すべてがうまくいくと、「デバッグ接続を待機しています」ウィンドウがポップアップします。iPadにアプリをインストールして起動します。
お役に立てれば
C