non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

iOSでもCordovaプラグインを作ってmrubyを動かした

おはよう長男はこのところ、Amazonプライムで無料で見られるワイルドスピードシリーズにハマって、段ボールでスポーツカーを作っています。kjunichiです。

iOSでもやってみた

iOSではmrubyを動かせるアプリ

RubyPico

RubyPico

  • ongaeshi
  • 仕事効率化
  • 無料

があり、実用的に使えるのですが、 Androidで少しCordovaのプラグイン周りが分かってきたので、より理解を深める為に、iOSにチャレンジした。

2年待たずに機種変更が比較的安価で出来るauのサービスにiPhone6S購入時に加入しており、今回iPhone 7 Plusを予約したので、 これが届けば、iPhone 7 Plusで試せたのに残念です。iPhone 6Sで動かしました。

準備

iOSも去年から実機で動かすのに、デベロッパー登録してお金を払わなくてもよくなっている。が、デベロッパー登録自体は必要。 自分は、はるか昔に、年会費の掛からない登録をしていたハズ。

node.jsを自分はnodebrewでバージョン管理して利用している環境なので、sudoは不要。

Xcodeが入っている状態で、cordovaをインストールすれば、あとiOSで必要なパッケージはエラーメッセージで教えてくれるので、 それにしたがってnpm install -g すれば環境は出来るはず。

XcodeiOSの署名

のように進めればできた。

mrubyの組み込み

Androidと異なり、iOSではCordovaの制約(plugin.xmlの記述方法を知らないだけ?)から、libhoge.a形式では、エミュレーターと実機に対応したバイナリを 同時に作成できなかったので、Framework形式にする必要があった。 (のちの作業で、lipoでlib.aに複数のCPUアーキテクチャを詰め込めることを知った。)

(https://cordova.apache.org/docs/ja/latest/plugin_ref/spec.html 見たら、ブラックベリーのタグを使えばよかったのかも)

Framework化は

RakefileにmrubyのAPI「mrb_load_string」を利用可能にするため、

conf.gem :core => "mruby-compiler"

を加えて、githubから最新のmrubyを持ってきて、ビルドした。

さらに、最近のiOSの開発では、Apple純正のライブラリ以外は、<hoge.h>形式で呼ばずに"hoge.h"で呼べというようことなので、 これに従い、

<mruby.h>

などは、

"mruby.h"

と変更した。

はじめてのObjective-C

SwiftでプラグインをつくるCordovaのプラグインも見つけたりしたが、今回は、無難そうなObjective-Cで実装を始めた。

putsとgetsの実装

iOSでは

[self.commandDelegate evalJs:@"alert('Hello,world!')"];

JavaScriptを呼ぶようで、putsはこれで楽勝。

getsの実装もAndroidの実装同様、スレッドを別に作ることで、対処できた。

成果物

0からCordovaのプロジェクト作って、mrubyのプラグインを追加して、動かすまでの動画:

www.youtube.com

まとめ

iOSもアプリの署名の箇所だけ、Xcode使うだけで、Android同様にコマンドラインで操作出来て、 なんとなく安心したw。

iOSでの作業は、Objective-Cで、どうやってグローバル変数を扱えるのか程度で、Androidのように デバッグ文も書かずに作業出来てしまった。

今後の課題

  • Objective-Cのコードをswift化(Cordovaでプラグインが既に用意されており、これを使えば簡単そう)
  • mruby側にOpenCVを組み込んで、AndroidiOS共通な処理をどう実装できるのかやってみる。

参考資料

関連記事