← Todos los artículos

Notas de la versión de iOS 27.0: obsolescencias, rupturas y correcciones

iOS 27.0 y iPadOS 27.0 salieron el lunes 14 de septiembre de 2026 como la build 24A437, la misma que Apple publicó como RC el 11 de septiembre, con el SDK dentro de Xcode 27 (27A266a) ese mismo día y con App Store Connect aceptando builds GA de 27.0 desde esa misma fecha.13 Ahora hay tres números de build que responden a “¿cuál iOS 27.0?”: el dispositivo ejecuta 24A437, el SDK de Xcode 27 se identifica como 24A430 y el runtime del simulador es 24A434.4 Las notas cubren 93 áreas con encabezado, con 65 funciones nuevas, 197 problemas resueltos, 23 problemas conocidos y 11 obsolescencias; lo que importa para el código existente es el conjunto que se activa en el momento en que compilas con el SDK 27.0, las obsolescencias confirmadas en los propios encabezados del SDK y una corrección de Foundation que un solo binario reproduce en un runtime de iOS 26.5 y en uno de iOS 27.0.24 {.answer-block}

TL;DR

  • Builds. Dispositivo 24A437, SDK 24A430, runtime del simulador 24A434; la RC y la GA comparten la build del dispositivo, y el número del SDK no es el del dispositivo, algo que importa cuando un reporte de error pide uno.14
  • Comportamiento al enlazar con 27. 12 categorías de cambios, 23 entradas en total, alteran lo que hace una app en el momento en que la compilas con el SDK 27.0: el requisito de pantalla de inicio, el mandato del ciclo de vida por escenas, TabView fallando con una selección oculta, la selección de texto del sistema en Text seleccionable, la herencia de traits en los view controllers presentados, la barra de ámbito en línea, las escenas de pantalla externa que ya no se ofrecen automáticamente, los modificadores de control que se restablecen dentro de sheets y popovers, el cálculo del área segura en containerRelativeFrame, los accesores de la barra de estado, las reglas de redimensionamiento en iPad bajo UIRequiresFullScreen y dos cambios menores de SwiftUI en menús y en el desplazamiento al inicio.2
  • Recompila o falla. HitchTimeMetric.ratio de MetricKit ahora mide en una nueva unidad HitchTimeRatio, y ScrollHitchTimeMetric dejó la API de Swift; Apple dice que recompiles con el SDK más reciente para evitar fallos al iniciar y un fallo por símbolo faltante, y la interfaz del SDK confirma que el tipo desapareció.24
  • 11 obsolescencias, casi todas silenciosas. canOpenURL: (ios(3.0, 27.0) en el encabezado), On Demand Resources (ios(9.0, 27.0)), PHAssetResource.originalFilename (ios(9, 27)), las API originales de MetricKit (marcadas API_TO_BE_DEPRECATED, así que es una obsolescencia blanda), ScrollHitchTimeMetric, FileDocument, calendar.deleteEvents renombrado a calendar.deleteEvent, un renombrado en PencilKit, el mandato de escenas, AirPort Utility y una nota de idioma de Weather Highlights. Las tres duras solo advierten con un deployment target de 27.0; con 17.0 o 26.0 el mismo archivo compila limpio.24
  • Dos cambios en Foundation, probados. +[NSURL URLWithString:] ya no codifica dos veces un %20 válido cuando escapa un espacio en otra parte de la cadena: un mismo binario de simulador produce %2520 en un runtime de iOS 26.5 y %20 en el runtime de iOS 27.0, y la build de Mac coincide con el lado antiguo, así que la corrección sigue al sistema operativo, no al SDK. El truncamiento de volumeAvailableCapacityKey a tres dígitos significativos no se ve en el simulador, que reporta exactamente 55.177.985 bloques.24

¿Qué build es cuál?

Dónde Build Evidencia
Dispositivo, iOS 27.0 / iPadOS 27.0 24A437 Feed de lanzamientos, lunes 14 de septiembre de 2026; “iOS 27.0 RC (24A437)” el viernes 11 de septiembre1
SDK dentro de Xcode 27 (27A266a) 24A430 iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist, ProductBuildVersion4
Runtime del simulador de iOS 27.0 24A434 xcrun simctl list runtimes imprime “iOS 27.0 (27.0 - 24A434)”4
macOS 27.0 26A428 Feed de lanzamientos, lunes 14 de septiembre1
App Store Connect SDK GA de 27.0 aceptados “You can now upload apps built with Xcode 27 using the SDK for iOS 27.0, iPadOS 27.0, macOS 27.0, tvOS 27.0, visionOS 27.0, and watchOS 27.0 for the App Store, and for internal and external testing through TestFlight.” (ya se pueden subir apps compiladas con Xcode 27 y los SDK de 27.0 a la App Store y a TestFlight). 14 de septiembre; subidas con el SDK de la RC aceptadas desde el 9 de septiembre3

Los tres números no son un error. El SDK es una instantánea de encabezados e interfaces, el runtime del simulador es un cryptex aparte que Apple entrega con Xcode, y la build del dispositivo es la que ejecuta la gente; una reproducción que diga “iOS 27.0” sin uno de estos datos omite el número que decide si una corrección aplicó.4

Las notas abren con dos oraciones de alcance, “The iOS & iPadOS 27 SDK provides support to develop apps for iPhone and iPad running iOS & iPadOS 27. The SDK comes bundled with Xcode 27, available from the Mac App Store,” (el SDK permite desarrollar apps para iPhone y iPad con iOS y iPadOS 27 y viene incluido en Xcode 27, disponible en la Mac App Store), y luego recorren 93 áreas con encabezado. Contar los elementos de lista bajo cada encabezado da 65 funciones nuevas, 197 problemas resueltos, 23 problemas conocidos y 11 obsolescencias; Siri por sí sola suma 38 resueltos y ocho conocidos, SwiftUI 23 funciones nuevas y 13 resueltos, UIKit nueve nuevas y 13 resueltos.2 La publicación sobre Xcode 27 cubre el lado de la cadena de herramientas, y la que estás leyendo cubre el lado del sistema operativo y del SDK.

¿Qué cambia en el momento en que compilas con el SDK 27.0?

