Skip to content

Conversation

vashworth
Copy link
Contributor

@vashworth vashworth commented Mar 17, 2025

Our current adoption/documentation for iOS Extensions does not currently work because it's disallowed to nest bundles (see #142531).

As of Xcode 13, linking to frameworks that contain non-extension-safe code no longer gives warnings (or blocks from App Store it seems). Therefore, it has become a runtime issue to ensure non-extension-safe code is not used.

Previously, we were building and shipping 2 separate Flutter.xcframeworks. One that was extension-safe and one that was not.

This PR removes the "extension_safe" framework and instead makes the entire framework extension-safe by annotating non-extension-safe code with NS_EXTENSION_UNAVAILABLE_IOS and ensuring that code is not used at runtime if the bundle is for an app extension.

This PR also disables wide gamut for app extensions to decrease the chances of crashes (see #165086).

Fixes #142531.


For reference:

App extensions were first evaluated in https://flutter.dev/go/app-extensions. Here is the reasoning why neither method described there is opportune.

Option 1 -
I did look into splitting the framework into 2 frameworks (one with all extension-safe code and one with the non-extension-safe code). However, the original idea was to use objc Categories/Extensions - this doesn’t quite fit our needs. Categories/Extensions only allow you to add new methods/properties, not override existing ones. We could hypothetically add new methods, but that would require the user to change their code to use the new methods.

I also looked into subclasses which does allow overrides, but it would also require the user to change their code to use the new class.

We could do method swizzling, but opinion of that on the internet is that it's not very safe.

I’m of the opinion that anything that requires the user to change code isn’t super feasible due to plugins.

Option 2 -
We could still do the 2 frameworks but rename one to FlutterExtentionSafe. This works without users needing to change any code (including imports like @import Flutter / #import <Flutter/Flutter.h>). I believe the reason this works is because at compile time, it finds the Flutter framework on the framework search path and it imports in the headers. Then at link time, FlutterExtentionSafe is explicitly linked so it uses that framework first when checking for symbols and since it finds all the symbols in FlutterExtentionSafe, it doesn’t need/try to auto-link the Flutter framework (despite Flutter being the framework imported).

This seems precarious to me since we’re relying on Xcode to not auto-link the Flutter framework. If for some reason Flutter framework did get auto-linked (such as the user using a symbol that’s not in the FlutterExtensionSafe framework but is in the Flutter framework - this is unlikely though), we’d get name collision issues

Pre-launch Checklist

If you need help, consider asking for advice on the #hackers-new channel on Discord.

@github-actions github-actions bot added platform-ios iOS applications specifically engine flutter/engine related. See also e: labels. team-ios Owned by iOS platform team labels Mar 17, 2025
@vashworth vashworth marked this pull request as ready for review March 19, 2025 16:08
@vashworth vashworth requested a review from matanlurey as a code owner March 19, 2025 16:08
@vashworth vashworth requested review from cbracken and removed request for matanlurey March 19, 2025 16:08
Copy link
Member

@jmagman jmagman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly minor nits except for the comment about keeping the old artifact for a release cycle, even if it's identical to Flutter.framework.

Comment on lines 92 to 93
'artifacts/engine/ios-profile/extension_safe/Flutter.xcframework/ios-arm64/Flutter.framework/Flutter',
'artifacts/engine/ios-profile/extension_safe/Flutter.xcframework/ios-arm64_x86_64-simulator/Flutter.framework/Flutter',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sooo nice we can make this change atomically with the engine now.

@@ -248,253 +248,6 @@
"sdk_version": "16c5032a"
}
}
},
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we should keep building these artifacts for a release (even though it doesn't really work) in case someone is using it, and then put the deprecation in the tech blog with instructions for migrating? I bet people have prototypes that "work" locally and I don't want them to be mysteriously busted.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine either way as I expect this is a relatively quick and painless fix for users, but agreed, it seems like a good idea to give people a release worth of heads-up in the release notes.

@@ -53,6 +54,12 @@ - (MTLPixelFormat)pixelFormat {
- (BOOL)isWideGamutSupported {
FML_DCHECK(self.screen);

// Wide Gamut is not supported for iOS Extensions due to memory limitations
// (see https://github.com/flutter/flutter/issues/165086).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch figuring out that would help with memory.

Copy link
Member

@cbracken cbracken left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is exciting! Overall looks good!

Copy link
Member

@cbracken cbracken left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM stamp from a Japanese personal seal

[UIApplication sharedApplication].statusBarHidden = hidden;
#else
FML_LOG(WARNING) << "Application based status bar styling is not available in app extension.";
#endif
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So nice to not have preprocessor conditionals in the code anymore!

@vashworth vashworth added the autosubmit Merge PR when tree becomes green via auto submit App label Mar 27, 2025
@auto-submit auto-submit bot added this pull request to the merge queue Mar 27, 2025
Merged via the queue into flutter:master with commit 975a677 Mar 27, 2025
172 of 173 checks passed
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Apr 1, 2025
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Apr 1, 2025
Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions)

Manual roll requested by stuartmorgan@google.com

flutter/flutter@1d954f4...05b5e79

2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185)
2025-03-29 dustingreen@google.com [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181)
2025-03-29 jonahwilliams@google.com move around shaders in vertices uber 1/2 (flutter/flutter#166180)
2025-03-29 jonahwilliams@google.com [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998)
2025-03-28 sokolovskyi.konstantin@gmail.com Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744)
2025-03-28 30870216+gaaclarke@users.noreply.github.com Started clamping scaled antialias lines size (flutter/flutter#166149)
2025-03-28 jason-simmons@users.noreply.github.com Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162)
2025-03-28 58190796+MitchellGoodwin@users.noreply.github.com Remove bringup flag for customer tests (flutter/flutter#166161)
2025-03-28 737941+loic-sharma@users.noreply.github.com Add the ios-reviewers review team (flutter/flutter#166034)
2025-03-28 30870216+gaaclarke@users.noreply.github.com [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035)
2025-03-28 21270878+elliette@users.noreply.github.com [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924)
2025-03-28 31859944+LongCatIsLooong@users.noreply.github.com Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681)
2025-03-28 jonahwilliams@google.com [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520)
2025-03-28 58529443+srujzs@users.noreply.github.com [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324)
2025-03-28 bkonyi@google.com [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091)
2025-03-28 zanderso@users.noreply.github.com Mark Linux coverage as bringup (flutter/flutter#166144)
2025-03-28 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136)
2025-03-28 jonahwilliams@google.com [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938)
2025-03-28 byoungchan.lee@gmx.com [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409)
2025-03-28 andrewrkolos@gmail.com Delete some verbose vm service logging (flutter/flutter#162709)
2025-03-28 andrewrkolos@gmail.com Get analytics welcome message under test (flutter/flutter#162627)
2025-03-28 41930132+hellohuanlin@users.noreply.github.com [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080)
2025-03-28 engine-flutter-autoroll@skia.org Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111)
2025-03-28 jonahwilliams@google.com [CI] remove check for exact golden files. (flutter/flutter#166031)
2025-03-28 robert.ancell@canonical.com Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025)
2025-03-27 jonahwilliams@google.com [android] only release background image readers on Android 14. (flutter/flutter#165942)
2025-03-27 34465683+rkishan516@users.noreply.github.com Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972)
2025-03-27 58190796+MitchellGoodwin@users.noreply.github.com Mark Linux customer tests as flaky (flutter/flutter#166103)
2025-03-27 1063596+reidbaker@users.noreply.github.com Move app link settings task configuration to kotlin (flutter/flutter#165819)
2025-03-27 15619084+vashworth@users.noreply.github.com Make iOS Flutter framework extension-safe (flutter/flutter#165346)
2025-03-27 bkonyi@google.com [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005)
2025-03-27 66560136+Mastermind-sap@users.noreply.github.com Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395)
2025-03-27 92773903+yakagami@users.noreply.github.com add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096)
2025-03-27 bkonyi@google.com Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077)
2025-03-27 engine-flutter-autoroll@skia.org Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060)
2025-03-27 jason-simmons@users.noreply.github.com [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940)
2025-03-27 30870216+gaaclarke@users.noreply.github.com Scale aa lines (flutter/flutter#165917)
2025-03-27 bkonyi@google.com Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059)
2025-03-27 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055)
2025-03-27 engine-flutter-autoroll@skia.org Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046)
2025-03-27 danny@tuppeny.com [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299)
...
CodixNinja pushed a commit to CodixNinja/packages that referenced this pull request May 15, 2025
… (#8960)

Manual roll Flutter from 1d954f4e96bd to 05b5e7910544 (225 revisions)

Manual roll requested by stuartmorgan@google.com

flutter/flutter@1d954f4...05b5e79

2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185)
2025-03-29 dustingreen@google.com [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181)
2025-03-29 jonahwilliams@google.com move around shaders in vertices uber 1/2 (flutter/flutter#166180)
2025-03-29 jonahwilliams@google.com [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998)
2025-03-28 sokolovskyi.konstantin@gmail.com Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744)
2025-03-28 30870216+gaaclarke@users.noreply.github.com Started clamping scaled antialias lines size (flutter/flutter#166149)
2025-03-28 jason-simmons@users.noreply.github.com Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162)
2025-03-28 58190796+MitchellGoodwin@users.noreply.github.com Remove bringup flag for customer tests (flutter/flutter#166161)
2025-03-28 737941+loic-sharma@users.noreply.github.com Add the ios-reviewers review team (flutter/flutter#166034)
2025-03-28 30870216+gaaclarke@users.noreply.github.com [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035)
2025-03-28 21270878+elliette@users.noreply.github.com [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924)
2025-03-28 31859944+LongCatIsLooong@users.noreply.github.com Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681)
2025-03-28 jonahwilliams@google.com [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520)
2025-03-28 58529443+srujzs@users.noreply.github.com [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324)
2025-03-28 bkonyi@google.com [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091)
2025-03-28 zanderso@users.noreply.github.com Mark Linux coverage as bringup (flutter/flutter#166144)
2025-03-28 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136)
2025-03-28 jonahwilliams@google.com [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938)
2025-03-28 byoungchan.lee@gmx.com [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409)
2025-03-28 andrewrkolos@gmail.com Delete some verbose vm service logging (flutter/flutter#162709)
2025-03-28 andrewrkolos@gmail.com Get analytics welcome message under test (flutter/flutter#162627)
2025-03-28 41930132+hellohuanlin@users.noreply.github.com [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080)
2025-03-28 engine-flutter-autoroll@skia.org Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111)
2025-03-28 jonahwilliams@google.com [CI] remove check for exact golden files. (flutter/flutter#166031)
2025-03-28 robert.ancell@canonical.com Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025)
2025-03-27 jonahwilliams@google.com [android] only release background image readers on Android 14. (flutter/flutter#165942)
2025-03-27 34465683+rkishan516@users.noreply.github.com Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972)
2025-03-27 58190796+MitchellGoodwin@users.noreply.github.com Mark Linux customer tests as flaky (flutter/flutter#166103)
2025-03-27 1063596+reidbaker@users.noreply.github.com Move app link settings task configuration to kotlin (flutter/flutter#165819)
2025-03-27 15619084+vashworth@users.noreply.github.com Make iOS Flutter framework extension-safe (flutter/flutter#165346)
2025-03-27 bkonyi@google.com [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005)
2025-03-27 66560136+Mastermind-sap@users.noreply.github.com Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395)
2025-03-27 92773903+yakagami@users.noreply.github.com add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096)
2025-03-27 bkonyi@google.com Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077)
2025-03-27 engine-flutter-autoroll@skia.org Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060)
2025-03-27 jason-simmons@users.noreply.github.com [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940)
2025-03-27 30870216+gaaclarke@users.noreply.github.com Scale aa lines (flutter/flutter#165917)
2025-03-27 bkonyi@google.com Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059)
2025-03-27 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055)
2025-03-27 engine-flutter-autoroll@skia.org Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046)
2025-03-27 danny@tuppeny.com [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299)
...
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request May 20, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request May 20, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request May 21, 2025
androidseb pushed a commit to androidseb/packages that referenced this pull request Jun 8, 2025
…8960)

Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions)

