2012年1月12日木曜日

iOSシミュレーターの限界

iOSシミュレーターはiOSアプリ開発に欠かせないものではあるが、
残念ながら、実機の全てを正確にシミュレート出来るわけではない。

以下の項目はiOSシミュレーターでは解らない。

・シミュレーター上ではメモリリークは発生してない(検出されない)のに、実機だと発生する。
実機をつないでProfileのLeakをするとそうなることがある。
シミュレーター(86)と実機(ARM)でライブラリの出来が違うのだろうか?
当然実機で直すのが筋なのではあるが、全く原因がわからない物も多くて、小規模な物なら放置しているのが現状。


・固有デバイスの動作
カメラ、ジャイロ、デバイスモーションなど。
GPSは「デバッグ~位置」から仮想的にデータを与えることは出来るが、
やはり実機で確認した方が良い。
BluetoothはOK、AirPrintもシミュレーターで印刷出来る。

・実速度
特にグラフィック周りの速度差が大きい。
実機でも、iPad2とiPod touch4は差が大きい(グラフィック割りのハードの差がはっきり出る)。

・メモリ容量
シミュレーター上は事実上無制限なので、その上で動いたからといって、実機で動くとは限らない。メモリもしくはUI要素をたくさん使うアプリでは特に注意。

・画面回転の中間状態(unknown)と上下向き(Faceup/down)
実機では正立と逆が一瞬で切り替わることがあるが、シミュレーターではそれが出来ない。

・電池残量
それに関わるNotificationも同様。

・メール実送信
Xcode3まではメーラーそのものも立ち上がらなかった。
Xcode4では立ち上がるが、実送信はされない。
FrontierMailでは送信出来る。

・imageの透過状態
実機では256色でしか透過しないが、シミュレーター上はフルカラーでも透過する。
これは単なるシミュレーターのバグだと思う。
iOS4/5/6用全てで発生する。

・3本以上指のマルチタッチ
ダブルまではシミュレーター上でもピンチ/スライドともに可能。

・スリープ
連続稼働させる必要があるアプリではこの確認が必須。
(自作の物では、ZeroRec/Komadori/ChariRecoがこれに当たる)

・CPU固有の挙動
シミュレーターは86のコードでコンパイルされ、実機はARMでコンパイルされる。
この違いは、メモリアクセスへの制約の違いとして現れる。
大雑把に言えば、86はメモリアクセスに対して制約がないが、ARMは
アクセスサイズとバイト境界の関係に制約があり、違えるとトラップを発生して落ちる。
ワークエリアに対しバイトではないサイズでデータを読み書きするプログラムは、
シミュレーター上では動作しても実機では動かないことがある。
X−BASIC for iOSではこれで大いに苦労した。

とにかくシミュレーターと実機は似て非なる物なので、アプリは必ず実機での動作確認が必要である。

特にメモリ容量の違いは大きい。シミュレーター上では動くのに実機では起動すら出来ないアプリはほぼ間違いなく「絶対に実機での動作確認をしてない」と思われる。有名どころでも多々存在する。

気をつけよう。

0 件のコメント:

コメントを投稿