Apple condiciona los cambios de comportamiento al SDK contra el que se enlaza una app, así que estos no afectan en nada a la build que ya publicaste y todos se activan con el primer archive desde Xcode 27. Citando la nota de cada uno:2

  • Pantalla de inicio. “iOS and iPadOS apps built with the 27.0 SDK or later are required to include a launch screen. Your app’s Info.plist must contain one of the following keys: UILaunchStoryboardName, UILaunchStoryboards, UILaunchScreen, or UILaunchScreens. Apps that don’t include a launch screen are rejected when the App Store begins accepting apps built with the 27.0 SDK.” (las apps compiladas con el SDK 27.0 o posterior deben incluir una pantalla de inicio mediante una de esas cuatro claves en Info.plist, o la App Store las rechaza). App Store Connect aceptó subidas a la App Store compiladas con los SDK de la RC de 27.0 desde el 9 de septiembre y con los SDK GA desde el 14 de septiembre; ninguna de las dos entradas dice cuándo empezaron los rechazos, así que lee ambas como fechas de subida y no como fecha de aplicación.3 Mi publicación sobre la pantalla de inicio audita un plist generado.
  • Ciclo de vida por escenas. Bajo las obsolescencias de UIKit: “Apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch.” (las apps compiladas con el SDK más reciente deben adoptar el ciclo de vida basado en escenas o no arrancan). La publicación sobre el mandato de escenas tiene la migración.
  • Selección de TabView. “In apps built with the iOS 27.0 and iPadOS 27.0 SDKs, a TabView enforces that its selection is set to a visible tab. TabView might crash when its selection is set to a hidden or otherwise unavailable tab.” (un TabView exige que su selección apunte a una pestaña visible y puede fallar si apunta a una oculta o no disponible). Una selección restaurada desde UserDefaults que nombra una pestaña que luego ocultaste es el patrón que hay que buscar.
  • Text seleccionable. “In apps built with the iOS 27.0 and iPadOS 27.0 SDKs, a Text view with .textSelection(.enabled) applied now supports user-interactive selection using the system text selection UI.” (una vista Text con .textSelection(.enabled) ahora admite selección interactiva con la interfaz de selección de texto del sistema). Apple añade que esas vistas “might include additional gestures for system text selection interactions” (pueden incluir gestos adicionales para la selección de texto del sistema) y remite los gestos personalizados a .highPriorityGesture(); la misma build también hace que TextRenderer funcione en Text seleccionable.
  • View controllers presentados. “In apps built with the iOS 27.0 SDK, a presented view controller inherits its trait collection by walking up its view’s superview chain through the intermediate views of the presentation, rather than jumping directly to the presentation controller.” (un view controller presentado hereda su trait collection recorriendo la cadena de superviews a través de las vistas intermedias de la presentación, en lugar de saltar directamente al presentation controller). Las subclases personalizadas de UIPresentationController que fijan traits son las que hay que volver a probar.
  • Barra de ámbito. “In apps built with the iOS 27.0 SDK, when UISearchController uses center search-bar placement, the scope bar appears inline on the same row as the search field rather than on a separate row beneath it.” (cuando UISearchController usa la posición central de la barra de búsqueda, la barra de ámbito aparece en la misma fila que el campo de búsqueda y no en una fila aparte debajo).
  • Pantallas externas. “In apps built with the iOS 27.0 SDK, windowExternalDisplayNonInteractive scenes are no longer offered automatically by the system. Use UIViewController.registerSceneAccessory(_:) with a UISceneAccessory.externalNonInteractive instance to display non-interactive content on external display scenes.” (el sistema ya no ofrece automáticamente las escenas windowExternalDisplayNonInteractive; hay que registrar un accesorio de escena para mostrar contenido no interactivo en pantallas externas). SwiftUI recibe la misma puerta mediante .sceneAccessory con un ExternalNonInteractiveAccessory.
  • Sheets y popovers. Listado como corregido: “In apps built with the 27.0 SDKs, the controlSize, buttonSizing, buttonRepeatBehavior, menuIndicatorVisibility, and ButtonBorderShape environment values are now reset to their default values in sheets and popovers.” (esos valores de entorno vuelven a sus valores predeterminados dentro de sheets y popovers). Si un sheet heredaba .controlSize(.large) de quien lo presenta, deja de hacerlo.
  • containerRelativeFrame. También corregido para las builds con el SDK 27.0: el modificador “incorrectly accounts for safe-area insets on a ScrollView’s non-scrollable axis, causing the calculated scrollable content size to be too small,” (contabilizaba mal los márgenes del área segura en el eje no desplazable de un ScrollView, y el tamaño calculado del contenido desplazable quedaba demasiado pequeño), así que un ScrollView horizontal con containerRelativeFrame(.vertical) cambia de tamaño.
  • Accesores de la barra de estado. Corregido para las builds con el SDK 27.0: los accesores obsoletos de la barra de estado en UIApplication, que la nota enumera como statusBarFrame, statusBarOrientation, statusBarStyle e isStatusBarHidden, “might return NaN or null values” (pueden devolver NaN o valores nulos).
  • Redimensionamiento y orientación en iPad y en iPhone Mirroring. Nueve problemas resueltos de UIKit describen lo que una app “built with the iOS 27 SDK” (compilada con el SDK de iOS 27) debería ver ahora cuando su escena se conecta, o cuando el usuario redimensiona o rota su ventana: las apps con UIRequiresFullScreen reciben “a discrete change to a new UIScreen with an updated bounds” (un cambio discreto a un nuevo UIScreen con bounds actualizados) en lugar de actualizaciones continuas de tamaño, los bounds de UIScreen.main “should remain fixed once the screen connects” (deberían quedar fijos una vez que la pantalla se conecta), y “supported interface orientations should no longer be a condition for continuous resizability” (las orientaciones de interfaz admitidas ya no deberían ser una condición para el redimensionamiento continuo).
  • Menús y desplazamiento al inicio. Dos cambios menores de SwiftUI: “In apps built with the 27.0 SDKs, a LabeledContent view used inside a Menu maps its value to the platform menu item’s subtitle,” (un LabeledContent dentro de un Menu convierte su valor en el subtítulo del elemento de menú de la plataforma) y, listado como corregido, “In apps built with the 2027 SDKs, tapping the status bar to scroll a ScrollView to its top correctly updates a bound scrollPosition.” (tocar la barra de estado para desplazar un ScrollView al inicio actualiza correctamente un scrollPosition enlazado). Una etiqueta de menú que llevaba un valor por razones de diseño ahora gana un subtítulo, y un binding de scrollPosition que quedaba desactualizado tras tocar la barra de estado ahora se actualiza.

Esas 12 categorías cubren las entradas que cambian el comportamiento existente. Las capacidades nuevas detrás de la misma condición de SDK, como el protocolo ReadableDocument, el protocolo Document construido sobre él y UIScene.extendStateRestoration, aparecen en las secciones posteriores; la categoría de pantallas externas empareja la eliminación de UIKit con su reemplazo en SwiftUI.

Dos entradas de MetricKit pertenecen aquí aunque tratan de recompilar y no de enlazar. “HitchTimeMetric.ratio and SignpostIntervalMetric.hitchTimeRatio now use the new HitchTimeRatio type, a Dimension subclass that expresses hitch time as a ratio of milliseconds hitching per second of tracked duration. Recompile your app with the latest SDK to pick up this type change and avoid any crashes on launch.” (ambas propiedades usan ahora el nuevo tipo HitchTimeRatio, una subclase de Dimension que expresa el tiempo de tirones como milisegundos de tirón por segundo de duración medida; hay que recompilar con el SDK más reciente para adoptar el cambio de tipo y evitar fallos al iniciar). Y: “The scrollHitchTime(_:) case of MetricResult and the ScrollHitchTimeMetric type are no longer part of the new Swift MetricKit API, and MetricReport values no longer contain scroll hitch entries. Use the hitchTime(_:) case and HitchTimeMetric instead, which report per-app animation hitch time. Recompile your app with the latest SDK to avoid a missing symbol crash if it references ScrollHitchTimeMetric or scrollHitchTime(_:).” (el caso scrollHitchTime(_:) y el tipo ScrollHitchTimeMetric ya no forman parte de la nueva API Swift de MetricKit; hay que usar hitchTime(_:) y HitchTimeMetric, y recompilar para evitar un fallo por símbolo faltante).2 En la interfaz Swift de MetricKit del SDK de iOS 27, ScrollHitchTimeMetric y scrollHitchTime aparecen cero veces y HitchTimeRatio aparece cuatro veces, así que un binario compilado contra el SDK beta que usara cualquiera de esos nombres referencia un símbolo que la interfaz GA no exporta.4 Mi publicación sobre MetricKit cubre la nueva API desde la beta de junio.

¿Qué API quedan obsoletas en 27.0?

Las notas enumeran 11 obsolescencias. Una obsolescencia en una nota de versión es una oración; una obsolescencia en el SDK es una anotación de disponibilidad que el compilador lee, y las dos no siempre dicen lo mismo. Comprobé cada entrada contra los encabezados y las interfaces Swift dentro del SDK iPhoneOS 27.0 de Xcode 27:24

Entrada de la nota Lo que dice el SDK
canOpenURL: is deprecated. Attempt to open the URL and handle any failure instead of validating it first.” (intenta abrir la URL y maneja cualquier fallo en lugar de validarla primero) API_DEPRECATED("Prefer attempting to open URLs and handling any failures", ios(3.0, 27.0), visionos(1.0, 27.0), tvos(9.0, 27.0)) en UIApplication.h; la publicación sobre canOpenURL tiene el patrón de reemplazo
“On Demand Resources and the NSBundleResourceRequest API are deprecated. Use Background Assets instead.” (usa Background Assets en su lugar) API_DEPRECATED("Use Background Assets instead.", ios(9.0, 27.0), watchos(2.0, 27.0), tvos(9.0, 27.0)) en la clase, en sus métodos de prioridad de preservación y en sus constantes de notificación y prioridad; la publicación sobre ODR calcula el costo de la migración, y la respuesta “What you get is a compiler warning” de su FAQ ahora lleva la salvedad sobre el deployment target que explica la sección siguiente
“The originalFilename property on PHAssetResource is incorrectly marked as non-nullable, which misrepresents the property value; a new, nullable filename property is available as a replacement.” (la propiedad está mal marcada como no anulable, y una nueva propiedad anulable filename la reemplaza) originalFilename es API_DEPRECATED("Use filename instead", ios(9, 27), macos(10.15, 27), tvos(10, 27), visionos(1, 27)); filename es nullable y API_AVAILABLE(macos(27), ios(27), tvos(27), visionos(27))
Las API originales de MetricKit, MXMetricManager, MXMetricManagerSubscriber, MXMetricPayload y MXDiagnosticPayload, “are no longer recommended for new adoption. Use MetricManager instead.” (ya no se recomiendan para adopciones nuevas; usa MetricManager) API_DEPRECATED("Use MetricManager instead.", ios(13.0, API_TO_BE_DEPRECATED), macos(12.0, API_TO_BE_DEPRECATED)) en MXMetricManager: una obsolescencia blanda sin versión, así que hoy no hay advertencia. La página de referencia de Apple para la clase la lista como obsoleta en 27.0 en todas las plataformas, así que la documentación y el encabezado no coinciden; mi publicación sobre MetricKit repetía la versión de la página y ahora lleva una nota fechada sobre la discrepancia6
ScrollHitchTimeMetric y scrollHitchTime(_:) “are no longer part of the new Swift MetricKit API” (ya no forman parte de la nueva API Swift de MetricKit) Cero apariciones de cualquiera de los dos nombres en MetricKit.swiftmodule; no es obsolescencia, es eliminación
“The FileDocument protocol is deprecated. Use ReadableDocument for read-only documents or Document for documents that support reading and writing.” (usa ReadableDocument para documentos de solo lectura o Document para los que admiten lectura y escritura) FileDocument: deprecated: 100000.0, message: "Conform your type to Document instead."; ReferenceFileDocument: "Use Document protocol instead."; ambas blandas, y Document es @available(iOS 27.0, macOS 27.0, visionOS 27.0, *), así que el reemplazo necesita un mínimo de 27
“The calendar.deleteEvents schema has been renamed to calendar.deleteEvent.” (el esquema fue renombrado) deleteEvents aparece cero veces en AppIntents.swiftmodule; deleteEvent: some AppSchemaIntent sí está. Un renombrado sin alias es un error de compilación para cualquiera que use el nombre antiguo
__PKStrokeRenderState has been renamed to PKStrokeRenderStateReference, with PKStrokeRenderStateReference.init(…) replacing PKStrokeRenderState.asObjCRenderState().” (un renombrado, con el inicializador de la clase de referencia reemplazando al método antiguo) PKStrokeRenderState.h declara @interface PKStrokeRenderState bajo API_AVAILABLE(ios(27.0), macos(27.0), visionos(27.0)) con NS_SWIFT_NAME(PKStrokeRenderStateReference); la interfaz Swift no tiene ningún asObjCRenderState; el reemplazo que Apple nombra es el init(_ swiftValue: PKStroke.RenderState) de la clase de referencia, así que PKStrokeRenderStateReference(state) es la nueva forma de llamada y la antigua no compila
“Apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch.” (adopta el ciclo de vida por escenas o la app no arranca) No es una anotación; es un fallo al iniciar. Consulta la publicación sobre el mandato de escenas
“AirPort Utility will no longer be available for new downloads from the App Store.” (AirPort Utility ya no estará disponible para descargas nuevas en la App Store). Las redescargas siguen funcionando; “functionality is not guaranteed” (la funcionalidad no está garantizada) en iOS 27 Una app, no una API
“Weather Highlights is currently only available in US English.” (Weather Highlights solo está disponible por ahora en inglés de Estados Unidos) Apple lo archiva bajo Deprecations; se lee como una nota de disponibilidad

Una obsolescencia blanda y un renombrado quedan fuera de los encabezados de Deprecations. El estilo de campo de texto .roundedBorder lleva una anotación deprecated: 100000.0 en la interfaz de SwiftUI cuyo mensaje, quitando los acentos graves internos, dice “Use textFieldStyle(.bordered) with textInputBorderShape(.roundedRectangle)”; coincide con la entrada de New Features que introduce TextInputBorderShape. La versión 100000.0 es la convención de Apple para “obsoleto, pero todavía no”: con la configuración predeterminada el compilador guarda silencio y el mensaje solo aparece en la interfaz. El renombrado es más duro. UINavigationItem.navigationBarMinimization “replaces UINavigationItem.barMinimizeBehavior and UINavigationItem.barMinimizationSafeAreaAdjustment,” (reemplaza a esas dos propiedades) y toolbarMinimizationBehavior de SwiftUI reemplaza a toolbarMinimizeBehavior de la misma manera; ninguno de los tres nombres antiguos aparece en los encabezados de UIKit del SDK 27.0 ni en las interfaces Swift de UIKit y SwiftUI, así que el código que los usa no compila en lugar de advertir, la misma clase de caso que deleteEvents.24

Las duras también son más silenciosas de lo que parecen. El compilador compara la versión de obsolescencia con tu deployment target, no con el SDK, así que ios(3.0, 27.0) produce una advertencia solo en un target cuyo iOS mínimo sea 27.0. Compilé tres veces contra el SDK 27 un archivo que llama a canOpenURL, crea un NSBundleResourceRequest y lee originalFilename: con -target arm64-apple-ios17.0-simulator y con 26.0 compiló sin diagnósticos, y con 27.0 produjo tres advertencias, 'canOpenURL' was deprecated in iOS 27.0: Prefer attempting to open URLs and handling any failures, 'NSBundleResourceRequest' was deprecated in iOS 27.0: Use Background Assets instead. y 'originalFilename' was deprecated in iOS 27: Use filename instead.4 Una app con un mínimo realista no se enterará de ninguna de estas por el compilador; con la configuración predeterminada del compilador, el grep de la lista de más abajo es el único aviso que recibes.

¿Qué correcciones verifiqué?

Dos entradas de Foundation se pueden ejecutar en lugar de leerse. Las notas listan la primera como corregida: “+[NSURL URLWithString:] no longer double-encodes the % of valid percent-escape sequences when encoding other invalid characters.” (ya no codifica dos veces el % de las secuencias de escape válidas al codificar otros caracteres inválidos).2 La prueba construye NSURL(string:) a partir de tres cadenas que contienen cada una un escape válido y un carácter que NSURL debe escapar, e imprime absoluteString. La compilé dos veces con Xcode 27: una para Mac y otra para el simulador con un iOS mínimo de 26.0, y luego ejecuté ese único binario de simulador, sin cambios, en un runtime de iOS 26.5 y en el runtime de iOS 27.0:4

Entrada macOS 26.6.2 y el binario de simulador en iOS 26.5 (idénticos) El mismo binario de simulador en iOS 27.0 (24A434)
https://example.com/a%20b c https://example.com/a%2520b%20c https://example.com/a%20b%20c
https://example.com/search?q=caf%C3%A9 au lait https://example.com/search?q=caf%25C3%25A9%20au%20lait https://example.com/search?q=caf%C3%A9%20au%20lait
https://example.com/p%20q{r https://example.com/p%2520q%7Br https://example.com/p%20q%7Br

La primera columna es el comportamiento antiguo: NSURL escapa el espacio y además convierte en %25 el % de un escape que ya era válido, así que la ruta resultante es distinta de la que nombraba el escape. La columna de iOS 27.0 es la corrección. Un único Mach-O, cuyo LC_BUILD_VERSION dice minos 26.0 y sdk 27.0, produjo ambas columnas de simulador, así que el sistema operativo en el que corre el código decide el resultado, no el SDK contra el que compilas ni el target para el que compilas. Una app que compiles hoy conserva la codificación antigua en el runtime de iOS 26.5 que probé, y la nota de versión no da motivos para esperar un resultado distinto en ninguna otra versión 26.x.

Las notas listan la segunda como nueva, y no pude reproducirla donde puedo ejecutar código: “volumeAvailableCapacityKey is truncated to 3 significant decimal digits at the block count level (e.g., 123,456,789 blocks becomes 123,000,000 blocks).” (se trunca a tres dígitos decimales significativos a nivel del conteo de bloques).2 En el simulador de iOS 27.0, URL.resourceValues(forKeys: [.volumeAvailableCapacityKey]) devolvió 226.009.026.560 bytes, y statfs sobre la misma ruta devolvió f_bavail 55.177.985 con f_bsize 4.096, que multiplicados dan exactamente la misma cifra; un conteo de bloques con tres dígitos significativos habría sido 55.100.000 bloques, o 225.689.600.000 bytes.4 El Mac anfitrión reportó 55.177.998 bloques con el mismo código. Mi lectura es que el truncamiento vive en el kernel del dispositivo y no en Foundation, y que el simulador, que le pregunta al kernel del Mac por el volumen del Mac, no puede mostrarlo; no he ejecutado la prueba en un dispositivo, así que trata la entrada como no probada y no como falsa, y espera que el redondeo aparezca en reportes de espacio libre del dispositivo que antes eran exactos.

¿Qué novedades cambian el código que ya tienes?

El historial limitado de HealthKit. La nota es una sola línea, “Updated HealthKit permissions flow now lets users grant apps access to limited history or full history,” (el flujo de permisos actualizado permite conceder a las apps acceso al historial limitado o completo) y la referencia de la API carga con las consecuencias.25 Después de la pantalla de tipos de datos, “a second screen prompts them to choose how much historical data to grant your app, either a recent limited window or their full history,” (una segunda pantalla pide elegir cuánto historial conceder a tu app: una ventana reciente limitada o el historial completo) y “Time-bound authorization applies only to sample types.” (la autorización acotada en el tiempo aplica solo a los tipos de muestra).5 El nuevo earliestAuthorizedSampleDate(for:), disponible desde iOS 27.0 y watchOS 27.0, devuelve un diccionario de HKObjectType a la fecha legible más antigua, y el límite no está donde supondrías: “HealthKit evaluates the boundary against a sample’s end date, so the framework might service your query with a sample that begins before the earliest authorization date as long as the sample ends after it.” (HealthKit evalúa el límite contra la fecha de fin de la muestra, así que puede responder a tu consulta con una muestra que empieza antes de la fecha autorizada más antigua siempre que termine después).45 La regla de privacidad se mantiene: “Your app can’t distinguish between denied and full access; limited authorization is the only state your app can identify, by design.” (tu app no puede distinguir entre acceso denegado y completo; la autorización limitada es el único estado que puede identificar, por diseño).5 La guía de Apple es tratar todo lo anterior a la fecha devuelta como desconocido y no como ausente, y acotar la fecha de inicio de cada consulta por tipo. Cualquier tendencia, línea base o racha calculada desde HealthKit ahora tiene que ser correcta en una ventana que el usuario eligió. La publicación sobre HealthKit cubre las adiciones de junio y no cubre el cambio del modelo de permisos.

Códigos de oferta de StoreKit. “Offer code redemption APIs now return a VerificationResult when redemption completes. If a redemption succeeds, your app receives a VerificationResult that contains a Transaction object. If a redemption fails, your app receives an error that describes what caused the redemption to fail.” (las API de canje de códigos de oferta ahora devuelven un VerificationResult con una Transaction si el canje tiene éxito, o un error que describe la causa si falla).2 En la interfaz, presentOfferCodeRedeemSheet(in:) queda obsoleto en 27.0 con “Use presentOfferCodeRedeemSheet(from:options:) instead.”, y el reemplazo es presentOfferCodeRedeemSheet(from viewController: UIViewController, options: Set<RedeemOption> = []) async throws -> VerificationResult<Transaction>, disponible desde iOS 27.0.4 El código que presentaba la hoja y luego escuchaba Transaction.updates para obtener el resultado ahora puede hacerle await.

Core AI en segundo plano. “The system now restricts background access to the Neural Engine, similar to GPU usage restrictions,” (el sistema ahora restringe el acceso en segundo plano al Neural Engine, como ya hace con la GPU) y “Neural Engine memory usage is now attributed to your app process instead of the system, and appears in the Allocations instrument.” (el uso de memoria del Neural Engine ahora se atribuye al proceso de tu app y no al sistema, y aparece en el instrumento Allocations). El acceso en segundo plano “requires the new entitlement: “com.apple.developer.background-tasks.continued-processing.inference”.” (requiere ese nuevo entitlement).2 Una app que ejecutaba inferencia desde una tarea en segundo plano en 26 y nunca pidió nada encuentra el Neural Engine cerrado hasta que tenga el entitlement, y la memoria del Neural Engine que usa ahora aparece bajo su propio proceso en Allocations.

Background Assets. “You can reduce your app’s storage usage with localized asset packs. The system delivers the appropriately localized asset packs based on the user’s preferred languages.” (puedes reducir el almacenamiento de tu app con paquetes de recursos localizados, que el sistema entrega según los idiomas preferidos del usuario).2 Para una app que abandona On Demand Resources, los paquetes localizados son la función que reemplaza a las etiquetas por idioma.

Alertas críticas. Las notas listan el comportamiento de las alertas críticas como corregido: “Critical alerts are automatically turned on for any apps that request your permission to enable notifications.” (las alertas críticas se activan automáticamente para cualquier app que pida permiso para habilitar notificaciones).2 La entrada no dice nada más, así que vuelve a probar cualquier flujo de notificaciones que pareciera tener privilegios de más en las betas.

Menús, @State, TLS y el nuevo slice. Cuatro entradas tienen sus propias publicaciones. La barra de menús y los menús contextuales en iPadOS 27 y macOS 27 “present a reduced set of menu item images,” (muestran un conjunto reducido de imágenes en los elementos de menú) con preferredImageVisibility en UIMenuElement como anulación: consulta imágenes de menú. La reescritura de la macro @State es una entrada de SwiftUI en estas notas, y cambia lo que compila bajo Xcode 27: consulta la publicación sobre Xcode 27 para la reproducción y la publicación sobre la macro @State para la auditoría. El requisito TLS más estricto para el tráfico de MDM, inscripción y actualizaciones de software empieza “in 27.0 operating systems” (en los sistemas operativos 27.0): consulta la auditoría de TLS. Y arm64e.x1 con CPA2 en “iPhone models with A20 Pro or later chips, Mac computers with M6 or later chips, and Apple Watch models with S11 or later chips” (iPhone con chip A20 Pro o posterior, Mac con M6 o posterior y Apple Watch con S11 o posterior): consulta arm64e.x1.2

Menores, pero merecen un grep. System gana stat, lstat, fstat y fstatat en Swift con un tipo Stat y FilePath.stat(), y las notas listan como corregido un conflicto entre esos métodos y un stat() sin calificar en tus propias extensiones. NSTextTable “and its related objects and types are available to UIKit clients starting with OS 27 releases.” (y sus objetos y tipos relacionados están disponibles para los clientes de UIKit a partir de las versiones 27 del sistema). AsyncImage “now automatically caches downloaded images using HTTP caching protocols,” (ahora guarda automáticamente en caché las imágenes descargadas con los protocolos de caché HTTP) con inicializadores URLRequest y View.asyncImageURLSession(_:) para dirigirlo. “When linked on iOS 27, tvOS 27, macCatalyst 27, or visionOS 27 SDKs,” (al enlazar con esos SDK) UIScene.extendStateRestoration y UIScene.completeStateRestoration extienden la restauración de estado a la transición de segundo plano a primer plano. Y SwiftData lista una corrección para “a deadlock for @Query when saving a ModelContext on a background actor while scheduling new async tasks for a ModelActor.” (un interbloqueo de @Query al guardar un ModelContext en un actor en segundo plano mientras se programan nuevas tareas asíncronas para un ModelActor).2

Problemas conocidos que conviene planificar

  • Las entidades photos.asset dejan de compilar. “Existing entities that conformed to @AppEntity(schema: .photos.asset) in prior releases might no longer compile in the 27 SDKs because new properties were added to the schema in this release.” (las entidades existentes que adoptaban ese esquema pueden dejar de compilar con los SDK 27 porque el esquema ganó propiedades nuevas en esta versión). Solución alternativa: “To continue conforming to the schema, adopt the additional properties and move the code behind an availability check.” (adopta las propiedades adicionales y pon el código detrás de una comprobación de disponibilidad).2 La macro no te dirá cuáles propiedades: una conformidad vacía a @AppEntity(schema: .photos.asset) compila limpia bajo swiftc, y su expansión solo añade una conformidad a AssistantSchemaEntity que lleva el nombre del esquema. La lista sale del paso de metadatos de App Intents de Xcode, appintentsmetadataprocessor, que hace fallar la build con un error por cada propiedad faltante. Ejecutado a mano sobre esa conformidad vacía contra el SDK 27.0, reporta 12, cada una con su fix-it: hasSuggestedEdits: Bool, isFavorite: Bool, isHidden: Bool, creationDate: Date?, location: GeoToolbox.PlaceDescriptor?, assetType: <#PhotoAssetType#>?, filter: <#PhotoFilterEffectType#>?, exposure: Double?, saturation: Double?, warmth: Double?, aperture: Double? e isPortraitModeEnabled: Bool?; los dos marcadores <#…#> representan enums que declaras tú mismo contra los esquemas de enum .photos.assetType y .photos.filterType, que la interfaz nombra PhotoAssetType y PhotoFilterEffectType. No pude comparar esa lista con el SDK 26, porque el único Xcode en este Mac es 27A266a.4
  • Los tokens de Now Playing van a producción.RemoteMediaSession and RemoteMediaSessionRepresentable always provision Now Playing start and update push tokens for the production APNs environment, even if the aps-environment configuration is set to development.” (siempre aprovisionan los tokens push de inicio y actualización de Now Playing para el entorno production de APNs, aunque aps-environment esté configurado como development). Solución alternativa: “Use the production environment for testing and validation.” (usa el entorno production para pruebas y validación).2 La clase está en el nuevo framework NowPlaying, marcado como no disponible en macOS y visionOS.4
  • SpotlightSearchTool desborda el modelo en el dispositivo. Sin una configuración, “the tool’s description and parameter schema alone exceed the on-device model’s context window before any prompt is added.” (la descripción de la herramienta y el esquema de parámetros por sí solos superan la ventana de contexto del modelo en el dispositivo antes de añadir cualquier prompt). Solución alternativa: una guía enfocada, “.focused(.communications), .focused(.calendar), .focused(.documents), .focused(.visualMedia), or .focused(.audio).”2 La API existe: SpotlightSearchTool.Guide.focused(_ domain: ContentDomain = .items) está junto a .complete y .dynamic(_:) en la interfaz _CoreSpotlight_FoundationModels.4 Mi publicación sobre IA en el dispositivo cubre la herramienta; sus pasos de adopción de junio emparejaban la configuración predeterminada con el modelo del sistema, y ahora llevan una corrección fechada.
  • Trazas de rendimiento desde el Centro de control. “Gathering PowerProfiler and Lookback traces through the Performance Trace Control Center widget might fail to produce traces.” (recopilar trazas de PowerProfiler y Lookback mediante el widget Performance Trace del Centro de control puede no producir trazas). La solución alternativa que ofrece Apple es “Gather traces on iOS 27.0 beta 1 or earlier,” (recopilar las trazas en iOS 27.0 beta 1 o anterior), que no es una solución que la mayoría de los equipos pueda aplicar en un dispositivo que ya se actualizó.2
  • Pruebas de StoreKit. “Changing the storefront or locale using SKTestSession doesn’t propagate through Storefront.updates,” (cambiar la tienda o la configuración regional con SKTestSession no se propaga a través de Storefront.updates) y “Failed purchases using SKTestSession might display error dialogs even when dialogsDisabled is set to true.” (las compras fallidas con SKTestSession pueden mostrar diálogos de error aunque dialogsDisabled esté en true).2
  • Atajos y UnionValue. Un parámetro con “two number-related types (for example, both Int and Double)” (dos tipos numéricos, por ejemplo Int y Double a la vez) muestra la opción numérica dos veces; la solución alternativa de Apple es declarar solo uno.2

Qué haría yo esta semana

  1. Haz un archive desde Xcode 27 y pasa la lista de enlazado con 27 de arriba por la app antes de TestFlight: claves de pantalla de inicio, ciclo de vida por escenas, cualquier TabView cuya selección pueda nombrar una pestaña oculta y cualquier sheet que heredara modificadores de control.2
  2. Compila el código de MetricKit contra el SDK GA antes de publicar; un binario que todavía referencia ScrollHitchTimeMetric o el tipo antiguo de ratio es un fallo al iniciar según la descripción de Apple, y la interfaz ya no exporta el nombre.24
  3. Busca con grep canOpenURL, NSBundleResourceRequest, originalFilename, FileDocument, deleteEvents, asObjCRenderState y barMinimizeBehavior; los tres primeros solo advierten con un deployment target de 27.0, FileDocument es blando y los tres últimos no compilan, así que el grep es el aviso.4
  4. Si lees HealthKit, llama a earliestAuthorizedSampleDate(for:) después de la autorización y acota la fecha de inicio de cada consulta por tipo; luego decide qué significa una racha o una línea base en una ventana que eligió el usuario.5
  5. Registra el número de build en los reportes de error desde tres lugares: ProcessInfo en el dispositivo, el SystemVersion.plist del SDK en la máquina de compilación y simctl list runtimes para las reproducciones en simulador. Difieren, y una corrección que está en 24A437 puede no estar en 24A434.4
  6. Si construyes URL a partir de cadenas con NSURL(string:), sigue probando en iOS 26: el sistema operativo corrige la doble codificación %25, no tu recompilación, y un mismo binario de Xcode 27 la produce en el runtime 26.5 y no en 27.0.4

Preguntas frecuentes

¿Cuándo salió iOS 27.0 y qué build es?

El lunes 14 de septiembre de 2026, como la build 24A437, la misma que Apple publicó como release candidate el viernes 11 de septiembre. iPadOS 27.0 comparte el número.1

¿Qué build de iOS 27.0 hay en el SDK de Xcode 27?

El SDK iPhoneOS 27.0 dentro de Xcode 27 (27A266a) reporta ProductBuildVersion 24A430, y el runtime del simulador de iOS 27.0 reporta 24A434. Ninguno de los dos es la build del dispositivo.4

¿Qué queda obsoleto en iOS 27?

Las notas enumeran 11 entradas: canOpenURL:, On Demand Resources y NSBundleResourceRequest, PHAssetResource.originalFilename, las API originales de MetricKit, ScrollHitchTimeMetric, FileDocument, el esquema calendar.deleteEvents, __PKStrokeRenderState, el mandato del ciclo de vida por escenas de UIKit, AirPort Utility y una nota de idioma de Weather Highlights. Tres llevan versiones de obsolescencia duras 27.0 en el SDK y solo advierten con un deployment target de 27.0, dos son blandas, dos son renombrados, una es una eliminación y tres no son cambios de API.24

¿Necesito recompilar mi app para iOS 27?

No para que siga funcionando, y las entradas se dividen en tres grupos. Condicionadas por el SDK: las 12 categorías de enlazado con 27 de arriba, que no cambian nada hasta que compilas con el SDK 27.0. A nivel de sistema operativo, y por tanto para todo binario en un dispositivo con 27.0: la restricción del Neural Engine en segundo plano y su entitlement, el flujo de permisos de historial limitado de HealthKit, la aplicación de TLS para el tráfico de MDM y de actualizaciones, el cambio de imágenes de menú en iPadOS 27, la corrección de alertas críticas y la corrección de codificación de NSURL. Binarios de beta: el código de MetricKit compilado contra un SDK beta, que Apple pide recompilar con el SDK GA para evitar fallos. El SDK mínimo de la App Store de Apple son los SDK 26 desde el 28 de abril de 2026; el requisito del SDK 27 es una fecha límite posterior que estas notas no fijan.23

¿Dónde están las notas de la versión de iOS 27?

