Posts

iPhone Duo y las apps no adaptadas: tres niveles de compatibilidad en iOS 27.1

Arturo Rivas Arias

Apple ha presentado iPhone Duo, su primer iPhone plegable, y junto al nuevo hardware llega una cuestión especialmente importante para quienes desarrollamos aplicaciones: qué ocurre con todo el software existente cuando se ejecuta en una pantalla interior de 7,6 pulgadas con una geometría completamente nueva.

La respuesta de Apple es bastante pragmática. Las aplicaciones actuales siguen funcionando sin necesidad de recompilarlas, pero el sistema aumenta progresivamente el área disponible dependiendo del SDK con el que se haya construido cada versión. En la práctica, iPhone Duo introduce tres niveles de compatibilidad: aplicaciones anteriores a iOS 27, aplicaciones compiladas con el SDK de iOS 27.0 y aplicaciones preparadas específicamente con iOS 27.1.

Tres niveles de compatibilidad

Las aplicaciones compiladas con iOS 26 o versiones anteriores se ejecutan dentro de una región segura de la pantalla interior. iOS mantiene alrededor un fondo negro y evita que la interfaz alcance las zonas cuya geometría la aplicación desconoce. Es la opción más conservadora: el contenido continúa siendo utilizable, pero buena parte de la pantalla plegable queda desaprovechada.

Con el SDK de iOS 27.0, el sistema permite que la aplicación ocupe bastante más espacio. La interfaz se extiende por una zona mayor de la pantalla interior, aunque todavía quedan regiones sin utilizar. Apple obtiene así un punto intermedio para las aplicaciones que ya habían adoptado las nuevas reglas de adaptabilidad de iOS 27 pero que fueron compiladas antes de existir el soporte completo para iPhone Duo.

El tercer nivel llega con iOS 27.1. Al recompilar con este SDK, la aplicación puede ocupar toda la pantalla interior, llegar hasta sus bordes y adoptar las nuevas barras verticales del sistema. Es el modo pensado para ofrecer una experiencia realmente nativa en el dispositivo.

Lo interesante es que Apple no obliga a crear una interfaz exclusiva para iPhone Duo. La estrategia consiste en continuar el camino iniciado hace años con las size classes, las áreas seguras y los contenedores adaptativos: la aplicación debe responder al espacio que tiene disponible, no al modelo concreto del dispositivo.

La pantalla interior no debe tratarse como un iPhone grande

La pantalla exterior de iPhone Duo se comporta de forma parecida a la de otros iPhone. La interior, en cambio, utiliza una size class regular tanto horizontal como verticalmente. Esto permite que estructuras como NavigationSplitView presenten varias columnas cuando existe espacio suficiente y vuelvan a una navegación compacta al cerrar el dispositivo.

Una aplicación SwiftUI puede aprovecharlo sin comprobar en ningún momento si está ejecutándose específicamente en iPhone Duo:

struct CookbookView: View {
    @Environment(\.horizontalSizeClass) private var horizontalSizeClass

    var body: some View {
        if horizontalSizeClass == .regular {
            NavigationSplitView {
                RecipeCategoriesView()
            } detail: {
                FeaturedRecipeView()
            }
        } else {
            NavigationStack {
                RecipeCategoriesView()
            }
        }
    }
}

Este enfoque también funciona en un iPad, en una ventana redimensionada o en otros dispositivos que Apple pueda introducir en el futuro. Detectar el hardware y mantener ramas específicas para cada modelo sería justo lo contrario de lo que pretende el nuevo sistema.

La orientación deja de ser una buena referencia

Hay otro cambio que puede romper aplicaciones con diseños antiguos. En la pantalla interior de iPhone Duo, las orientaciones declaradas por la aplicación no determinan necesariamente la geometría disponible. Apple recomienda dejar de utilizar la orientación de la interfaz como base para decidir el layout y consultar en su lugar el espacio real mediante size classes, geometría o traits.

Este principio ya era importante con las ventanas redimensionables de iPad y con iPhone Mirroring en macOS, pero un dispositivo plegable lo hace todavía más evidente. Un mismo iPhone puede cambiar de tamaño y forma mientras la aplicación sigue ejecutándose.

UIScreen.main deja de tener sentido

Muchas aplicaciones todavía utilizan UIScreen.main.bounds, UIScreen.main.scale o comprobaciones similares para tomar decisiones de interfaz. En un dispositivo con dos pantallas, el concepto de pantalla principal puede resultar ambiguo.

