先週Facebookがネイティブ化したiOS用のFacebookアプリをリリースした。外観に大きな変化はないが、中身は前バージョンからまったくの別物になった。従来のFacebookアプリはHTML5アプリをiOSアプリのように仕立てたハイブリッド・アプリだった。乱暴に言えばHTML5コードを走らせるFacebook専用ブラウザのようなアプリで、デバイスやプラットフォームを越えた互換性が高く、アプリ自体をアップデートしなくてもサービスの機能追加を反映させられる。Web企業であるFacebookらしいアプリと言える。

しかし、最近は「起動が遅い」「動作がぎこちない」という、ユーザーからの批判的な意見に直面していた。実際Facebookアプリを使っていると、そのぎこちない動作から「Facebookはやはりデスクトップ時代のWeb企業」という印象を抱いてしまうほど。それでは「モバイル重視」の姿勢と矛盾してしまうから、iOSデバイスのAPIをフル活用するネイティブアプリに作り直したのだ。

ネイティブ化で利用体験が格段に向上したiOS用Facebook v5.0

The VergeはFacebook 5.0を「見た目に大きな違いはないが、快適な利用体験を求める数億のユーザーを満足させるだろう」と評価。App Storeのユーザーレビューにはリリースから4日間で27000件以上のレビューが寄せられ、多くのユーザーが速くスムースに動作するようになったことを歓迎している。

一方で、Facebookアプリのネイティブ化はWebにとって好ましい出来事ではないと見る向きも多い。前述のThe Vergeの記事タイトルは「Facebook for iOS goes native, waves goodbye to HTML 5 (iOS用のFacebookがHTML5に別れを告げてネイティブに)」である。Googleに劣らぬHTMLの信奉者であるFacebookがハイブリッドアプリに見切りをつけた影響は大きく、Facebookに続いてHTML5からネイティブアプリにシフトするアプリベンダーが出てくる可能性が高い。それはいくつかのモバイルプラットフォームへの囲い込みが進むことを意味し、HTML5やオープンなWebの未来にとっては暗雲である。

これは進化なのか、それとも退化なのか。iOS版Facebook 5.0のリリースをきっかけに「ネイティブアプリ対HTML5」の議論が再燃している。

最上のiOSアプリ、一部にはHTML5コードも

Facebookは単純にネイティブ・アプリとして作り直したのではない。iOSアプリとして高速かつ滑らかに動作するように工夫を凝らしている。

例えば、iOSではメインのスレッドがUIを動かしてタッチ・イベントを処理するため、メインスレッドに作業を割り込ませるとアプリの動作が緩慢になったように感じられる。そこでネットワーク・アクティビティやJSONパーシング、NSManagedObjectの作成、ディスクへの保存など、処理に負担のかかる作業をバックグラウンドに割り当てて操作感への影響を軽減した。またテキストレンダリングにCore Textを用いているが、レイアウト処理がパフォーマンスのボトルネックになり得る。Facebookアプリは新しいコンテンツをダウンロードしたら全てのstringのサイズを非同期的に計算し、CTFramesettersをキャッシュして、後でUITableViewでコンテンツを表示する際にそれらを使用する。またstiringを分析する際にコンテンツの高さを算出し、コンテンツのオブジェクトから高さのデータを分離して、先に高さのみをフェッチできるようにした。残りのコンテンツデータは後からフェッチする。これによりコンテンツ数が多くなってもUITableViewがすばやくスクロールバーの長さを決定でき、スタート時のレイアウトのもたつきが解消される。

ネイティブアプリのデメリット対策も行っている。iOS版アプリがサービスの進化の足かせになったり、逆にFacebookの進化からiOS版が取り残されないように、"fallback"レンダラという仕組みを用意した。ニュースフィードに新しいタイプのコンテンツが追加され、それをアプリが検出したら、fallbackレンダラがアプリに必要な情報を抜き出し、適切なフォーマットで表示することで、次のアプリのアップデートまでのつなぎとする。さらにアプリの内部で頻繁な変更が予想される部分については、引き続きHTML5コードを用いて、アプリを新版にアップデートしなくても対応できるようにしている。

デバイスの能力を引き出すのはネイティブ、しかし…

iOS用のFacebookアプリは「Three20」というオープンソースフレームワークから始まった。iOSがiPhone OSと呼ばれていた時代に、Three20はiOSがサポートしていなかったコンポーネンツを開発者に提供する貴重な存在だった。しかし、iOSの進化と共にThree20は当初の役割を終え、今ではそのデメリットばかりが目立つようになっている。

MG Siegler氏が立ち上げたBranchで、Ketan Anjaria氏は「同じハードウエアでScriptがバイナリのような速さで実行されることはない」と断言している。GoogleのTim Bray氏は「現在のところ、本当に最速のユーザー体験を提供したければ、Android用とiOS用の2つのアプリを書かなければならない。さらにWindows Phoneが台頭しようとしているが、(同じアプリのコードを)3つも書くのを許容できるのか。それは経済的な問題である」「FacebookにとってHTML5が"十分ではない"という事実は、他の多くのケースにも当てはまるものではない」「HTML5もより良く、そして高速になっているが、優秀なエンジニアが全力で取り組んでいるiOSとAndroidの進化は目覚ましい」「AndoridとiOSはブラウザベースの環境に比べて優れたプログラミングモデルとツールを提供している。HTML5の課題を挙げるとすれば、それが急務である」と述べている。

Bray氏の指摘に付け加えると、AndroidやiOSだけではなく、モバイルデバイス自体の目覚ましい進化の影響も大きい。今日のモバイルデバイスはひと昔前のパソコンのような性能や機能を備える。その能力を余すところなく引き出せるのはネイティブアプリであり、リソースが足りるならiOSアプリとAndroidアプリを用意するのがパフォーマンスのためには望ましい。だからといってHTML5のメリットが色あせたわけではない。

HTML5とネイティブアプリはオープンとクローズという位置付けの議論になりがちだが、これらを敵対的な枠に当てはめると失うものは大きい。それぞれのメリットを上手く融合させてこそ最上のソリューションになるのではないか……Facebookは「ネイティブアプリ対HTML5」の議論を、これまでとは違う方向に導こうとしている。その変化はすでにBranchでの議論に現れている。

iOS版Facebookアプリのネイティブ化は、決して「HTML5に別れを告げる」ものではない。iOS、Android、Windows Phone、それぞれの個性を引き出しながら、ユーザーを戸惑わせない一貫した操作性を提供し、Webサービスとしての進化も緩めない。そんな新たな目標に向けた第一歩である。