2013年1月25日金曜日

Xcode 4.5でiOS 5.1対応プロジェクトを作る

サマリー:

  • Xcode 4.5で作ったアプリがiOS 5.1上でクラッシュ
  • Deployment TargetをSDK 5.1にしたけどそれでもクラッシュ
  • Autolayoutが原因じゃった
  • 余談:Android開発は辛いよ

■いきなりクラッシュ■

Xcode 4.5移行後に作ったプロジェクトをまだiOS 6でしか動かしていないことに気づき、iOS 5.1 SDKを入れて試したところ、即死しました。iOS 6なら動きます。iOS 6固有の機能なんて何も追加した覚えがないのになーと真っ青になりました。

■原因■

Autolayout機能を使ったことが原因でした。エラーメッセージの中に出てきたNSLayoutConstraintでググって判明しました。いやはや…。



■SDK 5.1の組み込み方■

一応書いておきます。iOS SDK 5.1はXcode 4.4に含まれていますので、
  • developer.apple.comのdownloadsからXcode 4.4をダウンロード
  • xcode_4.4.1_xxxxxxx.dmgをマウントし、Xcode.appを右クリック「パッケージの内容を表示」を選び、 Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKsにあるiPhoneOS5.1.sdkを /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs にコピーします。ディレクトリ深いわ。
  • Xcodeを再起動
これでiOS Deployment Targetとして「5.1」を選べるようになります。ProjectのPROJECTとTARGETSにある「iOS Deployment Target」を5.1にセットしてください。エミュレータで5.1を選べるようになります。


■対策 - Autolayoutを切る■

Storyboardをクリックし、Identity and Typeの「Interface Builder Document」にある「Use Autolayout」のチェックボックスをoffにします。


これで、Xcode 4.5で作ったプロジェクトをiOS 5.1で起動しても落ちなくなります。

なお、MainStoryboard_iPhone.storyboardだけでなくMainStoryboard_iPad.storyboardも直しておくことをお忘れなく(と経験者は語る…)

■Autolayout■

Autolayoutがonだと余計な補助線が出てきてウザいです。これ、Androidの開発ツールにも似たような機能があるんですが…ご安心ください、Androidのはもっとウザいです。縦横比の異なるiPhone5をサポートするにはリキッドレイアウトが一番無難ではあるわけですが…

■余談■

最近気づいて驚いたのですが。Androidってソフトキーボードが出た/引っ込んだを検出するイベントがないのね…。ソフトキーボードが出てくると、真ん中辺に置いたEditTextは自動的に縮むんだけど、移動はしてくれない。移動はプログラマがやらないといけないんだけど、「キーボード出たよ」ってイベントがない。「viewが縮んだ」ってイベントを使って間接的に検知するしかない。間接的だから副作用を避けるためにはいろいろ小細工しなければならない。iOSならこんなにイベントあるのに。


  • UIKeyboardWillChangeFrameNotification
  • UIKeyboardWillHideNotification
  • UIKeyboardDidChangeFrameNotification
  • UIKeyboardDidHideNotification
  • UIKeyboardWillChangeFrameNotification
  • UIKeyboardWillShowNotification
  • UIKeyboardDidChangeFrameNotification
  • UIKeyboardDidShowNotification


Android開発、しんどいです…。優しい上司は「難しければ、iPhone版を先に出して、Android版外注にしようかねぇ」と言ってくださるのですが…社内にiPhoneユーザが少ないので、iPhoneだと十分なテストが出来ないです。困った…。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。