Objective-CでWebAppの開発に必要なN個のこと

PerlでWebAppの開発に必要なN個のこと - Islands in the byte streamObjective-C版です。

Objective-CでWebAppを開発する方法として以下の方法があります

iOSアプリやMacアプリにウェブサーバーモジュールを埋め込む

CocoaHTTPServerやGCDWebServerなんかがよく使われます。

「アプリの中にウェブサーバーなんか立ててなんの役にたつんだ?」と受けとってしまう方もいるかもしれませんが、iOSの場合主にアプリから外部のウェブブラウザ向け(デスクトップなど)にインターフェイスを提供する為に使用されています。

しかしこの方法は一般的にWebAppやウェブサービスと聞いて想像するものとは違います。一個のユーザー端末の中の1プロセスで動作するだけですので一般公開ももちろんできません。

PaaS / Objective Cloud を使う

http://objective-cloud.com/

Objective Cloud は Objective-Cでウェブアプリケーション開発しホストする為のプラットフォームです。

現在招待制で運営されており、申し込みが必要となっています。

無料プランはありませんが14日のフリートライアルが提供されています。

以下に開発の流れが解説されています

https://github.com/Objective-Cloud/docs/wiki/Tutorial

またObjective Cloud のウェブサーバー実装であるOCFWebServer(GCDWebServerのフォーク)とアプリケーションフレームワークのOFCWebのソースコードがnew BSDライセンス/MITライセンスで公開されています。

Objective Cloud はずいぶん意欲的な試みですが、ユーザー規模、開発速度、サーバー資源のコスト、などの要因なのか(推測です)事業立ち上げに苦労しているようにも見えます。

現在は有料プランのみですが将来的に無料制限枠などが提供されれば使いやすくなるのかもしれませんが、そこまで普及するまでにはユーザーからみたらやイグジット→サービスシャットダウンのリスクもあります(舌打ち)。

まあソースが公開されているから自分でなんとかできることはできるのでしょうがサーバーに必ずMac機が必要になります。そこまでしてなぜObjective-Cか? と哲学的な自問におちいるでしょう。

じゃあ本当にObjective-CでWebAppを開発するのは無理なのでしょうか?

GNUstepWeb + GNUstep

http://wiki.gnustep.org/index.php/GNUstepWeb

GNUstep は自由なソフトウェアとして開発されているクラスプラットフォームなCocoaデスクトップ環境の実装です*1

GNUstepWebはその開発環境の拡張として提供されているウェブアプリケーションフレームワークです。

Apacheサーバーで動かすこともできるそうです

NeXTが開発していたWebObjectsがアップル買収後にJavaブリッジに書き直されてしまってNeXTオタ発狂→有志が真のオレオレWebObjectsを実装しはじめる…… という歴史的経緯があるようです(僕は当時を体験していないので正確なことは各自うちでおとうさんに教えてもらってください)

関係ないけどホリエモンが以前書いてたこの話が好きです

Objective Cといえば私は苦い思い出しかないなあ。1997年のお正月、博報堂さんから受託した仕事「電子年賀状」のサーバ環境の構築はなぜかNeXTSTEP指定だった。意味が分からん。しかもWebObjectsとかいう、NeXTのウェブアプリケーション環境で開発せねばならない。WebScriptとかいう訳の分からないスクリプト言語と、書いたこともないObjective C。しかもなぜかデータベースソフトの指定まであった。サイベースなんか使ったことねーよ。

iPhoneのアプリはObjective Cで書かれている事が実は重要なんじゃないかという仮説|堀江貴文オフィシャルブログ「六本木で働いていた元社長のアメブロ」

やってみよう

僕が使っているDebian GNU/Linux Wheezy の環境だとこんな感じで開発します。LLVM ClangでもObjective-CコードはコンパイルできますがGNUstepgccでしか使えなかったのでgcc 4.7.2を使いました。

sudo aptitude install gnustep-devel gnustep-make

DBを使いたい場合GDL2というライブラリもインストールします。PostgreSQL,SQLiteのみ対応しています。

wget ftp://ftp.gnustep.org/pub/gnustep/libs/gnustep-dl2-0.12.0.tar.gz
tar zxfv gnustep-dl2-0.12.0.tar.gz
cd  gnustep-dl2-0.12.0
./configure
make && make install

そしてGNUstepWebを入れます

svn co http://svn.gna.org/svn/gnustep/libs/gsweb/trunk gsweb
cd gsweb
make
sudo make install

ここまで実行するとGNUstepとGNUstepWebで開発できる環境が整います。さらっと書いたけどここに来るまでに結構わんさかハマりポイントもありました(個別環境による)。

ウェブアプリを作ってみましょう。@secboffin("Test-driven IOS Development" の著者)の雛形から動かなかった部分を修正しました。

git clone https://github.com/laiso/HelloGSW.git
cd HelloGSW
GNUSTEP_MAKEFILES=/usr/share/GNUstep/Makefiles make

ビルドに成功すると HelloGSW.gswa というディレクトリができます、これがウェブサーバーも含んでいるので以下で実行します。

./HelloGSW.gswa/HelloGSW


2013-09-10 22:07:15.794 HelloGSW[17928] Thread XX Waiting for connections on localhost:9001.
2013-09-10 22:07:15.794 HelloGSW[17928] Application running. To use direct connect enter
http://localhost:9001/WebObjects/HelloGSW.woa/0/
in your web Browser.

デフォルトでlocalhost:9001番ポートで待ち受けます。変えたい場合は Resources/Info-HelloGSW.plist を編集して再度ビルドしてください。

ブラウザからアクセスし上記のような画面が出たら成功です。

まとめ

Objective-CでWebAppの開発には、被虐的な人格が必要となります。

おまけ

パッケージマネージャ
gem+bundler的なCocoaPodsデファクトになりました。VendorKitも同時期にリリースされましたがCP作者が社交的で友達が多かったので登録ライブラリ数などでドンドン差がついていった(かなしい)。*envとか*brewみたいなものはちょっとニュアンスが違うけどXcode.appを複数入れてxcode-selectでパスを切り替える。
アプリケーションサーバ
iOS/OS X自体にあたる
リクエストパラメーターの処理-ルーティング
あたるものがない。しいていうとiOSのカスタムURLスキーマを使ったマッピングが近い。JLRoutesThree20というフレームワークの中にあった (Nimbusにはない)。
データベース
アプリケーションによるがユーザーがコンテンツ作成するツールFMDB(SQLite3 C APIのラッパー)やCore Data(SQLite3,ORM)。MagicalRecord(CoreDataのラッパー、ユーティリティ)。サーバーサイドのWeb APIに対して読み書きする。MBaaSを使うなどの選択肢がある。
ビューのレンダリング
StoryboardなどのGUIデザイナ(IB)を使う派とコードでベタ書く使わない派がいて。あとはWebView内でHTML+CSSを使うケースもある。ウェブアプリっぽい方法としてはGRMustacheなどのテンプレートエンジンにコンテキストをJSONKitシリアライズしてWebViewにレンダリングさせる。
テストフレームワーク
今はSenTestingKit >= Kiwi >= GHUnit ぐらいの印象(個人の感想です)
アプリケーションフレームワーク
UIKitが全部入りなのであんまり採用されない。Nimbusぐらいしか有名なのない。