Как создать ANE, которая будет отображать плавающее окно - PullRequest
6 голосов
/ 23 января 2012

Как создать собственное окно в Xcode и интегрировать его с приложением Mobile Flex.Собственное окно должно работать аналогично компоненту StageWebView, поэтому нативное содержимое плавает в прямоугольной области над остальной частью приложения Flex.

1 Ответ

12 голосов
/ 23 января 2012

Будучи программистом гибкого программирования, это был утомительный процесс, на который у меня ушли недели. Надеюсь, что это поможет другим новичкам в Xcode.

Прежде всего, вы должны иметь общее представление о Objective-C и Xcode. Вы должны быть в состоянии создать простую программу Hello World Xcode. Как только вы поймете, как это сделать, вы увидите, что для каждого визуального окна у вас обычно есть xib-файл, заголовочный файл и файл реализации. Я обнаружил, что легче начать писать обычное приложение XCode, а затем, когда оно работает и выглядит так, как должно, вы вручную вытягиваете эти 3 файла (и, конечно, вспомогательные файлы) в свой проект статической библиотеки XCode. Итак, двигаясь дальше, я собираюсь предположить, что вы прошли этот шаг. Вот несколько пошаговых инструкций по интеграции Xcode и Flex mobile с помощью ANE:

  • Открыть 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];
    
    <pre><code>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;
    </code>
    } // 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)
  • Перейдите к настройкам сборки проекта и измените следующие флаги (Невыполнение этого приводит к ошибке сегментации. Мне потребовалось время, чтобы понять это. Надеюсь, это все флаги, которые я изменил):
    1. Семейство целевых устройств = iPhone / iPad
    2. Тип Mach-O = Статическая библиотека
    3. Другие флаги компоновщика = -OjbC –v
    4. Развернуть настройки сборки в файле Info.plist = Нет
    5. Включить связывание с общими библиотеками = Нет
  • Сборка статической библиотеки Xcode
  • Теперь перейдите к FlashBuilder и создайте проект библиотеки Flex. Обязательно включите библиотеки Adobe Air
  • Создайте свой класс, который будет использовать ExtensionContext для привязки кода Flex к вашему коду Xcode следующим образом:

    package fwane
    {
        import flash.events.EventDispatcher;
        import flash.events.StatusEvent;
        import flash.external.ExtensionContext;
    
    <pre><code>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);
        }
    
    }
    </code>
    }
  • Сборка FWAne SWC

  • Далее вам понадобится скрипт сборки для компиляции вашего ANE. Вот мой скрипт build.sh:

    
    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
    
  • Важно отметить, что мой сценарий сборки: xibs компилируются в nib, а затем эти nib вместе с другими файлами ресурсов (такими как изображения) затем включаются в ANE. Помните, что статические библиотеки не могут содержать файлы ресурсов.

  • Вам также потребуется файл ios-platformoptions.xml. Это включает все необходимые вам фреймворки. Вы также можете включить любые дополнительные сторонние библиотеки со своими путями поиска здесь:

    <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>
    
  • Теперь в FlashBuilder создайте пример проекта тестового приложения.Перейти к свойствам проекта.Во Flex build path, убедитесь, что добавлено ane.Также в разделе Flex Build Packaging -> Apple iOS -> Собственные расширения добавляется ANE и проверяется пакет.Также добавьте папку Apple iOS SDK под собственными расширениями.Наконец, убедитесь, что расширение добавлено в файл -app.xml.

  • В FlashBuilder создайте конфигурацию отладки на устройстве с соответствующими параметрами упаковки.Дважды проверьте, что родное расширение включено и упаковано.Очистить проект и отладить.Если все идет хорошо, появляется окно «Ожидание отладочного соединения».Установите и запустите приложение на iPad.

Надеюсь, это поможет

C

...