En el sitio de documentación para desarrolladores de Apple, bajo iOS & iPadOS Release Notes, una página para 27.0, organizada por área con New Features, Resolved Issues, Known Issues y Deprecations bajo cada una. Los conteos de esta publicación provienen de esa página tal como la obtuve el 15 de septiembre de 2026.2

¿La corrección de NSURL está en el SDK o en el sistema operativo?

En el sistema operativo. Un único binario de simulador, compilado con Xcode 27 contra el SDK 27.0 con un iOS mínimo de 26.0, codifica dos veces en un runtime de iOS 26.5 y no lo hace en el runtime de iOS 27.0, y la build de Mac en macOS 26.6.2 también codifica dos veces; nada cambió entre las dos ejecuciones en simulador salvo el sistema operativo.4

Fuentes


  1. Apple, Releases, feed RSS obtenido el 15 de septiembre de 2026: “iOS 27.0 (24A437)”, “iPadOS 27.0 (24A437)”, “macOS 27.0 (26A428)”, “Xcode 27 (27A266a)”, “tvOS 27.0 (24J361)”, “visionOS 27.0 (24M362)” y “watchOS 27.0 (24R364)” con fecha del lunes 14 de septiembre de 2026; “iOS 27.0 RC (24A437)” con fecha del viernes 11 de septiembre de 2026; “iOS 27.0 beta (24A5355q)” con fecha del lunes 8 de junio de 2026. 

  2. Apple, iOS & iPadOS 27 Release Notes, obtenidas el 15 de septiembre de 2026 tras el lanzamiento GA. Los conteos (93 áreas con encabezado; 65 New Features, 197 Resolved Issues, 23 Known Issues, 11 Deprecations) son los elementos de lista bajo los encabezados de cada área. Entradas citadas, por radar: párrafo de Overview; UIKit, New Features (pantalla de inicio 168247372, view controllers presentados 170005251, barra de ámbito 173860616, pantallas externas 177015874, restauración de estado 161843040, imágenes de menú y preferredImageVisibility 170479084, navigationBarMinimization 177953926), Resolved Issues (accesores de la barra de estado 162044221, redimensionamiento 166422120, 178555304, 178558224, 178558897, 178559386, 178560235, 178561952, 178562971, 178573319), Deprecations (ciclo de vida por escenas 141837548, canOpenURL: 179874781); SwiftUI, New Features (TabView 164516837, Text seleccionable 79770704, TextRenderer en Text seleccionable 158160386, .sceneAccessory 175548901, AsyncImage 78212597, @State 105893279, imágenes de menú 170480710, TextInputBorderShape 173362083, toolbarMinimizationBehavior 177954148), Resolved Issues (sheets y popovers 167448274, containerRelativeFrame 165913417, scrollPosition tras tocar la barra de estado 111501113, FB12477370), New Features (LabeledContent en Menu 175594929), Deprecations (FileDocument 178776840); MetricKit, New Features (HitchTimeRatio 180024784) y Deprecations (174892111, 180455992); Foundation, New Features (volumeAvailableCapacityKey 75545872) y Resolved Issues (NSURL 161588649, FB20439045); App Intents, Known Issues (photos.asset 181800016, FB23652582) y Deprecations (calendar.deleteEvent 176751155); On Demand Resources, Deprecations (170066290); PhotoKit, Deprecations (175412725, FB22589474); PencilKit, Deprecations (176410709); AirPort Utility, Deprecations (158364073); Weather Highlights, Deprecations (164408676); HealthKit, New Features (172310874); StoreKit, New Features (141012819); Core AI, New Features (174796039, 179282606); Background Assets, New Features (163944365); Notifications, Resolved Issues (179179362); Network Security, New Features (176055825); Hardware Security, New Features (152103975); System, New Features (160612181) y Resolved Issues (177911316); TextKit, New Features (159870239); SwiftData, Resolved Issues (178113288); Now Playing, Known Issues (186036238); Core Spotlight, Known Issues (183770678); Control Center, Known Issues (184729556); StoreKit Testing in Xcode, Known Issues (184155259, 184255116); Shortcuts, Known Issues (168315587). 

  3. Apple, notas de la versión de App Store Connect, obtenidas el 15 de septiembre de 2026. La entrada del 14 de septiembre de 2026 se cita completa en la tabla; la entrada del 9 de septiembre de 2026 registra las subidas con el SDK de la RC. El mínimo de los SDK 26 desde el 28 de abril de 2026 proviene de la página Upcoming requirements de Apple. 

  4. Reproducción del autor en Xcode 27.0 (27A266a) con DEVELOPER_DIR apuntando a él, macOS 26.6.2 (25G83), 15 de septiembre de 2026. Builds: iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist tiene ProductBuildVersion 24A430 y ProductVersion 27.0; xcrun simctl list runtimes imprime “iOS 27.0 (27.0 - 24A434)”. Encabezados e interfaces, todos bajo iPhoneOS.sdk/System/Library/Frameworks: UIKit.framework/Headers/UIApplication.h línea 98 (canOpenURL:); Foundation.framework/Headers/NSBundle.h líneas 721 a 796 (NSBundleResourceRequest); Photos.framework/Headers/PHAssetResource.h líneas 29 y 33; MetricKit.framework/Headers/MXMetricManager.h línea 32; MetricKit.framework/Modules/MetricKit.swiftmodule/arm64e-apple-ios.swiftinterface, cero coincidencias para ScrollHitchTimeMetric o scrollHitchTime, cuatro para HitchTimeRatio; SwiftUI.framework/Modules/SwiftUI.swiftmodule/arm64e-apple-ios.swiftinterface líneas 23088 a 23093 (FileDocument), 9334 a 9338 (ReferenceFileDocument), 1728 a 1731 (Document), 9489 (mensaje de .roundedBorder), 13763 (toolbarMinimizationBehavior); cero coincidencias de identificador completo para barMinimizeBehavior, barMinimizationSafeAreaAdjustment o toolbarMinimizeBehavior en UIKit.framework/Headers, UIKit.framework/Modules y SwiftUI.framework/Modules (las únicas coincidencias parciales son el modificador toolbarMinimizationSafeAreaAdjustment y su tipo ToolbarMinimizationSafeAreaAdjustment), mientras que UINavigationItem.h declara navigationBarMinimization; AppIntents.framework/Modules/AppIntents.swiftmodule/arm64e-apple-ios.swiftinterface, cero coincidencias para deleteEvents, deleteEvent: some AppIntents::AppSchemaIntent en la línea 12608; PencilKit.framework/Headers/PKStrokeRenderState.h líneas 15 a 17, y PencilKit.framework/Modules/PencilKit.swiftmodule/arm64e-apple-ios.swiftinterface con cero coincidencias para asObjC, convenience public init(_ swiftValue: PencilKit::PKStroke.PencilKit::RenderState) en PKStrokeRenderStateReference en la línea 46, y el inverso public init(_ objcValue: PencilKit::PKStrokeRenderStateReference) dentro de PKStroke.RenderState en la línea 38; StoreKit.framework/Modules/StoreKit.swiftmodule/arm64e-apple-ios.swiftinterface líneas 311 a 322; HealthKit.framework/Modules/HealthKit.swiftmodule/arm64e-apple-ios.swiftinterface líneas 741 y 742 (earliestAuthorizedSampleDate(for:), @available(iOS 27.0, watchOS 27.0, macCatalyst 27.0, macOS 27.0, visionOS 27.0, *)); NowPlaying.framework/Modules/NowPlaying.swiftmodule/arm64e-apple-ios.swiftinterface líneas 180 a 182 y 276 a 278; _CoreSpotlight_FoundationModels.framework/Modules/_CoreSpotlight_FoundationModels.swiftmodule/arm64e-apple-ios.swiftinterface líneas 64 a 78 y 100 a 129. Prueba de photos.asset: un archivo Swift de 15 líneas que importa AppIntents y CoreLocation y declara @AppEntity(schema: .photos.asset) struct ProbeAsset con un EntityQuery, un id, una displayRepresentation y ninguna propiedad del esquema; swiftc -c -target arm64-apple-ios27.0-simulator lo compiló con salida 0 y sin diagnósticos, y -Xfrontend -dump-macro-expansions mostró que la macro añade, bajo un atributo @available(iOS 27.0, macOS 27.0, tvOS 27.0, watchOS 27.0, visionOS 27.0, *), extension ProbeAsset: AssistantSchemaEntity { static let __appSchemaEntity = "photos.asset" } y una extensión AppEntity vacía. Volver a ejecutar la propia línea swift-frontend del driver (capturada con swiftc -###) con -emit-const-values-path y -const-gather-protocols-file apuntando a una lista de 18 protocolos que escribí (AppIntent, AppEntity, AppEnum, AssistantSchemaEntity, EntityQuery y los demás protocolos de App Intents) produjo un archivo .swiftconstvalues, y appintentsmetadataprocessor --module-name ProbeMod --sdk-root <iPhoneSimulator27.0.sdk> --xcode-version 27A266a --platform-family iOS --deployment-target 27.0 --target-triple arm64-apple-ios27.0-simulator sobre él terminó con código 255, “At least one halting error was produced during export” y 12 líneas de la forma “error: Missing required property ‘exposure’ from AppSchemaEntity ‘photos.asset’”, cada una seguida de un fix-it como “var exposure: Double?” (los fix-it de assetType y filter llevan los marcadores <#PhotoAssetType#>? y <#PhotoFilterEffectType#>?; AppIntents.framework/Modules/AppIntents.swiftmodule/arm64e-apple-ios.swiftinterface declara esos nombres en las líneas 11695 y 11705 como AppSchema.Enum("PhotoAssetType") bajo assetType y AppSchema.Enum("PhotoFilterEffectType") bajo filterType); la invocación refleja el paso de metadatos de Xcode pero no es byte por byte la del sistema de compilación, cuya lista de protocolos viene de SWIFT_EMIT_CONST_VALUE_PROTOCOLS. Prueba de advertencias de obsolescencia: un archivo Swift de 11 líneas que importa UIKit, Foundation y Photos, llama a canOpenURL(_:), construye NSBundleResourceRequest(tags:) y lee PHAssetResource.originalFilename, compilado con swiftc -c contra el SDK iPhoneSimulator 27.0 con -target arm64-apple-ios17.0-simulator, ios26.0 e ios27.0: cero diagnósticos en 17.0 y 26.0, tres advertencias [#DeprecatedDeclaration] en 27.0, citadas en el texto. Prueba de NSURL: un archivo Swift de 16 líneas que imprime NSURL(string:)?.absoluteString para las tres entradas de la tabla, compilado con swiftc -O para el anfitrión y, una vez, con swiftc -O -target arm64-apple-ios26.0-simulator contra el SDK iPhoneSimulator 27.0 (otool -l sobre el resultado muestra LC_BUILD_VERSION con minos 26.0 y sdk 27.0); ejecuté ese único binario de simulador con xcrun simctl spawn en un simulador arrancado con el runtime de iOS 26.5 (23F77) y luego en un simulador de iPhone 18 Pro arrancado con el runtime de iOS 27.0 (24A434); las salidas de macOS y de iOS 26.5 fueron idénticas, y todas las salidas son las de la tabla. Prueba de capacidad: URL(fileURLWithPath: NSHomeDirectory()).resourceValues(forKeys: [.volumeAvailableCapacityKey, .volumeTotalCapacityKey, .volumeAvailableCapacityForImportantUsageKey]) más statfs; la ejecución en simulador imprimió volumeAvailableCapacity = 226009026560, f_bavail = 55177985, f_bsize = 4096; la ejecución en el anfitrión imprimió volumeAvailableCapacity = 226009079808, f_bavail = 55177998

  5. Apple, documentación de HealthKit, earliestAuthorizedSampleDate(for:) y Authorizing access to health data, obtenidas el 15 de septiembre de 2026. La página del método lista disponibilidad en iOS 27.0, iPadOS 27.0, Mac Catalyst 27.0, macOS 27.0, visionOS 27.0 y watchOS 27.0 y es la fuente de la oración sobre la fecha de fin y de “Your app can’t distinguish between denied and full access; limited authorization is the only state your app can identify, by design.”; la guía es la fuente de “people can choose to grant your app access to only a limited window of recent data rather than their full history,” de la oración sobre la segunda pantalla y de “Time-bound authorization applies only to sample types.” 

  6. Apple, MXMetricManager, referencia de clase de MetricKit, obtenida el 15 de septiembre de 2026 mediante el JSON de documentación de Apple: la disponibilidad lista iOS 13.0, iPadOS 13.0, Mac Catalyst 13.1, macOS 12.0 y visionOS 1.0 con deprecatedAt 27.0 en cada una, y el resumen de obsolescencia dice “Use MetricManager instead.” 

Artículos relacionados

canOpenURL quedó obsoleto: qué llamar en su lugar

Apple declaró obsoleto canOpenURL y redujo la lista de esquemas permitidos a 25 entradas. El reemplazo y la única compro…

31 min de lectura

La regla de la pantalla de inicio en iOS 27: cuatro claves o rechazo

Compiladas con el SDK de iOS 27, las apps deben declarar una pantalla de inicio o la App Store las rechaza: las cuatro c…

18 min de lectura

Diseñar para el iPhone Duo: qué se mueve, qué se divide y qué se queda

La guía de diseño de Apple para el iPhone Duo y tres Tech Talks, leídos como reglas: dos clases de tamaño en lugar de un…

24 min de lectura