Apple recomienda obtener estos valores desde el contexto en el que vive realmente la interfaz. En UIKit, por ejemplo, la pantalla asociada a una ventana puede consultarse desde su UIWindowScene:

func updatePreview(for window: UIWindow?) {
    guard let screen = window?.windowScene?.screen else {
        return
    }

    let scale = screen.scale
    print("Escala de la pantalla actual: \(scale)")
}

Para otros valores, como la escala utilizada para dibujar una vista, suele ser todavía mejor recurrir al entorno de SwiftUI o a la traitCollection de UIKit. De esta forma el código describe la necesidad real en lugar de asumir dónde está ejecutándose.

Las áreas seguras pueden ser asimétricas

El pliegue, las cámaras, las barras del sistema y las distintas posiciones del dispositivo hacen que en iPhone Duo los márgenes seguros de ambos lados no tengan por qué coincidir. Código que calcula el ancho restando dos veces el margen izquierdo puede producir resultados incorrectos.

En SwiftUI, los componentes estándar ya respetan estas regiones de forma automática. Los fondos pueden extenderse con ignoresSafeArea(), mientras que botones, textos y demás elementos interactivos deberían permanecer dentro del área segura.

Cuando una interfaz necesita un control más preciso, iOS 27.1 incorpora regiones reservadas que permiten conocer zonas ocupadas por elementos físicos o del sistema. Por ejemplo, es posible consultar las regiones de división creadas por la geometría del dispositivo:

struct TimelineCanvas: View {
    var body: some View {
        GeometryReader { proxy in
            let divisions = proxy.reservedRegions(kind: .division)
            let frames = divisions.map(\.frame)

            CanvasView(reservedFrames: frames)
        }
    }
}

No todas las aplicaciones necesitarán llegar a este nivel. De hecho, Apple insiste en que NavigationStack, NavigationSplitView, TabView, hojas, menús y otros contenedores del sistema ya se adaptan automáticamente a las distintas configuraciones de iPhone Duo.

Las barras también cambian de orientación

Una de las diferencias visuales más llamativas de iOS 27.1 es que las barras de navegación y herramientas pueden desplazarse al lateral en la pantalla interior. Al colocar los controles en vertical, el sistema conserva más altura para el contenido y mantiene las acciones accesibles al sujetar el dispositivo abierto.

Las aplicaciones que utilizan las barras proporcionadas por NavigationStack, NavigationSplitView o los controladores estándar de UIKit reciben gran parte de este comportamiento automáticamente. Las barras completamente personalizadas requieren más trabajo porque el sistema no puede reorganizar su contenido por sí mismo.

Esto refuerza una tendencia que Apple lleva varias versiones impulsando: cuanto más se apoya una aplicación en los contenedores y métricas del sistema, menos código específico necesita para adaptarse a nuevos dispositivos.

Xcode 27.1 permite probar las distintas posiciones

Xcode 27.1 añade soporte para iPhone Duo en Device Hub. El simulador permite abrir, cerrar, girar y plegar virtualmente el dispositivo para comprobar cómo responde la interfaz durante los cambios de geometría. También conviene probar Split View, porque la pantalla interior permite ejecutar dos aplicaciones simultáneamente y reduce de nuevo el espacio disponible para cada una.

Apple ha ampliado además la herramienta App Resizability de Xcode para localizar patrones problemáticos tanto en SwiftUI como en UIKit: referencias a la pantalla principal, dependencias de orientación, tamaños fijos o APIs que dificultan el redimensionado.

Una transición bastante más suave de lo que parece

La llegada de un iPhone plegable podría haber obligado a introducir otro conjunto de APIs específicas del dispositivo. Apple ha elegido el camino contrario. Las aplicaciones antiguas siguen funcionando dentro de un modo protegido, las compiladas con iOS 27 aprovechan una parte mayor de la pantalla y las reconstruidas con iOS 27.1 obtienen acceso completo al nuevo formato.

Para una aplicación moderna basada en SwiftUI, size classes, áreas seguras y navegación estándar, la adaptación puede requerir sorprendentemente pocos cambios. El verdadero trabajo aparece en interfaces que todavía dependen de tamaños fijos, orientación, UIScreen.main o componentes personalizados que asumían que un iPhone siempre tendría una única pantalla y una geometría prácticamente constante.

iPhone Duo convierte la adaptabilidad en algo todavía más importante: ya no se trata solo de soportar muchos tamaños de iPhone, sino de aceptar que el mismo dispositivo puede cambiar de forma mientras nuestra aplicación permanece en pantalla.