一人もくもく会 α verでサービス開始しました。

cocos2d-jsでObjective-Cからjavascriptを呼び出す

cocos2d-jsで、javascriptからObjective-Cメソッドを呼び出す方法は
マニュアルにも有りAndroidとほとんど同じなので特に問題なかった。
しかし、Android側のマニュアルでは最後に逆の方法も書かれていたのだが
iOSのマニュアルの方にはなぜか何も書かれていなかった。

さらに検索してみても全く情報が見つからない。
誰もiPhoneアプリの作成のためにcocos2d-jsを使っていないのか、
それとも当たり前すぎて記事にするほどのことでもないのか…。

一応可能になったのでメモ。
ただし、この記事を書いた時点では色々テスト中で、
且つAndroidの時にはrunOnGLThreadしなくてはならなかったが
今回良くわかっていないためそういうことはしていないので、
場合によっては不具合が発生する可能性もまだありそうなので注意。

(2015/5/3 code < 256をcode < 128に修正)

#import "ScriptingCore.h"


// strにjavascriptのコードを指定
- (void)JsObjCBridge:(NSString *)str {
    const char *charstr = [str UTF8String];
    ScriptingCore::getInstance()->evalString(charstr, NULL);
}

// コードに全角jsonが含まれる場合、予めこのメソッドでユニコードエスケープしておかないと
// 文字化けする
// Javascript側でJSON.parse。
- (NSString *)convertToUnicode:(NSString *)original {
    NSMutableString *str = [NSMutableString string];

    for (NSUInteger i = 0; i &lt; original.length; i++) {
        unichar code = [original characterAtIndex:i];
        if (code < 128) {
            NSString *one = [original substringWithRange:NSMakeRange(i, 1)];
            [str appendString:one];
        } else {
            [str appendFormat:@"\\u%04x", code];
        }
    }
    
    return str;
}

要は
ScriptingCore::getInstance()->evalString
すれば良い。

Androidを参考にすると、
frameworks/js-bindings/bindings/manual/platform/ios
にJavaScriptObjCBridge.mmというのがあったのでこれを使うと思ったのだが、
使い方もどこにも載っていないし何が何だかよく分からなかった。

frameworks/js-bindings/bindings/manual/platform/android
の中身を見るとこっちの方はjavaから呼び出される関数である
Java_org_cocos2dx_lib_Cocos2dxJavascriptJavaBridge_evalString
の記述があり、この中でこのevalStringを使っていたのでこれを真似しただけ。

強制終了してもいやだし何か正しい情報がほしいところ。