6

Xcode でネイティブ ウィンドウを作成し、それを Mobile Flex アプリケーションと統合する方法。ネイティブ ウィンドウは、StageWebView コンポーネントと同様に動作する必要があります。これにより、ネイティブ コンテンツは、Flex アプリの残りの部分の上の長方形の領域に浮かびます。

4

1 に答える 1

12

フレックスプログラマーであるため、これは退屈なプロセスであり、理解するのに数週間かかりました。これが他の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];
    
    
    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;
    
    } // 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;
    FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * 1);
    func[0].name = (const uint8_t*) "openFloatingWindow";
    func[0].functionData = NULL;
    func[0].function = &openFloatingWindow;
    
    *functionsToSet = func;
    
    } // ExtInitializer() void ExtInitializer(void ** extDataToSet、FREContextInitializer * ctxInitializerToSet、 FREContextFinalizer * ctxFinalizerToSet) {{ NSLog(@ "ExtInitializer"); * extDataToSet = NULL; * ctxInitializerToSet =&ContextInitializer; * ctxFinalizerToSet =&ContextFinalizer; } // ExtFinalizer() void ExtFinalizer(void * extData){ NSLog(@ "ExtFinalizer"); //ここでクリーンアップを実行します。 戻る; }
  • FlashRuntimeExtensions.hをXcodeプロジェクトに追加します。このファイルは、/ Applications / Adob​​e 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)
  • プロジェクトビルド設定に移動し、次のフラグを変更します(これを怠ると、セグメンテーション違反が発生します。これを理解するのにしばらく時間がかかりました。これが変更したすべてのフラグであることを願っています):
    1. ターゲットデバイスファミリ=iPhone/ iPad
    2. Mach-Oタイプ=静的ライブラリ
    3. その他のリンカーフラグ=-OjbC–v
    4. Info.plistファイルのビルド設定を展開=いいえ
    5. 共有ライブラリとのリンクを有効にする=いいえ
  • 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 / Adob​​e \ 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 / Adob​​e \ 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

于 2012-01-23T16:20:23.540 に答える