2015年9月3日木曜日

iOSシミュレーターの仕様(Xcode6.4/7.0編)

Xcode6.4/7.0でのiOSシミュレーターの隠れた仕様を列記しておこうと思う。
主に自分の忘備録。

・AudioToolbox.frameworkのAudioServicesPlaySystemSound()はiOS7では音が出ない
iOS8では音が出る。またAVAudioPlayerはiOS7でも大丈夫。
音が出ないから散々調べたらこれだった。

・実機にしかないハードウェア機能は当然使えない
カメラ、モーションなど

・eMailはOK
・AirPrintもOK

・アプリの言語切替は、シミュレーター上の設定〜一般〜言語環境ではなくXcodeのEditScheme〜Application Languageで切り替える
ただしこれで切り替わるのはアプリケーションの言語だけなので、OSの設定の言語は元のまま。なので、SettingBundleでOSの設定に追加している時にその言語別表示を確認するには、OSの言語設定も別途変更する必要がある。

・AVAudioEngine/AVAudioPlayer系でエラーが発生すると、Macの他のアプリからも音が出なくなってしまう
例えばChromeでGyaoを見てて、シミュレーター上でそこでエラーが発生すると、しばらくすると(おそらく先行でバッファリングしていた分の再生が終わると)音が出なくなる。治すには、再度RUNすればいい。

・ProfileでAlloc/LeaksはiOS8でしか動かない
iOS7ではエラーが出てしまう。
AppleはiOS7外しにかかっているのがよくわかる。でも、それを開発者に強要するのはどういうものかと。

・キーボードの設定はHardware〜Keyboardにある

・[UIDevice currentDevice]model]が"iPad Simulator"または"iPhone Simulator"としか返してこない
シミュレートするデバイスを切り替えても一緒。
これを使うなら実機が必須ということ。機種別切り替えが必要なプログラムのデバッグにはシミュレーターが使えないってどういうこと?

・Intervalが非常に短い間隔のNSTimerを発行すると正しい時間にならない。
1/10=0.1 秒くらいなら大丈夫そうだけど、1/1000秒を設定しても(実測で)約0.1秒になっている。iPad2を選択しているとうまく動 くのにiPad RetinaやAirを選んでいるとだめなので、それらだけのバグ。ちなみに、実機ではちゃんと動く。
→その後調べた結果、AppleのNSTimerのドキュメントに「the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds.」とあった。要するに0.05s〜0.1sより大きな数値でないと動作は保証しないということで、それ以下なら動いて御の字と言える。これでは音楽ドライバが作れない!!
→実験の結果、repeat:NOなら1ms(0.001s)単位でもほぼ正確にかかってる。実機、シミュレーターとも。repeat:YESでも30ms位ならほぼ大丈夫だけど極稀にダメみたい。
 X-BASIC'では画面更新とキーリピートが引っかかる。・・・

それはそうと、Xcode6.4/7はブレークポイントがおかしいと思うのだけど。
設定した場所で止まらない。
一見設定した場所で止まっているようで、実はぜんぜん違う場所で止まっていることが多発している。7.1でも直ってない。
このバグのせいでブレーポイントを使ったデバッグがまともにできない状態。
細かくNSLog()を入れて、チェックするしかない。
アップルはもっとデバッグして。

0 件のコメント:

コメントを投稿