如何创build将本机显示浮动窗口的ANE

如何在Xcode中创build本地窗口并将其与Mobile Flex应用程序集成。 本机窗口的行为与StageWebView组件的行为类似,原生内容在Flex应用程序的其余部分的矩形区域中浮动。

作为灵活的程序员,这是一个乏味的过程,花了我几个星期才弄明白。 希望这将有助于一些其他的Xcode新手。

首先,你必须对Objective-C和Xcode有基本的了解。 你应该可以创build一个简单的Hello World Xcode程序。 一旦你知道如何做到这一点,你会看到,对于每个可视窗口,你通常会有一个xib文件,一个头文件和一个实现文件。 我发现开始编写一个普通的Xcode应用程序更容易,然后一旦它正在工作,看起来应该是这样,你手动拉这3个文件(当然还有助手文件)到你的Xcode静态库项目。 所以,继续前进,我会假设你已经走过了这一步。 以下是关于如何使用ANE集成Xcode和Flex移动设备的一步一步说明:

  • 打开XCode。 创build新项目。 iOS – >cocoa触摸静态库。 我打电话给我的项目FWAne
  • 删除FWAne.h文件。 将FWAne.m文件的内容replace为以下内容:

    
     '#import“FloatingWindow.h”
     '#import“FlashRuntimeExtensions.h”
    
     FREObject openFloatingWindow(FREContext ctx,void * funcData,uint32_t argc,FREObject argv [])
     {
        长度,长度,长度,长度,长度,长度,长度,长度,长度,长度,长度
         const upint_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)
  • 转到项目构build设置并修改以下标志(如果不这样做会导致分段错误,请花一点时间来解决这个问题。希望这是我更改的所有标志):
    1. 目标设备系列= iPhone / iPad
    2. Mach-Otypes=静态库
    3. 其他链接器标志= -OjbC -v
    4. 在Info.plist文件中展开构build设置=否
    5. 启用与共享库链接=否
  • 构buildXcode静态库
  • 现在,转到FlashBuilder并创build一个Flex库项目。 确保包含Adobe Air库
  • 创build将使用ExtensionContext将Flex代码连接到Xcode代码的类,如下所示:

    包fwane
     {
        导入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); } } 

    }

  • build立FWAne SWC

  • 接下来,您将需要构build脚本来编译您的ANE。 这是我的build.sh脚本:

    
    导出XLIB =“/ Users / christo.smal / Library / Developer / Xcode / DerivedData / wherever-lib.a”
    导出CERT =“/任何/如果/你/想/到/ sign / ane.p12”
    导出FLEXLIBPATH =“../ Path / of / flex / library / project”
     export XIBPATH =“/ Path / of / where / xib / files / are”
    导出SWCFNAME =“FWAne.swc”
    导出ANEFNAME =“FWAne.ane”
    
     ls -la $ XLIB
    
    回声复制文件...
      rm -rf debug / *
     cp $ FLEXLIBPATH / src / extension.xml。
     cp $ FLEXLIBPATH / bin / $ SWCFNAME。
      cp $ XLIB ./debug
    
     #复制资源文件如图片到debugging文件夹
     cp /path/to/my/images/referenced/from/xcode/*.png ./debug
    
     echo编译xib的
    
     cp $ XIBPATH / *。xib ./debug
     cp /其他/FloatingWindow.xib ./debug
    
     / Developer / usr / bin / ibtool --errors --warnings --notices --output  -  format人类可读文本--compiledebugging/ FloatingWindow.nib debug / FloatingWindow.xib --sdk / Developer / Platforms / iPhoneOS。平台/开发商/软件开发工具包/ iPhoneOS5.0.sdk
    
     rm -rf debug / *。xib
    
    
    回声提取library.swc ...
     cp $ SWCFNAME kak
     cd kak
    解压缩-xo $ SWCFNAME
     cp -X library.swf ../debug
     cd ..
    
    回声复制一些更多的文件...
     rm -rf debug / *。ane
     cp的extension.xmldebugging
    
    回声build设ANE ... 
     '#package -target ane / extension.xml -swc -platform -C。
     / Applications / Adob​​e \ Flash \ Builder \ 4.6 / sdks / 4.6.0 / bin / adt -package -target一个debug / unsigned.ane extension.xml -swc $ SWCFNAME -platform iPhone-ARM -platformoptions ios-platformoptions.xml  - Cdebugging。
    
    回声签名ANE ...
     '#/ Applications / Adob​​e \ Flash \ Builder \ 4.6 / sdks / 4.6.0 / bin / adt -sign -storetype pkcs12 -keystore $ CERT -storepass password -target一个debug / unsigned.ane $ ANEFNAME
     cp debug / unsigned.ane $ ANEFNAME
    
    回声完成
    
  • 重要的是要注意我的构build脚本:xib被编译为nibs,然后这些nib与其他资源文件(如图像)一起被包含在ANE中。 请记住,静态库不能包含资源文件。

  • 您还需要一个ios-platformoptions.xml文件。 这是包括你需要的所有框架。 您也可以在这里包含任何额外的第三方库及其searchpath:

     <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>
             <! - 选项> -lthirdparty </选项>
             <选项> -L / searhPath /对/ thirdlibrary </选项 - >
         </ linkerOptions>
     </平台>
    
  • 现在,在FlashBuilder中,创build一个示例testing应用程序项目。 转到项目属性。 在Flex构buildpath中,确保已添加了ane。 同样在Flex Build Packaging – > Apple iOS – > Native扩展中,ANE被添加到那里,包被检查。 还要在本机扩展下添加Apple iOS SDK文件夹。 最后,检查是否在-app.xml文件中添加了扩展名。

  • 在FlashBuilder中,使用适当的打包设置在设备上创build一个debuggingconfiguration。 仔细检查是否包含本地扩展。 清理项目并debugging。 如果一切顺利,popup“等待debugging连接”窗口。 在iPad上安装并启动应用程序。

希望这可以帮助

C