hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

iPhoneX 全画面対応

iPhone Xが発売されて数カ月が立つが、iPhone Xはこれまでと違う独特のアスペクトレシオを持ち、アプリもそれなりの対応が必要になる。
当方の開発環境はこれまでMac OS X 10.11 El Capitan および Xcode 8だったが、iPhone Xの対応はXcode 9以降となる。さらにXcode9の動作環境はmacos X Sierra以降なので、iPhone Xエミュレータを試すには開発環境をアップグレードしないといけない。
開発環境を更新するのはリスキーなので、VMWare Fusionmacos X Sierra環境を作り、その上でXcode9のiPhone Xエミュレータを動かしてEBPocket for iOSの動作確認を行い、対応できたものと思って安心していた。(→iPhone X の解像度の問題 - hishidaのblog
ところがiPhone Xの実機で全画面で動作させるには、Xcode9でビルドおよび提出が必要であり、Xcode8以前でビルドしたアプリをiPhone Xで実行すると上下に黒い枠が表示されることがわかった。
いずれはXcode9以上でないとアプリの提出が認められなくなるので、重い腰を上げてXcode9対応を行うことにした。

1.まずMac OS Xを 10.11 El Capitanから10.12 macos X Sierraにアップグレードする。これ自体は特に問題は無い。
2.次にXcode9.2をインストールし、Xcode8時代のプロジェクトをコンパイルしてみると、早速コンパイルエラーの山となった。

  • Xcode8以前に作成したxibが全てコンパイルエラーになる。プロパティのbuild for でiOSのバージョンを指定する必要があるらしい。一つ一つ"iOS 7.0 and later"を指定して再コンパイル
  • 10.11以前のXcodeプロジェクトをコンパイルすると、Code signing error が出る。

Command /usr/bin/codesign failed with exit code 1
Code signing fails with error 'resource fork, Finder information, or similar detritus not allowed'

Technical Q&A QA1940: Code signing fails with error 'resource fork, Finder information, or similar detritus not allowed'
上のURLに書かれているように、次のコマンドを実行することで解決。

xattr -cr プロジェクトディレクト

3.これで大丈夫と思いきや、iOS11で実行するとUIScrollViewのcontentInsetがずれるという凶悪な問題が発生。
iOS11 で UIScrollView の contentInsetがずれる問題
上記URLとは違う解決方法だが、結局、次の方法でiOS11のcontentInsetの自動調整を抑止し、さらに表示位置をiOSのバージョン毎に調整することで解決。

MainWindow.xibのRootViewControllerで下記設定を行なう
Adjust Scroll View Insets : チェックを外す ←勝手なcontentInsetの自動調整を止める
Under Top Bars : チェックをつける←NavigationBarの高さが変わっても潜り込まずにbarの下に表示される

iOS6からiOS7になるときにもNavigationController Barの下にUITableViewが潜り込むという問題が起きたが、その時の対処が不完全であったことが、iOS11になって表面化したらしい。
やはりお前らのiOS7対応は間違っている(解説編)
ただ今回のやり方が合っているのかどうかはわからない。そのうち「おまえらのiOS11対応は間違っている」と言われるかもしれない。
一時はもうAppStoreに提出できないのではないかと思って悩んだが、最終的には無事Xcode9でiPhone X対応版を提出することができた。

一つの問題点として、Xcode9でビルドすると、TargetOSの下限がiOS8になってしまう。ただしiOSは大多数のユーザが最新のOSに速やかにバージョンアップするので、実際は問題は無いだろう。
iOSはメジャーバージョンアップごとに破壊的修正が入るので、開発者にとっては大変である。