Skip to content

feat: optional scene life cycle so the app starts when built with the iOS 27 SDK #145 - #146

Draft
wmcparla wants to merge 1 commit into
bulwarkmail:mainfrom
wmcparla:feat/ios-scene-lifecycle
Draft

wmcparla wants to merge 1 commit into
bulwarkmail:mainfrom
wmcparla:feat/ios-scene-lifecycle

Conversation

@wmcparla

Copy link
Copy Markdown
Contributor

Summary

First step of #145 (iPhone Duo), and unfinished: a draft to show where it stands, not a request to merge.

Built with Xcode 27.1 the app dies at launch on iOS 27 ("UIScene life cycle is required for apps built with this SDK"), and Expo ships a scene delegate only from SDK 57.0.23. This adds a config plugin that adopts scenes: it declares the scene manifest and moves the window and React Native's start from the app delegate into a scene delegate. It is off unless IOS_SCENE_LIFECYCLE=1 is set at prebuild, so the project generated for today's builds is the same as before.

Changes

  • plugins/ios-scene-lifecycle.js (new): the scene manifest in Info.plist and a SceneDelegate appended to AppDelegate.swift; links and user activities go on through the app delegate. It stops the prebuild if the Expo template's AppDelegate no longer has the lines it moves.
  • app.config.js: loads the plugin when IOS_SCENE_LIFECYCLE=1.
  • docs/ios-release.md: the iPhone Duo under "What does not work on iOS yet".

Related issues

Part of #145

Type of change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Refactor / code quality improvement
  • Chore / dependency update / CI change

Checklist

  • I have read the Contributing Guide
  • My code follows the project's code style and conventions
  • npx tsc --noEmit, npx vitest run and npm run i18n:check are clean (not run locally; left to CI on this PR)
  • I have tested my changes locally (on GitHub's runner only, see below)
  • I have added or updated documentation if needed
  • I have updated translations (no new strings)
  • I have included screenshots or a screen recording for UI changes

How it was tested

On GitHub's xcode-27 runner (Xcode 27.1), Release builds for the simulator, started on the iPhone Duo simulator (iOS 27.1) with no account signed in:

Build Result
Xcode 26.6, main starts; reduced size on the outer display
Xcode 27.1, main dies at launch: UIScene life cycle is required
Xcode 27.1, IOS_SCENE_LIFECYCLE=1 starts; fills the outer display

Not tested, and why this stays a draft:

  • Anything past the sign-in screen.
  • Links that start the app (mailto, webmail pairing, the sign-in redirect), push, the widget and the notification extension under scenes.
  • An Xcode 26 build with the plugin on, an iPad, and a real device.
  • The Duo's inner display: the simulator starts closed and its command-line tools cannot open it.

No unit test covers the plugin.

Screenshots

The Duo's outer display. Left: main built with Xcode 26.6. Right: this branch built with Xcode 27.1 and IOS_SCENE_LIFECYCLE=1.

🤖 Generated with Claude Code

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant