ios - 如何创建将在本地显示 float 窗口的ANE

标签 ios xcode apache-flex adobe air-native-extension

如何在Xcode中创建 native 窗口并将其与Mobile Flex应用程序集成。 native 窗口的作用类似于StageWebView组件,由此 native 内容 float 在Flex应用程序其余部分的矩形区域中。

最佳答案

作为一名弹性程序员,这是一个乏味的过程,我花了数周的时间才弄清楚。希望这对其他Xcode新手有所帮助。

首先,您必须对Objective-C和Xcode有基本的了解。您应该能够创建一个简单的Hello World Xcode程序。知道如何执行此操作后,您将看到,对于每个可视窗口,通常将具有一个xib文件,一个头文件和一个实现文件。我发现开始编写普通的Xcode应用程序比较容易,然后,一旦它正常工作并看起来应该正常工作,就可以将这3个文件(当然还有帮助文件)手动拉到Xcode静态库项目中。因此,继续前进,我将假设您已经过了这一步。以下是有关如何使用ANE集成Xcode和Flex mobile的逐步说明:

  • 打开XCode。创建新项目。 iOS-> Cocoa Touch静态库。我称我的项目为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()。
    无效的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设置并修改以下标志(否则将导致Segmentation错误。花了我一段时间才能弄清楚这一点。希望这是我更改的所有标志):
  • 目标设备系列= iPhone/iPad
  • Mach-O类型=静态库
  • 其他链接器标志= -OjbC –v
  • 展开Info.plist文件中的build设置= No
  • 启用与共享库的链接=否
  • 构建Xcode静态库
  • 现在,转到FlashBuilder并创建一个Flex库项目。确保包含Adobe Air库
  • 创建您的类,该类将使用ExtensionContext将Flex代码连接到您的Xcode代码,如下所示:
    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);
        }
    
    }
    

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

    导出XLIB =“/Users/christo.smal/Library/Developer/Xcode/DerivedData/wherever-lib.a”
    导出CERT =“/在任何地方/如果/您/想要/要/签名/ane.p12”
    导出FLEXLIBPATH =“../path/of/flex/library/project”
    导出XIBPATH =“/Path/of/where/xib/files/are”
    导出SWCFNAME =“FWAne.swc”
    导出ANEFNAME =“FWAne.ane”

    ls -la $ XLIB

    回声复制文件...
    rm -rf调试/*
    cp $ FLEXLIBPATH/src/extension.xml。
    cp $ FLEXLIBPATH/bin/$ SWCFNAME。
    cp $ XLIB ./调试

    '#将资源文件(例如图像)复制到调试文件夹
    cp/path/to/my/images/referenced/from/xcode/*.png ./调试

    回声编译XIB的

    cp $ XIBPATH/*。xib ./调试
    cp/wherever/FloatingWindow.xib ./debug

    /Developer/usr/bin/ibtool-错误-警告-通知-输出格式的人类可读文本-编译debug/FloatingWindow.nib debug/FloatingWindow.xib --sdk/Developer/Platforms/iPhoneOS。平台/开发人员/SDK/iPhoneOS5.0.sdk

    rm -rf调试/*.xib

    回声提取library.swc ...
    cp $ SWCFNAME kak
    cd kak
    解压-xo $ SWCFNAME
    cp -X library.swf ../debug
    光盘..

    回声复制更多的文件...
    rm -rf调试/*.ane
    cp extension.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文件。这将包括您需要的所有框架。您还可以在此处包括其他任何第三方库及其搜索路径:


    5.0





    -lthirdparty


  • 现在,在FlashBuilder中创建一个示例测试应用程序项目。转到项目属性。在Flex构建路径中,确保已添加ane。同样在Flex Build Packaging-> Apple iOS-> Native extensions下,将ANE添加到那里并检查软件包。还要在 native 扩展名下添加Apple iOS SDK文件夹。最后,检查扩展名是否已添加到-app.xml文件中。
  • 在FlashBuilder中,使用适当的打包设置在设备上创建调试配置。仔细检查是否包含并打包了 native 扩展。清理项目并调试。如果一切顺利,将弹出“等待调试连接”窗口。在iPad上安装并启动该应用程序。

  • 希望这可以帮助

    C

    关于ios - 如何创建将在本地显示 float 窗口的ANE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8968726/

    相关文章:

    iOS 当我在自己的应用程序中单击关联域时,会启动 safari

    ios - 有没有办法用脚本创建一个 swift 类并在预构建中添加属性?

    xcode - 使用 pngcrush 工具的 PNG 优化问题

    java - 在运行时修改 AMF 响应 - 如何操作?

    ruby-on-rails - Flash/Flex 发送 XML 到 Rails 应用程序

    ios - 从 PFObject 访问 NSArray 中的项目

    ios - xcode 通过 ruby​​ gem xcodeproj 更改代码签名身份

    ios - 从 iPhone 相机获取图像路径使用 UIImagePickerController 返回 nil

    ios - Gigya Swift 框架缺少 ios-framework-build.sh 脚本

    apache-flex - 适合长期开发人员的 Flex 好书