iOS 7 の JavaScriptCore で jQuery とかを動かしてみる

2013.10.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

JavaScriptCore で JavaScript との連携方法は確認できました。実際に使う場合には外部のライブラリも使いたいこともあるはずなので、どこまで動作可能なのか試してみましえた。

jQuery は動くか

まずは大御所です。確認してみます。

[C] // JSContextオブジェクトを作成 JSContext *context = [[JSContext alloc] init];

// jQuery を NSString として読み込み NSError *error = nil; NSString *filePath = [[NSBundle mainBundle] pathForResource:@"jquery-2.0.3.min" ofType:@"js"]; NSString *jq = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];

// JavaScriptを評価 [context evaluateScript:jq]; JSValue *result = [context evaluateScript:@"$.now()"];

NSLog(@"%@", result); [/C]

そっかー、動きません。
やっぱりアレが無いんでしょ。アレが。DOM とかそいいう世界の人じゃないし。

では何を持っていて何を持っていないんでしょうか。

[C] JSContext *context = [[JSContext alloc]init]; JSValue *result; result = [context evaluateScript:@"window"]; NSLog(@"window = %@", result); result = [context evaluateScript:@"XMLHttpRequest"]; NSLog(@"XMLHttpRequest = %@", result); result = [context evaluateScript:@"var all=''; for(var s in this){all += s + ','} all;"]; NSLog(@"this = %@", result); result = [context evaluateScript:@"Array"]; NSLog(@"Array = %@", result); [/C]

結果
window = undefined
XMLHttpRequest = undefined
this = all,s,
Array = function Array() {[native code]}
new Date() = Sun Oct 06 2013 21:03:42 GMT+0900 (JST)

ですよねー。window オブエジェクトが無いのか。表示するところが無いからね。
で、XMLHttpRequestオブジェクトも組み込まれていない、通信もできないのか。ではグローバルなコンテキストには何があるのか?何も無かった‥自分で宣言した変数しか居ません。
ArrayやDate等の基本的な組み込みオブジェクトだけは持っていました。それなら‥

underscore.js は動くか

これならどうだ。

[C] // JSContextオブジェクトを作成 JSContext *context = [[JSContext alloc] init];

// underscore.js を NSString として読み込み NSError *error = nil; NSString *filePath = [[NSBundle mainBundle] pathForResource:@"underscore-min" ofType:@"js"]; NSString *us = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];

// JavaScriptを評価 [context evaluateScript:us]; JSValue *result = [context evaluateScript:@"_.isString(3);"];

NSLog(@"%@", result); [/C]

結果
false '3' を引数に渡したら true になりました。

だよね、こいつは動くよな。

まとめ

JavaScriptCore ではArrayなどの基本的な組み込みオブジェクトしか提供されていないため、DOMや通信を扱うライブラリは動作しません。 やはり動的にスクリプトを実行できる。という特性を活かして何かするということなのかなと思いました。

今回のソース:https://github.com/fukasawa-takeshi/ios-js