Domanda

Come creare una finestra nativa in Xcode e integrarla con un'applicazione Flex Mobile. La finestra nativa dovrebbe agire in modo simile come il componente StageWebView in base al quale il contenuto nativo galleggia in un'area rettangolare sul resto dell'app Flex.

È stato utile?

Soluzione

Essendo un programmatore flessibile, questo è stato un processo noioso che mi ha richiesto settimane per capire. Spero che questo aiuti alcuni altri neofiti Xcode.

Prima di tutto, devi avere una comprensione di base di Objective-C e Xcode. Dovresti essere in grado di creare un semplice programma Hello World Xcode. Una volta che sai come farlo, vedrai che per ogni finestra visiva in genere avrai un file XIB, un file di intestazione e un file di implementazione. Ho scoperto che è più facile iniziare a scrivere un'applicazione Xcode normale, quindi una volta che funziona e sembra che dovrebbe, tiri manualmente questi 3 file (e ovviamente i file di supporto) sul tuo progetto di libreria statica Xcode. Quindi, andando avanti, suppongo che tu abbia superato questo passaggio. Ecco alcune istruzioni passo -passo su come integrare Xcode e Flex Mobile, usando ANE:

  • Apri Xcode. Crea nuovo progetto. iOS -> Biblioteca statica del cacao. Ho chiamato il mio progetto fwane
  • Elimina file fwane.h. Sostituisci il contenuto del file fwane.m con quanto segue:

    '#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"); //Cleanup Here. return; } // 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"); // Do Cleanup here. return; }
  • Aggiungi flashRuntimeextensions.h al progetto Xcode. Questo file esiste in/Applicazioni/Adobe Flash Builder 4.6/SDKS/4.6.0/include cartella

  • Aggiungi floatingwindow.h e floatingwindow.m (o qualunque cosa i file siano chiamati associati al proprietario del tuo XIB) al progetto Xcode.
  • Potrebbe anche essere necessario aggiungere il framework UiKit al progetto XCode (/Developer/Platforms/Iphoneos.Platform/developer/sdks/iphoneos5.0.sdk/system/library/frameworks/uikit.framework)
  • Vai alle impostazioni di build del progetto e modifica le seguenti flag (il mancato fallo si traduce in un errore di segmentazione. Mi ha impiegato un po 'di tempo per capirlo. Spero che siano tutte le flag che ho cambiato):
    1. Famiglia del dispositivo target = iPhone/iPad
    2. Tipo mach-o = libreria statica
    3. Altri flag di linker = -ojbc –v
    4. Espandi le impostazioni di build in info.plist file = no
    5. Abilita il collegamento con le librerie condivise = no
  • Costruisci la libreria statica Xcode
  • Ora vai su FlashBuilder e crea un progetto di libreria Flex. Assicurati di includere le librerie Adobe Air
  • Crea la tua classe che utilizzerà ExtensionContext per collegare il codice Flex sul codice Xcode come così:

    package fwane
    {
        import flash.events.EventDispatcher;
        import 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);
        }
    
    }
    
    }
  • Costruisci Fwane SWC

  • Successivamente, avrai bisogno di uno script di build per compilare il tuo ANE. Ecco la mia sceneggiatura build.sh:

    export XLIB="/Users/christo.smal/Library/Developer/Xcode/DerivedData/wherever-lib.a"
    export CERT="/wherever/if/you/want/to/sign/ane.p12"
    export FLEXLIBPATH="../Path/of/flex/library/project"
    export XIBPATH="/Path/of/where/xib/files/are"
    export SWCFNAME="FWAne.swc"
    export ANEFNAME="FWAne.ane"
    
    ls -la $XLIB
    
    echo Copying files ...
     rm -rf debug/*
    cp $FLEXLIBPATH/src/extension.xml .
    cp $FLEXLIBPATH/bin/$SWCFNAME .
     cp $XLIB ./debug
    
    '# copy resource files such as images to debug folder
    cp /path/to/my/images/referenced/from/xcode/*.png ./debug
    
    echo Compiling 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.platform/Developer/SDKs/iPhoneOS5.0.sdk
    
    rm -rf debug/*.xib
    
    
    echo Extracting library.swc ...
    cp $SWCFNAME kak
    cd kak
    unzip -xo $SWCFNAME
    cp -X library.swf ../debug
    cd ..
    
    echo Copying some more files ...
    rm -rf debug/*.ane
    cp extension.xml debug
    
    echo Building 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 debug .
    
    echo Signing 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
    
    echo done
    
  • Importante da notare sul mio script di build: gli XIB vengono compilati in pennini e quindi questi pennini insieme ad altri file di risorse (come le immagini) sono quindi inclusi nell'ANE. Ricorda che le librerie statiche non possono contenere file di risorse.

  • Richiederesti anche un file iOS-PlatformOptions.xml. Questo per includere tutti i framework necessari. Puoi anche includere eventuali libri di terza parte di terze parti con i loro percorsi di ricerca qui:

    <platform xmlns="http://ns.adobe.com/air/extension/3.1">
        <sdkVersion>5.0</sdkVersion>
        <linkerOptions>
            <option>-framework Foundation</option>
            <option>-framework UIKit</option>
            <option>-framework QuartzCore</option>
            <option>-framework CoreGraphics</option>
            <!--option>-lthirdparty</option>
            <option>-L/searhPath/for/thirdlibrary</option-->
        </linkerOptions>
    </platform>
    
  • Ora, in FlashBuilder, crea un progetto di applicazione di test di esempio. Vai alle proprietà del progetto. Nel percorso di build Flex, assicurarsi che venga aggiunto l'ane. Anche sotto l'imballaggio Build Flex -> Apple iOS -> Estensioni native L'ANE viene aggiunto lì e il pacchetto viene controllato. Aggiungi anche la cartella SDK Apple iOS in estensioni native. Infine, verificare che l'estensione sia aggiunta nel file -app.xml.

  • In FlashBuilder, creare una configurazione di debug sul dispositivo con le impostazioni di imballaggio appropriate. Controllare il doppio che l'estensione nativa sia inclusa e confezionata. Pulisci il progetto e debug. Se tutto va bene, si presenta la finestra "Aspettando la connessione di debug". Installa e avvia l'app sull'iPad.

Spero che sia di aiuto

C

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top