如何在Xcode中创建本机窗口并将其与Mobile Flex应用程序集成。本机窗口应该与StageWebView组件类似,其中本机内容浮动在Flex应用程序其余部分的矩形区域中。
答案 0 :(得分:12)
作为一名灵活的程序员,这是一个繁琐的过程,花了我几个星期才弄明白。希望这将有助于其他一些Xcode新手。
首先,您必须对Objective-C和Xcode有基本的了解。您应该能够创建一个简单的Hello World Xcode程序。一旦你知道如何做到这一点,你会发现对于每个可视窗口,你通常会有一个xib文件,一个头文件和一个实现文件。我发现开始编写一个普通的Xcode应用程序更容易,然后一旦它正常工作并且看起来应该如此,你就可以手动将这3个文件(当然还有辅助文件)拉到你的Xcode静态库项目中。所以,继续前进,我将假设你已经过了这一步。以下是有关如何使用ANE集成Xcode和Flex移动设备的一步一步说明:
删除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];} // 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;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;
} // 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; }FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * 1); func[0].name = (const uint8_t*) "openFloatingWindow"; func[0].functionData = NULL; func[0].function = &openFloatingWindow; *functionsToSet = func;
将FlashRuntimeExtensions.h添加到Xcode项目中。该文件存在于/ Applications / Adobe Flash Builder 4.6 / sdks / 4.6.0 / include文件夹下
创建一个类,它将使用ExtensionContext将Flex代码连接到您的Xcode代码,如下所示:
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脚本:
{{1}}
重要的是要注意我的构建脚本:将xib编译为nib,然后将这些nib与其他资源文件(如图像)一起包含在ANE中。请记住,静态库不能包含资源文件。
您还需要一个ios-platformoptions.xml文件。这包括您需要的所有框架。您还可以在此处添加任何其他第三方库及其搜索路径:
package fwane { import flash.events.EventDispatcher; import flash.events.StatusEvent; import flash.external.ExtensionContext;{{1}}}
现在,在FlashBuilder中,创建一个示例测试应用程序项目。转到项目属性。在Flex构建路径中,确保添加了ane。也在Flex Build Packaging下 - > Apple iOS - >在此处添加ANE的本机扩展并检查包。还要在原生扩展名下添加Apple iOS SDK文件夹。最后,检查扩展是否已添加到-app.xml文件中。
希望这有帮助
C