« 一人乗りヘリコプター | Main | [iCalMobile] 携帯iCalビューアーiアプリαリリース »

携帯iアプリ開発ではまったところ

ひさびさにNTTDoCoMo向けiアプリをつくってました。
もうすぐα版出そうと思うので、はまったところのノウハウ紹介。

JavaSDKは、最新版ではだめ
「サポートされていないエンコーディングです: SJIS_i」
とかってエラーが出ます。
j2sdk-1_4_2_12-windows-i586-p.exe
これで開発できてます。

一番はまったのが、iαppliTool for DoJa-4.0(FOMA) って
携帯電話のJava環境の、PC上で動くエミュレータでは問題無く動くのに、
携帯にダウンロードして動かすと、
「αエラーが発生しました」
ってエラーが出て落ちる時がありました。。

開発環境と実機で動きが違う故のバグって、
実機では落ちる時の情報も取れないので厄介なもの。

現象は、ネットにつなごうとするときに落ちる。
地道に切り分けていきます。。

結局、原因はサーバの返すHTTPヘッダの「Content-Length」が間違っていたこと。
iアプリは携帯からアクセスできるサーバが、
そのiアプリをダウンロードしたサーバに限定されるので、
サーバ側も自分で開発していたのですが、それがバグってた。。

ご参考までにiアプリ側のJavaコードはこんな感じ

try {
 String param = com.nttdocomo.net.URLEncoder.encode( param_unencoded );
 String url = url_base+param;
 HttpConnection conn = (HttpConnection)Connector.open(url,Connector.READ);
 conn.setRequestMethod(HttpConnection.GET);
 conn.connect();
 if(conn.getResponseCode() == HttpConnection.HTTP_OK){
  InputStream in = conn.openInputStream();
  InputStreamReader isr = new InputStreamReader(in);

  int contentLength = (int)conn.getLength();
  char[] data = new char[contentLength];
  isr.read( data, 0, contentLength );
  ret = new String(data);
  // retを使ってごにょごにょ

PC上のエミュレータでは、誤ったContent-Lengthでも動いちゃってたものが、
携帯実機上では許されなかった、と。

よく考えると、ネットワーク関連の機能って、
PC上のエミュレータと携帯とでは実装が異なるはずです。
エミュレータはPCのネットワークを使ってるし、携帯は自力でDoCoMoのネットワークにつなげる。
ネットワーク関連は全部HttpConnectionってクラスに抽象化されてるのですが、
そこの設計がしょぼいのかもしれませんね。

入出力系、注意。

TrackBack

このエントリーのTrackBackURL:
http://slightlyblue.com/cgi/mt/mt-tb.cgi/672

コメントを投稿

同カテゴリ[DEVELOP]のエントリー

最近のコメント

最近のトラックバック