iPhoneアプリとデータベースサーバの連携
データベース・スキーマとアクセスの準備
今回は早速iPhoneを使った業務アプリケーションのサンプルを紹介します。
サーバー側の準備として、MySQLとPHPを使ったプログラムを作成しました。クライアントはもちろんiPhoneです。 サーバー側のアプリケーションとiPhone向けのプロジェクトはこちらからダウンロードしてください。 まずはサーバー側について説明しましょう。
この種のクライアント/サーバー系のシステムは、どこまでをサーバーにさせるのかという設計が考えどころです。 結果的にはその現場で使えるOSやミドルウエアに応じておおむね動作方法は決まってしまうものです。 iPhoneが端末であるということが決定した段階で言えることは、MySQLやOracle、SQL Serverといったネットワーク・データベースヘの ドライバ関連のものが組み込まれていないということです。
SQLiteが組み込まれ、iPhone OS 3.0からデータベースの利用をオブジェクト指向で行える「Core Data」もあるのですが、 ネットワーク・データベースのアクセスはハードルが高いものになります。
そこで、サーバー側にプログラムを仕掛けて、そのプログラムにデータベース処理をさせます。そのプログラムはWebサーバーを経由して利用できるようにします。 iPhone側からは、GETやPOSTのメソッドでHTTP/HTTPSを経由してサーバー側のプログラムにアクセスします。
サーバー側のプログラムは、一般的なWebアプリケーションを作成する場合と同様です。GET/POSTで受け取ったパラメータに応じて、結果を返します。 ただし、作成するのはHTMLによるWebページではなく、データベースから取り出したデータを元に作成したXMLです。
サンプルプログラムの動作は、Mac OS X Server v10.6.3で稼働するMySQL 5.0.88とPHP 5.3.1で確認しました。 MySQLとPHPやApacheのインストール等については本稿では省略します。もちろん、Mac OS X Serverに限らず動作は可能です。
Unicodeでアプリケーションを作る
データベース内のデータのエンコード、そしてPHPのプログラム、いずれもUTF-8とします。 とりわけWindowsをクライアントとして使っている開発者はShift-JIS/EUCでの開発をいまでも普通に行っているかもしれませんが、 iPhoneを相手に考える場合には必ずUnicodeにするのが原則です。
もし、開発ツールやエディタがUTF-8に対応していないのであれば、すぐに対応しているものに切り替えましょう。 Unicode対応したときのポイントは、「\」(円記号やバック・スラッシュ。0x5C)と「¥」(円記号。0xA5)をきちんと区別していて、 開発者もきちんとそれを把握するということ です。
Unicode対応はどっちでもいいじゃないかと思われる方も多いかもしれません。しかしながら、iPhoneでインプット・メソッドを使って漢字入力をしてみてください。 例えば、「おざき」を変換すると、「尾崎」「小崎」はもちろん、新JISで追加された「尾ざき(Unicode:2550E)」の文字も登場します。 つまりShift-JISやEUCには含まれていないような文字で、しかもサロゲートペアの文字でもあります。
いずれにしても、Shift-JISで扱えない文字列が入力される機会は増えています。MacやWindowsだと、 インプット・メソッドで警告が表示されるのでユーザーに避けてもらうことも可能かもしれませんが、iPhoneではもはやそういう区別はありません。
もっとも、パソコンでもすべてのユーザーにそうしたスキルを求めることでは運用ノウハウが増えることになります。 クライアントがすっかりUnicode 化している現在、バックエンドのアプリケーションもUnicode対応が基本となります。
まずはデータベース側の準備を行いましょう。ダウンロードしたファイルの中にある「sample_schema.txt」を参照してください。 このスキーマ・ファイルで、サンプル・アプリケーションを稼働させるためのスキーマおよびダミーデータが含まれています。 ファイルの冒頭にあるように、mysqlコマンドで読み込めばOKです。
このコマンド例では、rootのパスワードをプロンプトでたずねられるので、正しいパスワードをキータイプします。 Mac OS X Serverでの検証時はmy.cnfファイルは一切変更しないで単にrootのパスワードを設定して起動した状態で読み込ませています。 スキーマファイルの冒頭にMySQLのユーザー登録があります。
もし、ほかの用途で使っているユーザーでこの名前のものがある場合にはここでエラーが出ます。 その場合は、ユーザー名をwebではなく、何か別のものに して、PHPのプログラムも該当個所を直せばいいでしょう。 また、スキーマを再度読み込ませる場合はこのユーザー定義部分はコメントすればいいでしょう。