如何创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 / 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)
- 转到项目构build设置并修改以下标志(如果不这样做会导致分段错误,请花一点时间来解决这个问题。希望这是我更改的所有标志):
- 目标设备系列= iPhone / iPad
- Mach-Otypes=静态库
- 其他链接器标志= -OjbC -v
- 在Info.plist文件中展开构build设置=否
- 启用与共享库链接=否
- 构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 / Adobe \ 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 / Adobe \ 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