[AS3] Parse AnalyticsのiOSのANEを作りたい! Static Library編

2014/08/5

この記事は全4回の「Parse AnalyticsのiOSのANEを作りたい!」シリーズの1つです。

[AS3] Parse AnalyticsのiOSのANEを作りたい! 準備編
[AS3] Parse AnalyticsのiOSのANEを作りたい! Static Library編 << イマココ! [AS3] Parse AnalyticsのiOSのANEを作りたい! ActionScript編
[AS3] Parse AnalyticsのiOSのANEを作りたい! ANEビルド編


こんにちは。きんくまです。

いやーブログを更新しようと思ったら、読み出しはできるんだけど書き込みや編集ができない状態になっていまして。
焦っていろいろ調べてみたら、DBの容量オーバーだったという。

結論からいうと、コメント関係のデータが重かったりしたので、スパム対策のデータを消して、新規コメントやトラックバックを無効にしました。なので、今後はコメントができないブログとなりました。
コメントのスパム対策だけで、ブログ記事全データよりも重かったので、、。

あと、あんまり気にしてなかったけど、容量くうみたいなんでWordpressのRevision保存機能とか自動保存機能も切りました。

うーん、移転するかな。どうするかな、、。

さて、今回はANEのStatic Library編です。

Static Libraryづくり

普通のANEづくりと同じところは、詳しくは説明しないです。

Static Libraryを作ります。

static_lib1

FlashRuntimeExtensions.hを追加します。ANEつくるたびにコピーしているので、もとがどこにあるのか不明です、、。たぶんAIR SDKの中のどこかにあったと思います。

Frameworkとかdylibとか

公式のサンプルParseStarterProjectでは、以下のFrameworkとdylibを使っていました。

parse_libs1

ただ、ANE用のStaticLibararyではDynamicLibararyは必要ないので、libzを抜かしてこんな感じにします。

parse_libs2

つぎに、Edit Schemeをえらんで

edit_scheme

Build ConfigurationをReleaseにします。これでビルドすればReleaseビルドになります。

build_config1

つぎに、書き出すディレクトリを設定します。
なんでこんなことをやるかというと、ANEをつくるときはStaticLibararyでできた.aファイルを含める必要があるのですが、それをビルドしたときにデフォルトだとかなり階層が深いところに入っているので、コピーしてくるのが面倒くさいです。なので、ビルドするだけで、ANEのビルドフォルダにちゃっかり入っちゃってるという風にしたいのです。

Build Settingsの中からPer-configuration Build Products Pathを選択
右上の検索からPer-configとかやると絞り込まれます。

per_config

値は以下のようににしました。

$(PROJECT_DIR)/../build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

per_config2

これでiOS Deviceでビルドすると(Command + B)、iOSプロジェクトの1コ上のbuildフォルダの中にRelease-iphoneosというフォルダが入っていることが確認できると思います。
シミュレーターでビルドじゃないです。シミュレーターでビルドする必要があるのは、iOSシミュレーターでもANEを使いたい場合のみです。その場合はシミュレーターを選択してビルドします。あとは、ANEのビルドをするときにそれも含めてビルドします。私は今回は面倒なのでやっていません。

iOS_device_build

詳しいフォルダ構成などはgitのプロジェクトを落としてくるとわかると思います。

コード

前回作ったKKParseAnalyticsControllerをANEから使えるようにします。

ParseAnalyticsANEiOS.h

#import <Foundation/Foundation.h>
#import "FlashRuntimeExtensions.h"

//Extention
void ParseAnalyticsAneExtensionInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet);
void ParseAnalyticsAneExtensionFinalizer(FREContext ctx);

//Context
void ParseAnalyticsAneContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet);
void ParseAnalyticsAneContextFinalizer(FREContext ctx);

ParseAnalyticsANEiOS.m

#import "ParseAnalyticsANEiOS.h"
#import "KKParseAnalyticsController.h"

/**
 Get NSString from FREObject
 @param freObj FREObject
 */
NSString *getNSStringFromFREObject(FREObject freObj)
{
    uint32_t strLen;
    const uint8_t *cStr;
    FREGetObjectAsUTF8(freObj, &strLen, &cStr);
    if(strLen == 0){
        return @"";
    }
    return [[NSString alloc] initWithUTF8String:(char *)cStr];
}

FREObject ParseAnalyticsAneSetUp(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
    NSString *appId = getNSStringFromFREObject(argv[0]);
    NSString *clientKey = getNSStringFromFREObject(argv[1]);
    [[KKParseAnalyticsController sharedController] setupParseWithApplicationId:appId clientKey:clientKey];
    return NULL;
}

FREObject ParseAnalyticsAneTrackEvent(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
    NSString *eventName = getNSStringFromFREObject(argv[0]);
    NSString *params = getNSStringFromFREObject(argv[1]);
    [[KKParseAnalyticsController sharedController] trackEvent:eventName parameters:params];
    return NULL;
}


//Extention
void ParseAnalyticsAneExtensionInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet)
{
    NSLog(@"Initialize the extension of Parse analytics ANE");
    
    *extDataToSet = NULL;
    *ctxInitializerToSet = &ParseAnalyticsAneContextInitializer;
    *ctxFinalizerToSet = &ParseAnalyticsAneContextFinalizer;
}

void ParseAnalyticsAneExtensionFinalizer(FREContext ctx)
{
    NSLog(@"Finalize the extension of Parse analytics ANE");
}

//Context
void ParseAnalyticsAneContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet)
{
    NSLog(@"Initialize the context of Parse analytics ANE");
    
    *numFunctionsToTest = 2;
    
    FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * *numFunctionsToTest);
    
    int funcIndex = 0;
    
    func[funcIndex].name = (const uint8_t*) "setUp";
    func[funcIndex].functionData = NULL;
    func[funcIndex].function = &ParseAnalyticsAneSetUp;
    funcIndex++;
    
    func[funcIndex].name = (const uint8_t*) "trackEvent";
    func[funcIndex].functionData = NULL;
    func[funcIndex].function = &ParseAnalyticsAneTrackEvent;
    funcIndex++;
    
    *functionsToSet = func;
}

void ParseAnalyticsAneContextFinalizer(FREContext ctx)
{
    NSLog(@"Finalize the context of Parse analytics ANE");
}

あとは、このStatic LibraryにParseAnalyticsANEiOSMissingSymbolsというファイルがあるのですが、これはテストでiOSのAIRのパッケージ化している最中にエラーが出たために新規作成して追加したファイルです。

詳しくはstackoverflowをみてください。

エラー内容はFBやTwitterのSDK(?)が必要というものなんですが、今回はそれらは使わないので、ダミーのクラスや文字列を定義してあげてエラーを出さないというふうにしています。今回一番ハマったところはここです。すごく時間をとられました、、。

とにかく、これでネイティブの.aファイルは完成しました。

次回はAS側を作ります。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る