こんにちは、プログラマのLFです。

今対応している案件で古いXcodeからXcode6に乗り替えたときに
いろいろ不具合が生じたのでメモ程度ですが 
備忘録代わりに記事にしておきます。

1. info.plistにCFBundleShortVersionString Keyの設定が記載されていない

「ArchiveしたプロジェクトをOrganizerでSubmitすると
The Info.plist in the package must contain the CFBundleShortVersionString key
というエラーが表示されて先に進めない」
と先方から指摘されて気づいたのですが
エラーに記載されている通りCFBundleShortVersionString keyの設定がされていませんでした。
正直この設定がいつから必要になったのかなどわからないのですが
ググったら「CFBundleVersion Keyと同じ値にすればよい」とあったので
そのように対応したらsubmitできるようになりました。
(申請は先方に行っていただくので途中でキャンセルしたけどたぶん大丈夫、なはず)


2. Xcode6ではipaファイルの書き出し時にもAppleIDとPWを求められる

これ、かなり面倒な仕様変更ですね。
Ad Hocのipaファイルを作成して先方に確認してもらおうとしても
プロビジョビングファイルに紐づいたAppleIDとPWを求められます。
ひとまずコマンドラインでipaファイルを作成することはできますが
毎度これをやるのは面倒ですね。
先方にAppleIDとPWを教えていただくのが一番スマートな対応でしょうか。
なかなか難しそうですが…。

参考サイト:
[Xcode 6] クライアントのプロビジョニングファイルでipaファイルをエクスポート

3. iOS7.1より前のデバイスにアプリをインストールするとアイコンが白紙になる

これはXcode6の問題というわけではないのかもしれませんが
iOS7.1より前のデバイスにアプリをインストールするとアイコンが白紙になりました。
Xcode5.0.1でImages.xcassetsを作成して
アイコンファイルを設定すれば対応できます。
Xcode5.0.1とXcode5.1で仕様が変わったと聞きました。
Appleさんも細々いろいろ変えてくれますねぇ。

以下、2014/11/06追記

4. ipaファイルをAppStoreにアップする際に
 「The IPA is invalid. It dose not include a Payload directory..」というエラーが発生する

「プロジェクト名-info.plist」の「Application requires iPhone environment」Keyの値を「YES」に変更することで対応できました。

参考サイト:
It does not include a payload directory.


5. AdHoc用のipaファイルが端末にインストールできない旨のエラーが発生する
 (App installation failed. Could not inspect the application package.)

プロジェクト内でグループ名などに「Resources」(大文字小文字関係なく)という名称を使用していた場合、違う名称に変更することで対応できました。

参考サイト:
Xcode: Could not inspect the application package
確認ダイアログ付きチェックボックス(Checkbox)(おまけのところを参照)


以下、2014/11/07追記

6. xibファイルでUIButtonに画像が設定されている場合に
 TypeがSytemに設定されているとxibファイル上では画像が見えているが
 ビルドすると青い背景で塗りつぶされてしまう事象が発生した

UIButtonのTypeをCustomに変更することで対応できました。
手元の環境で調べたところ、
Xcode5以降はUIButtonに画像を設定した時点で
自動的にTypeがCustomに変更されて、
手動でSytemに戻すと青い背景で塗りつぶされてしまい
Storyboard、xibともXcode上で異常に気づくことが可能になっていました。
Xcode4以前のプロジェクトをXcode6で開く際には注意したほうがいいかもしれませんね。

以下、2014/11/12追記

7. Launch Images SourceからLaunch Screen Fileに変更すると
 CGRectGetWidth([UIScreen mainScreen].bounds)で取得する値が変わる

Xcode5まではImages.xcassetsのLaunchmagesに画像を登録して
スプラッシュ画面を設定していましたが
Xcode6からデフォルトではImages.xcassetsではなく
Launch Screen Fileを使用するように変更されました。
新規でプロジェクトを作成していただいたときに
「LaunchScreen.xib」というファイルがあるかと思います。

Xcode6の左ペインからプロジェクトを選択して
真ん中ペインのTARGETSでアプリを選択して
上部のタブからGeneralを選択すると
プロジェクトの初期設定ができるかと思うのですが
その設定画面の「App Icons and Launch Images」欄で
Xcode5のように画像を使用したい場合は「Use Asset Catalog」を選択、
「LaunchScreen.xib」を使用する場合は「Launch Screen File」のプルダウンで
「LaunchScreen」を選択してください。

「LaunchScreen.xib」はAutoLayoutでどの画面サイズにも対応するように設定されていますので
Xcode5の頃のように画面サイズごとのLaunchmageを作成する必要がなくなりました。
ただし、この「LaunchScreen.xib」が使用されるのはiOS8以降で
iOS7では無視されるみたいですね。
両方のバージョンに対応する際は画像も用意しつつ、
「LaunchScreen.xib」を使用すればいいのかな?
ちょっと面倒ですね。

で、ここでようやく本題です。
Xcode6では上記のような変更があったわけですが
よく調査しないで「LaunchScreen.xibを使用したほうが楽だな」と
設定を変更した結果、iPhone6、iPhone6+で表示した際に
大きく体裁が崩れる不具合が起きてしまいました。

以前iOS8で画面サイズを取得した時の仕様が変更されましたで紹介したように
画面サイズを

if (568.0f == CGRectGetWidth([UIScreen mainScreen].bounds)) {

といった形で取得してデバイスの判断を行っていたのですが
「LaunchScreen.xib」を使用すると正しい画面サイズが取得されるので
新たにiPhone6、iPhone6+用の分岐を設けなければいけなくなってしまいました。
また、同時にソースコード上で座標を記載して配置していたオブジェクトの位置なども
正しい画面サイズをもとに配置されますので
iPhone6、iPhone6+に再計算してソースコードを改修しなければいけません。

ですが、今回対応しているアプリの仕様はiPhone6、iPhone6+で表示したときは
いわゆる互換表示(拡大表示)させることとなっていたので
iPhone5Sで表示させたときと差異があったらまずいわけです。

結果、「LaunchScreen.xib」を使うことをやめて
従来の画像を使う形式に戻しました。

新しい機能を古いバージョンで作成したプロジェクトに取り込んでいくと
予期しない不具合を発生させるといういい勉強になりました。

参考サイト:
iPhone6/iPhone6 Plusの画面対応について
Xcode6でiOS7対応アプリを作るときのワナ


他にも気づいた点があったら随時更新していきますね。