Skip to content

[Platform deprecation][Apple] Enforce iOS 27 launch prerequisites before 2026-09-09 #5839

Description

@shai-almog

Impact and urgency

Critical — enforcement has already started for apps built with the iOS/iPadOS 27 SDK. The builders still accept legacy launch configuration that can generate a bundle without Apple's required launch-screen metadata, and an explicit ios.uiscene=false can still omit the scene lifecycle. Default Maven builds already enable modern launch metadata; the concrete exposure is the surviving opt-out paths.

This was identified while reviewing Apple's September 14, 2026 production release and App Store Connect update. It is separate from the deployment-target floor migration in #5788 / codenameone/BuildDaemon#220.

Official requirements and dates

  • iOS & iPadOS 27 release notes, UIKit item 168247372: apps linked with SDK 27.0 or later must have a launch screen. Their final Info.plist must declare UILaunchStoryboardName, UILaunchStoryboards, UILaunchScreen, or UILaunchScreens. Apple says rejection begins when it accepts SDK 27 submissions. This is a paraphrase.
  • The same release notes, item 141837548, require the scene lifecycle for apps built with the new SDK; otherwise they fail to launch. Migration guidance.
  • App Store Connect release notes explicitly date SDK 27 RC upload acceptance to 2026-09-09, followed by production SDK 27 upload acceptance on 2026-09-14.
  • Apple Releases dates Xcode 27 (27A266a), iOS 27.0 and iPadOS 27.0 (24A437) to 2026-09-14.
  • TN3192 records the launch-screen requirement in its 2026-06-08 revision, and the SDK 27 full-screen/resizing change in its 2026-08-13 revision. UIRequiresFullScreen=true is not a replacement for a launch screen.

Earliest submission enforcement: 2026-09-09 for SDK 27 RC; production SDK/OS availability: 2026-09-14. These are conditional on using SDK 27. They are not a claim that every existing SDK 26 upload is now prohibited. Apple's separate SDK 27 upload minimum remains April 2027 without a published day.

Concrete applicability

Inspected current default branches on 2026-09-15:

codenameone/CodenameOne, master 45ad6e18031d85d515a45106ebb131166a8dcb3b:

  • IPhoneBuilder.java, injectToPlist(): ios.generateSplashScreens=true disables multitasking and skips the modern launch-key injection at lines 16196–16224. The branch injects UIRequiresFullScreen, which does not satisfy the new launch-screen requirement.
  • The translator Info.plist template supplies NSMainNibFile, but none of the four accepted launch-screen keys. With the legacy hint and no custom plist override, there is no fallback launch-key producer in this path.
  • IPhoneBuilder.java gates UIApplicationSceneManifest on ios.uiscene / CarPlay; an ordinary app explicitly setting ios.uiscene=false skips it. The same hint controls native CN1_USE_UI_SCENE generation and removal of NSMainNibFile.
  • Working-With-iOS.asciidoc still documents opting into ios.generateSplashScreens=true.

codenameone/BuildDaemon, master 0e620085781fffa99f4838b322996a540817be73:

  • IPhoneBuilder.java retains the legacy splash and launch-key conditions; lines 13618 onward gate the scene manifest.
  • Native scene generation defaults the hint to true at line 4007, while plist processing defaults it to false at lines 13456/13589/13618. Audit request normalization before concluding that absent-hint hosted builds are affected; explicit false is the verified opt-out.
  • No SDK 27 guard for either legacy hint was found in either builder.

Affected users: customers retaining old splash-screen or lifecycle hints who build locally or on workers using SDK 27. Failure modes are App Store rejection for absent launch metadata and Apple's documented launch failure for a legacy lifecycle. This is source-backed exposure, not a reproduced customer rejection or device crash.

Migration and internal targets

The normal 90/60/30-day checkpoints against September 9 were 2026-06-11 / 2026-07-11 / 2026-08-10. Those dates have elapsed; the required 30-day buffer cannot be recovered. Do not present future remediation dates as pre-enforcement compliance.

Emergency targets:

  1. 2026-09-15 — investigation: generate minimal projects with each hint separately and together on SDK 26 and 27; inspect the final processed app plist and native lifecycle flags. Audit BuildDaemon request defaults and identify hosted workers using SDK 27.
  2. 2026-09-16 — implementation: enforce SDK-appropriate launch metadata and lifecycle in both producers. Reject incompatible opt-outs with actionable errors or implement a documented safe migration; do not silently discard a custom launch experience. Validate actual plist keys, including customer-injected metadata.
  3. 2026-09-18 — CI/beta validation: assert the final plist contains a valid launch key and phone scene configuration; run iOS/iPadOS 27 cold-launch and resize tests, plus SDK 26 compatibility checks. Validate a signed archive with TestFlight/App Store Connect.
  4. 2026-09-21 — release and communication: publish coordinated Maven/BuildDaemon updates, confirm worker deployment, and update build-hint documentation and customer migration notes. Keep the SDK 27 rollout gated on the required validation.

Risks, unknowns, and verification

  • Hosted worker deployment and signed customer archive behavior were not checked in this review.
  • Custom ios.plistInject, CarPlay, Catalyst, extensions, OpenGL/Metal and legacy NIB handling need separate cases.
  • Resizing support already exists in CodenameOne_GLViewController.viewWillTransitionToSize; do not equate removal of the full-screen opt-out with a proven renderer defect.
  • Inspect the final archived plist rather than only the generator strings. Verify upload acceptance and cold launch with both opt-outs exercised.

Duplicate check

Searched open and closed CodenameOne issues and PRs for the hints, launch-screen/scene wording, SDK 27, enforcement dates, canonical release-note URL and technote identifiers. Related #5218/#5230 cover earlier launch behavior and minimum-OS handling; merged #5788 and BuildDaemon#220 cover deployment floors/toolchain selection. None tracks or removes these SDK 27-incompatible opt-outs. No existing item was modified.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions