iOS8対応の古いアプリをiPhone Xに対応する手順

App Storeで公開中のiPhone/iPadアプリが、iPhone Xで表示がカメラに隠れてしまうことに気づき、いろいろあーだこーだした修正手順をまとめてみました。
こんな症状を修正します。画面上のナビゲーションバーのアイコンの位置だけ正しい位置なのは、いじわるのフォースを感じますねw

私の場合は、もっとも古いのでiOS8で動くアプリです。
縦置きは、私のアプリはステータスバーのマージンをすべてとっているのでカメラに隠れず大丈夫でした。
iPhone Xスクリーン下のスリット部分も表示領域になっていませんでした。
しかし、横置きが全滅でした。
もっとも簡単な対処法は、横置きの対応をやめるというのもありだと思います。iPhoneで縦置きと横置きの両方に対応したいアプリってあまり無いと思いますので。大抵どちらかだけですよね。それを言っちゃ技術者魂が許さないので調べました。
 
Safe Area
iOS11の開発環境であるXcode9で導入された表示領域に関する新たな概念です。Safe Areaとは確実に矩形で表示できる領域で、今のところiPhone Xだけこれが大事みたいです。
古いアプリのプロジェクトをXcode9で開くとプロジェクトの設定変更を勧めてきます。自動で変更してからUIViewを選んで右側のSize Inspector(物差しアイコン)を開くと、Layout MarginsにSafe Area Relative Marginsという項目が増えています。
 
手順1)Safe Area Relative Marginsを有効にする
自動でプロジェクトの設定変更をしていたら、この項目はチェックが入っていることがあるみたいですが、その規則性はわかりません。

最初からXcode9で作成したアプリと変換した古いアプリでは違いがあり、最初からXcode9で作成したアプリにはさらにSafe Area Layout Guideという項目があります。

この項目を出現させる方法は結局わからなかったのですが、今のところ問題はありませんので次へ。
このままだとまだiPhone Xで表示が欠けてしまいます。調べたら

Safe Areaに対応できるのはiOS9以降から

だからでした。XcodeでSafe Area Relative Marginsにチェック入れて安堵していたらトラップ!
つまり

iOS8対応のアプリはiPhone Xに対応できない

まずこれを解消。
 
手順2)Project設定のDeployment TargetをiOS9.0以降に変更する
これでもだめ。新しいアプリと古いアプリのストーリーボードでUIViewをよーく比較観察すると違いを発見。 
 
元iOS8のアプリ

 
最初からXcode9で作成したアプリ

違うアプリなのでちょっとわかりにくいですがUIViewの配下にSafe Areaという要素がぶら下がっています。これがないから動かないみたいということに気づきました。知らなかったのですが

インターフェースビルダーにはプロジェクト設定とは別にDeployment Targetがある

これがiOS8のままなのが原因でした。
 
手順3)インターフェースビルダーのDeployment TargetをiOS9以降に変更する
ではどこでこれを出現させるか?というと、左側のツリーでストーリーボードを選んだ状態で、ストーリーボードのなかの要素を何も選ばないで右側のFile Inspectorのアイコンを押します。もしストーリーボードで何か選択されている場合は、一度ストーリーボードの何もないところをクリックしてFile Inspectorを表示します。
Builds For項目のDeployment TargetをiOS9.0以降にします。

 
手順4)Use Safe Area Layout Guidesを有効にする
これも自動で設定変更したらチェックが入っていると思います。この項目にチェックを入れたら手順1で書いたUIViewのSafe Area Layout Guideという項目が出現するかと思ったのですが出現しませんでした。しかし、さきほどのUIViewの下にSafe Areaの要素が出現して、iPhone Xで正しく表示されるようになりました。
 
以上でiPhone X対応が完了です。右側のマージンまで左のカメラと同じだけ削るのはちょっとどーよって思いますがディスプレイのカーブで矩形ではないからだと思います。

iOS9やiOS10など比較的新しいアプリはここまでの設定が、アプリによってプロジェクトを開いた時の自動の設定変更だけでほぼできていてるようで、前回「 iPhone Xで表示テストしてわかったこと(その2)」で書いたようにどれか1つマージンを再設定するだけで正しい表示になることもあるし、まちまちです。詳しいことはわかんないですけど。
ここまでの作業よりも大変だったのは、iOS9に変更したことによってpopoverとかUIAlertViewとかが完全にdeprecatedになってたり、segueの仕様も変わっていたり、plist.infoへの記述が厳しくなったり、iTunes connectでアップロードしたら怒られたりでその修正のほうが大変でした。(汗)
まーほとんどのアプリは自分しか使っていないんで、そもそもお前iPhone X買うのかよって話なんですけどねw