Murga

個人的に言いたいコト・主張・気持ち。

Apache Cordova もしくはハイブリッドアプリの限界

Apache Cordova というフレームワークがある。別名 PhoneGap と呼ばれるこのフレームワークを使えば、HTML・CSS・JavaScript で構築したアプリを、iOS・Android 向けのネイティブアプリのようにビルドして配信できる。クロスプラットフォームに対応した、いわゆる「ハイブリッドアプリ」を構築するためのフレームワークだ。似たようなフレームワークに Electron や React Native などが存在するが、その構造はそれぞれで異なる。

ここしばらく、この Cordova というフレームワークを使う案件にいたので色々いじっていたのだが、とうとうその限界というか、現状どうしても拭えない難点を認めざるを得ないな、と思い、今日の記事を書くことにした。

Cordova は OS の差異を埋める緩衝層

Cordova の仕組みは、HTML・CSS・JS でコーディングした Web アプリケーションを、それぞれの OS で用意されているネイティブコンポーネントを利用して表示するネイティブアプリとしてビルドすることで成り立っている。平たく言えば、Cordova が提供するのは「専用のブラウザ」といえる。iOS の場合は UIWebView ないしは WKWebView を使って、コーディングした Web ページを開いて見せているのだ。同様に Android や、WindowsPhone など他の OS に対しても、それぞれの OS 向けにページを表示して見せている、という仕組みだ。

各 OS のネイティブコンポーネントを使ってコーディングするとなると、Android は Java や Kotlin、iOS は Objective-C や Swift を使うことになり、クロスプラットフォーム対応をするとなると、別々の言語で2倍の実装が必要になる。しかし Cordova なら、中身は Web ページ、ブラウザベースで動作する Web アプリケーションとして実装し、アプリとしてはただその HTML ファイルを表示しているだけなので、クロスプラットフォーム対応が容易になる。

これこそが Cordova の特徴であり、強みだ。「Web アプリケーションを作っていた人なら、そのスキルを生かして iOS アプリも Android アプリも作れますよー」というワケだ。

緩衝層によって損なわれるスピード感

しかし、そうはいっても、iOS も Android も、それぞれ独自にバージョンアップを重ねている。Cordova および Cordova プラグインの内部的には、結局は各 OS 向けに同等の機能を提供するネイティブコードが隠れているのであり、それを自前で実装しているか、Cordova の開発コミュニティに委ねているか、の違いでしかない。

Cordova の開発コミュニティは大きく、それなりにさかんにメンテナンスがなされてはいるものの、最近リリースされた iOS12 には対応しきれていなかったり、問題は多い。

開発言語は Web の標準技術に統一できるし、クロスプラットフォーム対応も容易にはなるが、OS アップデート時のマイグレーションのスピードは、どうしてもネイティブ言語で実装した時に比べて遅れてしまう。Cordova の利用者にとっては、OS がリリースされてから、Cordova が頑張って追随してくれるアップデートを待たないといけないからだ。ネイティブであれば、OS のリリース内容を見て、すぐさまプロダクトを改修して、バージョンアップに追随できるワケで、そのスピード感の違いは明らかだろう。

オープンソースコミュニティの集合知を軽視するワケではないが、OS のバージョンアップによってガラッと仕様が変わってしまったりした時に、自分たちが作ったアプリを速く直せるのは、やはりネイティブ言語で実装した場合だと思う。iOS のバージョンアップは毎年あるし、API の破壊的な仕様変更も多いので、すぐさまマイグレーション対応しなくてはならない。ただ Cordova のアップデートを待つだけでは遅いのだ。

「クロスプラットフォーム対応、要らなくなりました」

これまで自分が担当していた業務で Cordova を利用していたのは、業務で使用するスマホ端末が iOS・Android と混在していたためだった。しかしこのたび、全社的なスマホ端末の仕入れ方が変わり、安価に iPad が手に入れられるようになったことで、Android 端末向けのアプリ提供が不要になった。

こうなると、クロスプラットフォーム対応をウリにしていた Cordova の強みが一つ欠けることになる。「もう iOS アプリだけ作れればいいよ」と。さらに iOS のアップデートに対する Corodva の追随速度がネックになり、「だったら自分たちで Swift 書いた方が速くない?」となってきたのだ。

この流れは当然というか、反論の余地がない。Airbnb が React Native を止めたのも、クロスプラットフォーム対応のためのコストが思ったよりもかかりすぎることが原因だったし、やはり完全なネイティブアプリと比べてパフォーマンス面も劣ってしまう。

結局はそのプラットフォームに合わせたネイティブ言語でスクラッチ開発する方が、速くて自由度も高いよね。

という、身も蓋もないが揺るぎない事実によって、Cordova は敗北してしまったのだ。

それでも Cordova が向いていそうなところ

OS は毎年のように大きく変更があり、それに追随しないとアプリが動かなくなる。それに会社の経営しても、迅速にアプリを開発し、素早くリリースを繰り返すことで、ユーザエクスペリエンスを高めて企業価値を上げていきたい思いがある。

現実的に必要に迫られているところと、企業の目標を達成するには、やっぱりネイティブ言語で開発するのが手っ取り早いことだろう。

それでも Cordova を使うことでメリットがある場所としたら、なんだろう、ということを考えていた。PWA もかなり実用に耐えうるところまで来たけど、あえて今ココで Cordova を使ったハイブリッドアプリの生きる道ってなんだろう?と。

僕は今のところ、コレといって Cordova を使うメリットがありそうな機会が思いつかなかった。

  • スマホ本体の機能 (カメラや Bluetooth) を使ったアプリを作りやすい?
    • PWA でもそれなりに出来る
    • 小さい機能ごとにアプリを作り分けるような開発スタイルであれば、ネイティブで実装した方が早いかもしれない
  • 既存の業務 Web アプリをスマホにも対応させやすい?
    • いや最初からブラウザで開けば良くね…?アプリ化しなくても良いのでは…
  • スピード感が要らない業務アプリで、色々なプラットフォームに対応しないと行けない時は楽になる?
    • クロスプラットフォーム対応が求められるものの、継続的に素早い開発を求められない場合は、オープンソースコミュニティにメンテナンスを任せられるメリットはあるものの、コレがいつまでも円滑に続くかというと誰も保証してくれない

なんというか、どうしても世の中のスピード感に対して置いてきぼりになる感じがある。

  • スピード感重視ならネイティブ言語で実装しよう!
  • Web の標準技術でなんとかしたいなら PWA で十分じゃね?

というところに、ハイブリッドアプリという選択肢がこれから掲げられる強みってなんだろう。

HTML5とApache Cordovaで始めるハイブリッドアプリ開発 (CodeZine BOOKS)

HTML5とApache Cordovaで始めるハイブリッドアプリ開発 (CodeZine BOOKS)

あの実行してはいけない Linux コマンドは「Fork 爆弾」っていうのか…

実行してはいけない Linux コマンド、「危険シェル芸」として、次のようなコマンドが有名になった。

# 実行厳禁!
$ :(){:|:&};:

コレは「再帰的に自システムを呼び出す」ことでマシンを落とす挙動をするのだが、コレに「Fork 爆弾」という名前が付いていることを初めて知った。

ちなみに Windows コマンドプロンプトでは以下のようなコマンドで、Fork 爆弾が実現できる。

Rem 実行厳禁!
> for /l %a in (0,0,0) do start

Linuxコマンドブック ビギナーズ 第4版 (コマンドブックシリーズ)

Linuxコマンドブック ビギナーズ 第4版 (コマンドブックシリーズ)