Ios 如何创建本机显示浮动窗口的ANE

Ios 如何创建本机显示浮动窗口的ANE,ios,xcode,apache-flex,adobe,air-native-extension,Ios,Xcode,Apache Flex,Adobe,Air Native Extension,如何在Xcode中创建本机窗口并将其与移动Flex应用程序集成。本机窗口应与StageWebView组件类似,本机内容在Flex应用程序其余部分的矩形区域中浮动。作为Flex程序员,这是一个耗时数周的冗长过程。希望这能帮助其他Xcode新手 首先,您必须对Objective-C和Xcode有基本的了解。您应该能够创建一个简单的Hello World Xcode程序。一旦您知道如何做到这一点,您将看到,对于每个可视窗口,您通常会有一个xib文件、一个头文件和一个实现文件。我发现开始编写一个普通的X

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

作为Flex程序员,这是一个耗时数周的冗长过程。希望这能帮助其他Xcode新手

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

  • 打开XCode。创建新项目。iOS->Cocoa触摸静态库。我给我的项目打了电话
  • 删除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上下文终结器(FREContext ctx) { NSLog(@“ContextFinalizer”); //清理这里。 返回; } //上下文初始值设定项() void ContextInitializer(void*extData,const uint8\u t*ctxType,FREContext ctx, uint32_t*numFunctionsToTest,const FRENamedFunction**functionsToSet) { NSLog(@“ContextInitializer”); *numFunctionsToTest=1; 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);
        }
    
    }
    
    } //灭活剂() 无效终止初始化器(无效**extDataToSet,FREContextInitializer*CtXInitializerSet, FREContextFinalizer*ctxFinalizerToSet) { NSLog(“灭活器”); *extDataToSet=NULL; *ctxInitializerToSet=&ContextInitializer; *ctxFinalizerToSet=&ContextFinalizer; } //ExtFinalizer() void ExtFinalizer(void*extData){ NSLog(@“ExtFinalizer”); //在这里做清洁。 返回; }
  • 将FlashRuntimeExtensions.h添加到您的Xcode项目中。此文件位于/Applications/Adobe 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)
  • 转到“项目生成设置”并修改以下标志(否则会导致分段错误。我花了一段时间才弄清楚。希望这是我更改的所有标志):
  • 目标设备系列=iPhone/iPad
  • 马赫-O型=静态库
  • 其他链接器标志=-OjbC–v
  • 展开Info.plist文件中的生成设置=否
  • 启用与共享库的链接=否
  • 构建Xcode静态库
  • 现在,转到FlashBuilder并创建一个Flex库项目。确保包含Adobe Air库
  • 创建将使用ExtensionContext将Flex代码连接到Xcode代码的类,如下所示:

    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 }
  • 构建FWAne swc

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

    export XLIB=“/Users/christo.smal/Library/Developer/Xcode/DerivedData/where lib.a” 导出证书=“/where/if/you/want/to/sign/ane.p12” export 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调试/* cp$FLEXLIBPATH/src/extension.xml。 cp$FLEXLIBPATH/bin/$SWCFNAME。 cp$XLIB./debug “#将图像等资源文件复制到调试文件夹 cp/path/to/my/images/referenced/from/xcode/*.png./debug echo编译xib's cp$XIBPATH/*.xib./debug cp/where/FloatingWindow.xib./debug /Developer/usr/bin/ibtool--错误--警告--通知--输出格式人类可读文本--编译调试/FloatingWindow.nib调试/FloatingWindow.xib--sdk/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk rm-rf调试/*.xib echo Extraction library.swc。。。 cp$SWCFNAME kak 卡卡 解压-xo$SWCFNAME cp-X library.swf../debug 光盘 echo正在复制更多文件。。。 rm-rf调试/*.ane cp extension.xml调试 回声大厦电子。。。 '#-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-platformoptions-iPhone ARM-platformoptions-ios-platformoptions.xml-C debug。 回音签名电子邮件。。。 “#/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 回音完成
  • 关于我的构建脚本需要注意的一点很重要:xib被编译成nib,然后这些nib连同其他资源文件(比如图像)一起被包含在ANE中。请记住,静态库不能包含资源文件

  • 您还需要一个ios-platformoptions.xml文件。这将包括您需要的所有框架。您还可以在此处包含任何附加的第三方LIB及其搜索路径:

    5 框架基础 -框架UIKit -框架石英砂 -框架核心图形
  • 现在,在FlashBuilder中,创建一个示例测试应用程序项目。转到项目属性。在Flex构建路径中,确保添加了ane。另外,在Flex Build package->Apple iOS->Native extensions下,将添加一个ANE并检查包。还可以在下面添加Apple iOS SDK文件夹 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 <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>