Manual roll requested by stuartmorgan@google.com

flutter/flutter@1d954f4...05b5e79

2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185)
2025-03-29 dustingreen@google.com [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181)
2025-03-29 jonahwilliams@google.com move around shaders in vertices uber 1/2 (flutter/flutter#166180)
2025-03-29 jonahwilliams@google.com [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998)
2025-03-28 sokolovskyi.konstantin@gmail.com Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744)
2025-03-28 30870216+gaaclarke@users.noreply.github.com Started clamping scaled antialias lines size (flutter/flutter#166149)
2025-03-28 jason-simmons@users.noreply.github.com Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162)
2025-03-28 58190796+MitchellGoodwin@users.noreply.github.com Remove bringup flag for customer tests (flutter/flutter#166161)
2025-03-28 737941+loic-sharma@users.noreply.github.com Add the ios-reviewers review team (flutter/flutter#166034)
2025-03-28 30870216+gaaclarke@users.noreply.github.com [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035)
2025-03-28 21270878+elliette@users.noreply.github.com [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924)
2025-03-28 31859944+LongCatIsLooong@users.noreply.github.com Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681)
2025-03-28 jonahwilliams@google.com [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520)
2025-03-28 58529443+srujzs@users.noreply.github.com [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324)
2025-03-28 bkonyi@google.com [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091)
2025-03-28 zanderso@users.noreply.github.com Mark Linux coverage as bringup (flutter/flutter#166144)
2025-03-28 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136)
2025-03-28 jonahwilliams@google.com [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938)
2025-03-28 byoungchan.lee@gmx.com [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409)
2025-03-28 andrewrkolos@gmail.com Delete some verbose vm service logging (flutter/flutter#162709)
2025-03-28 andrewrkolos@gmail.com Get analytics welcome message under test (flutter/flutter#162627)
2025-03-28 41930132+hellohuanlin@users.noreply.github.com [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080)
2025-03-28 engine-flutter-autoroll@skia.org Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111)
2025-03-28 jonahwilliams@google.com [CI] remove check for exact golden files. (flutter/flutter#166031)
2025-03-28 robert.ancell@canonical.com Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025)
2025-03-27 jonahwilliams@google.com [android] only release background image readers on Android 14. (flutter/flutter#165942)
2025-03-27 34465683+rkishan516@users.noreply.github.com Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972)
2025-03-27 58190796+MitchellGoodwin@users.noreply.github.com Mark Linux customer tests as flaky (flutter/flutter#166103)
2025-03-27 1063596+reidbaker@users.noreply.github.com Move app link settings task configuration to kotlin (flutter/flutter#165819)
2025-03-27 15619084+vashworth@users.noreply.github.com Make iOS Flutter framework extension-safe (flutter/flutter#165346)
2025-03-27 bkonyi@google.com [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005)
2025-03-27 66560136+Mastermind-sap@users.noreply.github.com Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395)
2025-03-27 92773903+yakagami@users.noreply.github.com add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096)
2025-03-27 bkonyi@google.com Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077)
2025-03-27 engine-flutter-autoroll@skia.org Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060)
2025-03-27 jason-simmons@users.noreply.github.com [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940)
2025-03-27 30870216+gaaclarke@users.noreply.github.com Scale aa lines (flutter/flutter#165917)
2025-03-27 bkonyi@google.com Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059)
2025-03-27 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055)
2025-03-27 engine-flutter-autoroll@skia.org Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046)
2025-03-27 danny@tuppeny.com [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299)
...
zhangyuang pushed a commit to zhangyuang/flutter-fork that referenced this pull request Jun 9, 2025
Our current
[adoption/documentation](https://docs.flutter.dev/platform-integration/ios/app-extensions)
for iOS Extensions does not currently work because it's disallowed to
nest bundles (see flutter#142531).

As of [Xcode
13](https://developer.apple.com/documentation/xcode-release-notes/xcode-13-release-notes/#:~:text=Linking%20Swift%20packages%20from%20application%20extension%20targets%20or%20watchOS%20applications%20no%20longer%20emits%20unresolvable%20warnings%20about%20linking%20to%20libraries%20not%20safe%20for%20use%20in%20application%20extensions%2E),
linking to frameworks that contain non-extension-safe code no longer
gives warnings (or blocks from App Store it seems). Therefore, it has
become a runtime issue to ensure non-extension-safe code is not used.

Previously, we were building and shipping 2 separate
Flutter.xcframeworks. One that was extension-safe and one that was not.

This PR removes the "extension_safe" framework and instead makes the
entire framework extension-safe by annotating non-extension-safe code
with `NS_EXTENSION_UNAVAILABLE_IOS` and ensuring that code is not used
at runtime if the bundle is for an app extension.

This PR also disables wide gamut for app extensions to decrease the
chances of crashes (see
flutter#165086).

Fixes flutter#142531.
 
 ---
 
For reference:

App extensions were first evaluated in
https://flutter.dev/go/app-extensions. Here is the reasoning why neither
method described there is opportune.

Option 1 -
I did look into splitting the framework into 2 frameworks (one with all
extension-safe code and one with the non-extension-safe code). However,
the original idea was to use objc Categories/Extensions - this doesn’t
quite fit our needs. Categories/Extensions only allow you to add new
methods/properties, not override existing ones. We could hypothetically
add new methods, but that would require the user to change their code to
use the new methods.

I also looked into subclasses which does allow overrides, but it would
also require the user to change their code to use the new class.

We could do method swizzling, but opinion of that on the internet is
that it's not very safe.

I’m of the opinion that anything that requires the user to change code
isn’t super feasible due to plugins.

Option 2 -
We could still do the 2 frameworks but rename one to
`FlutterExtentionSafe`. This works without users needing to change any
code (including imports like `@import Flutter` / `#import
<Flutter/Flutter.h>`). I believe the reason this works is because at
compile time, it finds the `Flutter` framework on the framework search
path and it imports in the headers. Then at link time,
`FlutterExtentionSafe` is explicitly linked so it uses that framework
first when checking for symbols and since it finds all the symbols in
`FlutterExtentionSafe`, it doesn’t need/try to auto-link the `Flutter`
framework (despite `Flutter` being the framework imported).

This seems precarious to me since we’re relying on Xcode to not
auto-link the `Flutter` framework. If for some reason `Flutter`
framework did get auto-linked (such as the user using a symbol that’s
not in the `FlutterExtensionSafe` framework but is in the `Flutter`
framework - this is unlikely though), we’d get name collision issues

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
FMorschel pushed a commit to FMorschel/packages that referenced this pull request Jun 9, 2025
…8960)

Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions)

Manual roll requested by stuartmorgan@google.com

flutter/flutter@1d954f4...05b5e79

2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185)
2025-03-29 dustingreen@google.com [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120)
2025-03-29 engine-flutter-autoroll@skia.org Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181)
2025-03-29 jonahwilliams@google.com move around shaders in vertices uber 1/2 (flutter/flutter#166180)
2025-03-29 jonahwilliams@google.com [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998)
2025-03-28 sokolovskyi.konstantin@gmail.com Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744)
2025-03-28 30870216+gaaclarke@users.noreply.github.com Started clamping scaled antialias lines size (flutter/flutter#166149)
2025-03-28 jason-simmons@users.noreply.github.com Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162)
2025-03-28 58190796+MitchellGoodwin@users.noreply.github.com Remove bringup flag for customer tests (flutter/flutter#166161)
2025-03-28 737941+loic-sharma@users.noreply.github.com Add the ios-reviewers review team (flutter/flutter#166034)
2025-03-28 30870216+gaaclarke@users.noreply.github.com [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035)
2025-03-28 21270878+elliette@users.noreply.github.com [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924)
2025-03-28 31859944+LongCatIsLooong@users.noreply.github.com Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681)
2025-03-28 jonahwilliams@google.com [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520)
2025-03-28 58529443+srujzs@users.noreply.github.com [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324)
2025-03-28 bkonyi@google.com [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091)
2025-03-28 zanderso@users.noreply.github.com Mark Linux coverage as bringup (flutter/flutter#166144)
2025-03-28 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136)
2025-03-28 jonahwilliams@google.com [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938)
2025-03-28 byoungchan.lee@gmx.com [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409)
2025-03-28 andrewrkolos@gmail.com Delete some verbose vm service logging (flutter/flutter#162709)
2025-03-28 andrewrkolos@gmail.com Get analytics welcome message under test (flutter/flutter#162627)
2025-03-28 41930132+hellohuanlin@users.noreply.github.com [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080)
2025-03-28 engine-flutter-autoroll@skia.org Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111)
2025-03-28 jonahwilliams@google.com [CI] remove check for exact golden files. (flutter/flutter#166031)
2025-03-28 robert.ancell@canonical.com Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025)
2025-03-27 jonahwilliams@google.com [android] only release background image readers on Android 14. (flutter/flutter#165942)
2025-03-27 34465683+rkishan516@users.noreply.github.com Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972)
2025-03-27 58190796+MitchellGoodwin@users.noreply.github.com Mark Linux customer tests as flaky (flutter/flutter#166103)
2025-03-27 1063596+reidbaker@users.noreply.github.com Move app link settings task configuration to kotlin (flutter/flutter#165819)
2025-03-27 15619084+vashworth@users.noreply.github.com Make iOS Flutter framework extension-safe (flutter/flutter#165346)
2025-03-27 bkonyi@google.com [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005)
2025-03-27 66560136+Mastermind-sap@users.noreply.github.com Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395)
2025-03-27 92773903+yakagami@users.noreply.github.com add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096)
2025-03-27 bkonyi@google.com Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077)
2025-03-27 engine-flutter-autoroll@skia.org Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060)
2025-03-27 jason-simmons@users.noreply.github.com [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940)
2025-03-27 30870216+gaaclarke@users.noreply.github.com Scale aa lines (flutter/flutter#165917)
2025-03-27 bkonyi@google.com Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059)
2025-03-27 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055)
2025-03-27 engine-flutter-autoroll@skia.org Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046)
2025-03-27 danny@tuppeny.com [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299)
...
romanejaquez pushed a commit to romanejaquez/flutter that referenced this pull request Aug 14, 2025
Our current
[adoption/documentation](https://docs.flutter.dev/platform-integration/ios/app-extensions)
for iOS Extensions does not currently work because it's disallowed to
nest bundles (see flutter#142531).

As of [Xcode
13](https://developer.apple.com/documentation/xcode-release-notes/xcode-13-release-notes/#:~:text=Linking%20Swift%20packages%20from%20application%20extension%20targets%20or%20watchOS%20applications%20no%20longer%20emits%20unresolvable%20warnings%20about%20linking%20to%20libraries%20not%20safe%20for%20use%20in%20application%20extensions%2E),
linking to frameworks that contain non-extension-safe code no longer
gives warnings (or blocks from App Store it seems). Therefore, it has
become a runtime issue to ensure non-extension-safe code is not used.

Previously, we were building and shipping 2 separate
Flutter.xcframeworks. One that was extension-safe and one that was not.

This PR removes the "extension_safe" framework and instead makes the
entire framework extension-safe by annotating non-extension-safe code
with `NS_EXTENSION_UNAVAILABLE_IOS` and ensuring that code is not used
at runtime if the bundle is for an app extension.

This PR also disables wide gamut for app extensions to decrease the
chances of crashes (see
flutter#165086).

Fixes flutter#142531.
 
 ---
 
For reference:

App extensions were first evaluated in
https://flutter.dev/go/app-extensions. Here is the reasoning why neither
method described there is opportune.

Option 1 -
I did look into splitting the framework into 2 frameworks (one with all
extension-safe code and one with the non-extension-safe code). However,
the original idea was to use objc Categories/Extensions - this doesn’t
quite fit our needs. Categories/Extensions only allow you to add new
methods/properties, not override existing ones. We could hypothetically
add new methods, but that would require the user to change their code to
use the new methods.

I also looked into subclasses which does allow overrides, but it would
also require the user to change their code to use the new class.

We could do method swizzling, but opinion of that on the internet is
that it's not very safe.

I’m of the opinion that anything that requires the user to change code
isn’t super feasible due to plugins.

Option 2 -
We could still do the 2 frameworks but rename one to
`FlutterExtentionSafe`. This works without users needing to change any
code (including imports like `@import Flutter` / `#import
<Flutter/Flutter.h>`). I believe the reason this works is because at
compile time, it finds the `Flutter` framework on the framework search
path and it imports in the headers. Then at link time,
`FlutterExtentionSafe` is explicitly linked so it uses that framework
first when checking for symbols and since it finds all the symbols in
`FlutterExtentionSafe`, it doesn’t need/try to auto-link the `Flutter`
framework (despite `Flutter` being the framework imported).

This seems precarious to me since we’re relying on Xcode to not
auto-link the `Flutter` framework. If for some reason `Flutter`
framework did get auto-linked (such as the user using a symbol that’s
not in the `FlutterExtensionSafe` framework but is in the `Flutter`
framework - this is unlikely though), we’d get name collision issues

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
engine flutter/engine related. See also e: labels. platform-ios iOS applications specifically team-ios Owned by iOS platform team
Projects
None yet
Development

Successfully merging this pull request may close these issues.

"Сontains disallowed nested bundles" and "Contains disallowed file 'Frameworks'" Flutter with IOS share extension when deploy to TestFlight
3 participants