Ensuring Mobile App Compatibility with New Devices
Apple released iPhone 16 with a new form factor and Dynamic Island instead of notch. Within a week, users started sending screenshots: status bar overlaps content, buttons moved under Home Indicator, camera covers part of the interface. The app didn't crash — it simply didn't know about new Safe Area insets.
What Specifically Breaks on New Device Release
Safe Area and Dynamic Island. On iOS, Safe Area insets depend on device model. Hardcoded insets — UIEdgeInsets(top: 44, left: 0, bottom: 34, right: 0) — are wrong for three iPhone generations already. Correct approach: view.safeAreaInsets or safeAreaLayoutGuide in Auto Layout. In SwiftUI — .ignoresSafeArea() with explicit edge specification, not globally.
Display cutout on Android. Starting with Android 9, there's DisplayCutout API. Devices with camera cutout (Pixel, Samsung A-series, Xiaomi) have WindowInsets.getDisplayCutout(). If app doesn't account for LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES or NEVER, content goes under cutout on fullscreen fragments.
Aspect ratio changes. Flagship phones from 2023–2024 have 19.5:9 and 20:9 ratio. If layouts are designed for 16:9 with fixed heights — content either stretches or black bars appear. On Android, test with <activity android:maxAspectRatio> — if not specified, OS might letterbox the app.
Foldable and large screens. Samsung Fold, Pixel Fold — app receives configuration change when unfolding. If Activity doesn't handle configChanges="screenSize|smallestScreenSize|screenLayout|orientation", recreation occurs with state loss. Jetpack WindowManager FoldingFeature lets you adapt layout to fold state.
Compatibility Check Process
Test new devices by layers:
-
Simulator/emulator — primary layout check on new form factor without real hardware. Xcode Simulator for iPhone 16 Pro appears with Xcode release. Android Emulator — create AVD with needed resolution and density.
-
Firebase Test Lab / BrowserStack — run UI tests on real device fleet. Especially important for Android: fragmentation is huge, emulator doesn't reproduce bugs specific to custom launchers and OEM skins.
-
Real device — for touch, Face ID, camera, NFC. Some bugs reproduce only on hardware.
For iOS: check traitCollection.horizontalSizeClass and verticalSizeClass, UIScreen.main.bounds (though for layout, better not rely on global bounds — use container-relative layout).
For Android: WindowMetricsCalculator.computeCurrentWindowMetrics(activity) from Jetpack WindowManager instead of deprecated Display.getSize().
Typical Audit Findings
- ScrollView without
contentInsetAdjustmentBehavior = .automatic— content goes under Navigation Bar -
WebViewwith fixed height instead of constraint tosafeAreaLayoutGuide.bottomAnchor - Splash screen with hardcoded size — doesn't scale on Pro Max / Ultra
-
getStatusBarHeight()via reflection in old Android code — returns 0 on some new devices
Timeline
Auditing compatibility with new devices and fixing critical bugs — 2–3 days. If app was originally written without Auto Layout / ConstraintLayout (old frame-based code) — significant refactoring may be needed.







