Question

Comment créer une fenêtre natale en Xcode et l'intégrer à une application Flex mobile.La fenêtre native devrait agir de la même manière que la composante StageWebView dans laquelle le contenu natif flotte dans une zone rectangulaire sur le reste de l'application Flex.

Était-ce utile?

La solution

Être un programmeur Flex, c'était un processus fastidieux qui m'a pris des semaines pour comprendre. J'espère que cela aidera d'autres débutants Xcode.

Tout d'abord, vous devez avoir une compréhension de base de l'objectif-c et de xcode. Vous devriez être capable de créer un simple programme Xcode World Hello World. Une fois que vous savez comment faire cela, vous verrez que pour chaque fenêtre visuelle, vous aurez généralement un fichier XIB, un fichier d'en-tête et un fichier de mise en œuvre. J'ai constaté qu'il était plus facile de commencer à écrire une application Xcode normale, puis une fois qu'il fonctionne et que vous ressemblez à cela, vous tirez manuellement ces 3 fichiers (et bien sûr les fichiers d'aide) sur votre projet de bibliothèque Static Xcode. Alors, allumez-vous, je vais supposer que vous avez passé cette étape. Voici quelques instructions étape par étape sur la manière d'intégrer Xcode et Flex Mobile, en utilisant ANE:

  • Ouvrez Xcode. Créer un nouveau projet. iOS -> Bibliothèque statique de cacao tactile. J'ai appelé mon projet Fwane
  • Supprimer le fichier fwane.h. Remplacer les contenus du fichier fwane.m par ce qui suit:

    '#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; }

  • Ajouter le flashRuntimeExtensions.h à votre projet Xcode. Ce fichier existe sous The / Applications / Adobe Flash Builder 4.6 / SDKS / 4.6.0 / Inclure le dossier

  • Ajouter Floatingwindow.h et Floatingwindow.m (ou quels que soient les fichiers appelés associés au propriétaire de votre XIB) à votre projet Xcode.
  • Vous devrez peut-être aussi ajouter le cadre Uikit au projet Xcode (/Developer/platforms/iphoneos.platform/developer/sdks/iphoneos5.0.sdk/system/library/frameworks/uikit.framework)
  • Allez dans les paramètres de construction de projets et modifiez les indicateurs suivants (Échec de la sorte de faire des résultats dans la défaillance de la segmentation. A pris un certain temps pour comprendre cela. J'espère que c'est tous les drapeaux que j'ai changés):
    1. Cible Device Family= iPhone / iPad
    2. Mach-O Type= Bibliothèque statique
    3. Autres drapeaux de liaison= -OJBC -V
    4. Développez les paramètres de construction dans Info.Plist File= NO
    5. Activer la liaison avec les bibliothèques partagées= NO
    6. construire la bibliothèque statique Xcode
    7. Maintenant, allez à Flashbuilder et créez un projet Flex Bibliothèque. Assurez-vous d'inclure les bibliothèques Adobe Air
    8. Créez votre classe qui utilisera l'extensionContext pour filer le code Flex sur votre code Xcode comme:

      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);
          }
      
      }
      
      }

    9. Construire le Fwane SWC

    10. Ensuite, vous allez avoir besoin d'un script de construction pour compiler votre ANE. Voici mon build.sh script:

      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
      

    11. IMPORTANT À REMARQUE À propos de mon script de construction: Les XIBS sont compilés à des NIBS, puis ceux-ci avec d'autres fichiers de ressources (tels que des images) sont ensuite inclus dans l'ANE. N'oubliez pas que les libs statiques ne peuvent pas contenir de fichiers de ressources.

    12. Vous auriez également besoin d'un fichier iOS-plateformeOptionS.xml. Ceci inclure tous les cadres dont vous avez besoin. Vous pouvez également inclure des 3 pistes supplémentaires avec leurs chemins de recherche ici:

      <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>
      

    13. Maintenant, à Flashbuilder, créez un exemple de projet d'application de test. Aller aux propriétés du projet. Dans le chemin de construction Flex, assurez-vous que l'ANE est ajouté. Également sous FLEX Build Emballage -> Apple iOS -> Extensions natives L'ANE est ajouté là-bas et l'emballage est vérifié. Ajoutez également le dossier Apple iOS SDK sous Extensions natives. Enfin, vérifiez que l'extension est ajoutée dans le fichier -app.xml.

    14. Dans Flashbuilder, créez une configuration de débogage sur le périphérique avec les paramètres d'emballage appropriés. Vérifiez que l'extension native est incluse et emballée. Nettoyez le projet et le débogage. Si tout va bien, la fenêtre "En attente de la connexion de débogage" apparaît. Installez et lancez l'application sur l'iPad.

      J'espère que cela aide

      c

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top