iOS 10時代であっても3.5inchスクリーンは無視しない方が良い話と、古い実機なしでさっとレイアウトを確認する方法


3.5inchスクリーンは生きていた

手元には実機がiPhone 6/7 Plusしかないとします。さらにDeployment TargetがiOS 10以降で、完璧なモダン開発体制を整えました。例によりiPadはシカトです。だからUniversal Appではなく、iPhoneのみを対象にします。こうなるとiPhone 4s以前の3.5inchスクリーンサイズは完全無視でも良さそうですよね。iOS 10だから古い端末のシミュレーターももはやないので、2017年の世界ではあんな小さな画面は存在しないも同然だと思われました。この時点では。

しかし大きな落とし穴があって、iPad向けに最適化せずともiPadはiPhone互換モードでiPhone Appを動かすことができます。そしてApp StoreのレビュアーはこのiPhone互換モードでアプリをレビューするため、たとえiPhone向けのアプリであってもiPadでレイアウトが崩れているとリジェクトを食らいます。

さらに厄介なことに、iPad 9.7inch系やminiのiPhone 互換モードではiPhone 3GS/4/4s の 320×480 の比率と一致するサイズになるため、もう絶滅したと思われた 3.5inch がここでゾンビの如く襲いかかってくることになります。2017年にもなって、3.5inchです。でもこれは事実なので対処するしかありません。

App Store レビューガイドラインでも「iPhone向けのアプリケーションは可能な限りiPadでも実行できるようにしてください」という記載がありますが、これは可能な限りUniversal Appにしろ、という意味ではなく、iPhone互換モードでも適切に動作するよう保障せよ、という意味になるのかと思われます。ハードウェアの互換性としてはスクリーンサイズ以外にも色々考慮すべき点があるため、本来的にはより注意深く検討する必要があります。

2.4 ハードウェアの互換性 (2.4.1)
https://developer.apple.com/app-store/review/guidelines/jp/

実機がないがさっと古い端末のスクリーンサイズを再現する方法

UIWindowのframeを書き換えれば簡単にサイズを変えられます。AppDelegateあたりにコードを数行追加するだけです。でも解像度は動作機器に依存するのでPlus系なら3xになります。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let screenBounds = UIScreen.main.bounds
    let targetSize = CGSize.init(width: 320, height: 480)
    window?.frame = CGRect.init(x: screenBounds.width / 2 - targetSize.width / 2, y: screenBounds.height / 2 - targetSize.height / 2, width: targetSize.width, height: targetSize.height)

    return true
}

320×480@iPhone 6 Plus

iPhone 無印/3G/3GS/4/4s サイズの再現。iPad 9.7inchなどのiPhone互換モードはこの比率を拡大したものになる。iPad 12inchはまた異なる。

以下はLandscape時。昔はこんなちっさい画面だった。

320×568@iPhone 6 Plus

iPhone 5/5s/5c/SE サイズの再現。

375×667@iPhone 6 Plus

iPhone 6/7 サイズの再現。