Avoid KVO on CALayer by introducing an Apple PlatformInterop#30861
Avoid KVO on CALayer by introducing an Apple PlatformInterop#30861PureWeen merged 6 commits intodotnet:inflight/currentfrom
Conversation
rolfbjarne
left a comment
There was a problem hiding this comment.
On a recent macios workload, a regression caused issues with WeakReferences bringing lots of crashes in our app, all tied to KVOs.
What were those crashes? Was a bug report filed?
On a more general note: in my experience swizzling causes more problems than it solves, so I would recommend against it.
...k/PlatformInterop.xcframework/ios-arm64_x86_64-maccatalyst/PlatformInterop.framework/Headers
Outdated
Show resolved
Hide resolved
src/Core/AppleNative/PlatformInterop/PlatformInterop/CALayer+AutoresizingMask.m
Outdated
Show resolved
Hide resolved
I don't have full proof, but this was the Sentry message in our app: It wasn't related to CALayerAutosizeObserver though. But the fact is: So
If we change any of these characteristics it starts crashing. Being able to override the base implementation of CALayer.setBounds on the other hand provides more safety considering we don't have to deal with KVO and weak references at all. |
src/Core/AppleNative/PlatformInterop/PlatformInterop/CALayer+AutoresizingMask.m
Outdated
Show resolved
Hide resolved
src/Core/AppleNative/PlatformInterop/PlatformInterop/CALayer+AutoresizingMask.m
Outdated
Show resolved
Hide resolved
f8a56f8 to
8bac9d0
Compare
8bac9d0 to
0e11125
Compare
|
I've rebased this to |
src/Core/AppleNative/PlatformInterop/PlatformInterop/CALayer+MauiAutoSizeToSuperLayer.m
Outdated
Show resolved
Hide resolved
src/Core/AppleNative/PlatformInterop/PlatformInterop/CALayer+AutoSizeToSuperLayer.h
Outdated
Show resolved
Hide resolved
src/Core/AppleNative/PlatformInterop/PlatformInterop/CALayer+AutoSizeToSuperLayer.h
Outdated
Show resolved
Hide resolved
e1be7b4 to
2d3cd3f
Compare
|
@rolfbjarne thanks for your review, I've applied your suggestions making sure:
|
Just out of curiosity: what kind of issues? |
Building the UITests host app was failing during the linker phase saying that it was unable to extract the xcframework zip contents. I will try again and let you know the precise message. |
@rolfbjarne here's the error |
According to
Strange, but in any case |
rolfbjarne
left a comment
There was a problem hiding this comment.
This looks much better, and no swizzling makes me happy :)
Just a few minor points now
src/Core/AppleNative/PlatformInterop/PlatformInterop/CALayerAutosizeToSuperLayerBehavior.swift
Outdated
Show resolved
Hide resolved
...re/AppleNative/PlatformInterop/MauiPlatformInterop/CALayerAutosizeToSuperLayerBehavior.swift
Outdated
Show resolved
Hide resolved
8afa98d to
afe8905
Compare
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 30861Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 30861" |
|
/azp run |
|
Azure Pipelines successfully started running 3 pipeline(s). |
|
/rebase |
Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
5b22fb0 to
f01d8ca
Compare
### Description of Change On a recent `macios` workload, a regression caused issues with `WeakReference`s bringing lots of crashes in our app, all tied to `KVO`s. It potentially causes an issue with hot-reload which may or may not be related. ``` System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Microsoft.Maui.Platform.StaticCAShapeLayer'. at ObjCRuntime.ThrowHelper.ThrowObjectDisposedException(Object o) in /Users/builder/azdo/_work/2/s/macios/src/ObjCRuntime/ThrowHelper.cs:line 52 at Foundation.NSObject.get_SuperHandle() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 660 at CoreAnimation.CALayer.RemoveFromSuperLayer() in /Users/builder/azdo/_work/2/s/macios/src/build/dotnet/ios/generated-sources/CoreAnimation/CALayer.g.cs:line 783 at Microsoft.Maui.Platform.StaticCAShapeLayer.RemoveFromSuperLayer() at Microsoft.Maui.Platform.ContentView.RemoveContentMask() at Microsoft.Maui.Platform.ContentView.WillRemoveSubview(UIView uiview) at Foundation.NSObject.ReleaseManagedRef() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 458 at Foundation.NSObject.NSObject_Disposer.Drain(NSObject ctx) in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 1072 ``` Given we're never unsubscribing from the KVO legacy observer, what we're doing may lead to issues. This PR introduces an `.xcframework` for Apple platforms which could really help in the future also for other purposes. I moved the observer to a `Swift` implementation which relies on the new KVO API which lets you skip the unsubscribe and all those managed weak-refs. ### Security For security concerns, the MAUI team should use the attached script to re-build the `.xcframework.zip` and commit that on my behalf like we did with Android in the past. <img width="759" height="62" alt="image" src="https://github.com/user-attachments/assets/bd372451-9e39-4a24-9d59-b0dbdadd5258" /> This is how the project looks like: <img width="410" height="406" alt="image" src="https://github.com/user-attachments/assets/7be12553-40ec-4afc-a88e-3109c5c0eb2e" /> --------- Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
### Description of Change On a recent `macios` workload, a regression caused issues with `WeakReference`s bringing lots of crashes in our app, all tied to `KVO`s. It potentially causes an issue with hot-reload which may or may not be related. ``` System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Microsoft.Maui.Platform.StaticCAShapeLayer'. at ObjCRuntime.ThrowHelper.ThrowObjectDisposedException(Object o) in /Users/builder/azdo/_work/2/s/macios/src/ObjCRuntime/ThrowHelper.cs:line 52 at Foundation.NSObject.get_SuperHandle() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 660 at CoreAnimation.CALayer.RemoveFromSuperLayer() in /Users/builder/azdo/_work/2/s/macios/src/build/dotnet/ios/generated-sources/CoreAnimation/CALayer.g.cs:line 783 at Microsoft.Maui.Platform.StaticCAShapeLayer.RemoveFromSuperLayer() at Microsoft.Maui.Platform.ContentView.RemoveContentMask() at Microsoft.Maui.Platform.ContentView.WillRemoveSubview(UIView uiview) at Foundation.NSObject.ReleaseManagedRef() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 458 at Foundation.NSObject.NSObject_Disposer.Drain(NSObject ctx) in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 1072 ``` Given we're never unsubscribing from the KVO legacy observer, what we're doing may lead to issues. This PR introduces an `.xcframework` for Apple platforms which could really help in the future also for other purposes. I moved the observer to a `Swift` implementation which relies on the new KVO API which lets you skip the unsubscribe and all those managed weak-refs. ### Security For security concerns, the MAUI team should use the attached script to re-build the `.xcframework.zip` and commit that on my behalf like we did with Android in the past. <img width="759" height="62" alt="image" src="https://github.com/user-attachments/assets/bd372451-9e39-4a24-9d59-b0dbdadd5258" /> This is how the project looks like: <img width="410" height="406" alt="image" src="https://github.com/user-attachments/assets/7be12553-40ec-4afc-a88e-3109c5c0eb2e" /> --------- Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
### Description of Change On a recent `macios` workload, a regression caused issues with `WeakReference`s bringing lots of crashes in our app, all tied to `KVO`s. It potentially causes an issue with hot-reload which may or may not be related. ``` System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Microsoft.Maui.Platform.StaticCAShapeLayer'. at ObjCRuntime.ThrowHelper.ThrowObjectDisposedException(Object o) in /Users/builder/azdo/_work/2/s/macios/src/ObjCRuntime/ThrowHelper.cs:line 52 at Foundation.NSObject.get_SuperHandle() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 660 at CoreAnimation.CALayer.RemoveFromSuperLayer() in /Users/builder/azdo/_work/2/s/macios/src/build/dotnet/ios/generated-sources/CoreAnimation/CALayer.g.cs:line 783 at Microsoft.Maui.Platform.StaticCAShapeLayer.RemoveFromSuperLayer() at Microsoft.Maui.Platform.ContentView.RemoveContentMask() at Microsoft.Maui.Platform.ContentView.WillRemoveSubview(UIView uiview) at Foundation.NSObject.ReleaseManagedRef() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 458 at Foundation.NSObject.NSObject_Disposer.Drain(NSObject ctx) in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 1072 ``` Given we're never unsubscribing from the KVO legacy observer, what we're doing may lead to issues. This PR introduces an `.xcframework` for Apple platforms which could really help in the future also for other purposes. I moved the observer to a `Swift` implementation which relies on the new KVO API which lets you skip the unsubscribe and all those managed weak-refs. ### Security For security concerns, the MAUI team should use the attached script to re-build the `.xcframework.zip` and commit that on my behalf like we did with Android in the past. <img width="759" height="62" alt="image" src="https://github.com/user-attachments/assets/bd372451-9e39-4a24-9d59-b0dbdadd5258" /> This is how the project looks like: <img width="410" height="406" alt="image" src="https://github.com/user-attachments/assets/7be12553-40ec-4afc-a88e-3109c5c0eb2e" /> --------- Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
### Description of Change On a recent `macios` workload, a regression caused issues with `WeakReference`s bringing lots of crashes in our app, all tied to `KVO`s. It potentially causes an issue with hot-reload which may or may not be related. ``` System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Microsoft.Maui.Platform.StaticCAShapeLayer'. at ObjCRuntime.ThrowHelper.ThrowObjectDisposedException(Object o) in /Users/builder/azdo/_work/2/s/macios/src/ObjCRuntime/ThrowHelper.cs:line 52 at Foundation.NSObject.get_SuperHandle() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 660 at CoreAnimation.CALayer.RemoveFromSuperLayer() in /Users/builder/azdo/_work/2/s/macios/src/build/dotnet/ios/generated-sources/CoreAnimation/CALayer.g.cs:line 783 at Microsoft.Maui.Platform.StaticCAShapeLayer.RemoveFromSuperLayer() at Microsoft.Maui.Platform.ContentView.RemoveContentMask() at Microsoft.Maui.Platform.ContentView.WillRemoveSubview(UIView uiview) at Foundation.NSObject.ReleaseManagedRef() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 458 at Foundation.NSObject.NSObject_Disposer.Drain(NSObject ctx) in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 1072 ``` Given we're never unsubscribing from the KVO legacy observer, what we're doing may lead to issues. This PR introduces an `.xcframework` for Apple platforms which could really help in the future also for other purposes. I moved the observer to a `Swift` implementation which relies on the new KVO API which lets you skip the unsubscribe and all those managed weak-refs. ### Security For security concerns, the MAUI team should use the attached script to re-build the `.xcframework.zip` and commit that on my behalf like we did with Android in the past. <img width="759" height="62" alt="image" src="https://github.com/user-attachments/assets/bd372451-9e39-4a24-9d59-b0dbdadd5258" /> This is how the project looks like: <img width="410" height="406" alt="image" src="https://github.com/user-attachments/assets/7be12553-40ec-4afc-a88e-3109c5c0eb2e" /> --------- Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
### Description of Change On a recent `macios` workload, a regression caused issues with `WeakReference`s bringing lots of crashes in our app, all tied to `KVO`s. It potentially causes an issue with hot-reload which may or may not be related. ``` System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Microsoft.Maui.Platform.StaticCAShapeLayer'. at ObjCRuntime.ThrowHelper.ThrowObjectDisposedException(Object o) in /Users/builder/azdo/_work/2/s/macios/src/ObjCRuntime/ThrowHelper.cs:line 52 at Foundation.NSObject.get_SuperHandle() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 660 at CoreAnimation.CALayer.RemoveFromSuperLayer() in /Users/builder/azdo/_work/2/s/macios/src/build/dotnet/ios/generated-sources/CoreAnimation/CALayer.g.cs:line 783 at Microsoft.Maui.Platform.StaticCAShapeLayer.RemoveFromSuperLayer() at Microsoft.Maui.Platform.ContentView.RemoveContentMask() at Microsoft.Maui.Platform.ContentView.WillRemoveSubview(UIView uiview) at Foundation.NSObject.ReleaseManagedRef() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 458 at Foundation.NSObject.NSObject_Disposer.Drain(NSObject ctx) in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 1072 ``` Given we're never unsubscribing from the KVO legacy observer, what we're doing may lead to issues. This PR introduces an `.xcframework` for Apple platforms which could really help in the future also for other purposes. I moved the observer to a `Swift` implementation which relies on the new KVO API which lets you skip the unsubscribe and all those managed weak-refs. ### Security For security concerns, the MAUI team should use the attached script to re-build the `.xcframework.zip` and commit that on my behalf like we did with Android in the past. <img width="759" height="62" alt="image" src="https://github.com/user-attachments/assets/bd372451-9e39-4a24-9d59-b0dbdadd5258" /> This is how the project looks like: <img width="410" height="406" alt="image" src="https://github.com/user-attachments/assets/7be12553-40ec-4afc-a88e-3109c5c0eb2e" /> --------- Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
### Description of Change On a recent `macios` workload, a regression caused issues with `WeakReference`s bringing lots of crashes in our app, all tied to `KVO`s. It potentially causes an issue with hot-reload which may or may not be related. ``` System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Microsoft.Maui.Platform.StaticCAShapeLayer'. at ObjCRuntime.ThrowHelper.ThrowObjectDisposedException(Object o) in /Users/builder/azdo/_work/2/s/macios/src/ObjCRuntime/ThrowHelper.cs:line 52 at Foundation.NSObject.get_SuperHandle() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 660 at CoreAnimation.CALayer.RemoveFromSuperLayer() in /Users/builder/azdo/_work/2/s/macios/src/build/dotnet/ios/generated-sources/CoreAnimation/CALayer.g.cs:line 783 at Microsoft.Maui.Platform.StaticCAShapeLayer.RemoveFromSuperLayer() at Microsoft.Maui.Platform.ContentView.RemoveContentMask() at Microsoft.Maui.Platform.ContentView.WillRemoveSubview(UIView uiview) at Foundation.NSObject.ReleaseManagedRef() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 458 at Foundation.NSObject.NSObject_Disposer.Drain(NSObject ctx) in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 1072 ``` Given we're never unsubscribing from the KVO legacy observer, what we're doing may lead to issues. This PR introduces an `.xcframework` for Apple platforms which could really help in the future also for other purposes. I moved the observer to a `Swift` implementation which relies on the new KVO API which lets you skip the unsubscribe and all those managed weak-refs. ### Security For security concerns, the MAUI team should use the attached script to re-build the `.xcframework.zip` and commit that on my behalf like we did with Android in the past. <img width="759" height="62" alt="image" src="https://github.com/user-attachments/assets/bd372451-9e39-4a24-9d59-b0dbdadd5258" /> This is how the project looks like: <img width="410" height="406" alt="image" src="https://github.com/user-attachments/assets/7be12553-40ec-4afc-a88e-3109c5c0eb2e" /> --------- Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
### Description of Change On a recent `macios` workload, a regression caused issues with `WeakReference`s bringing lots of crashes in our app, all tied to `KVO`s. It potentially causes an issue with hot-reload which may or may not be related. ``` System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Microsoft.Maui.Platform.StaticCAShapeLayer'. at ObjCRuntime.ThrowHelper.ThrowObjectDisposedException(Object o) in /Users/builder/azdo/_work/2/s/macios/src/ObjCRuntime/ThrowHelper.cs:line 52 at Foundation.NSObject.get_SuperHandle() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 660 at CoreAnimation.CALayer.RemoveFromSuperLayer() in /Users/builder/azdo/_work/2/s/macios/src/build/dotnet/ios/generated-sources/CoreAnimation/CALayer.g.cs:line 783 at Microsoft.Maui.Platform.StaticCAShapeLayer.RemoveFromSuperLayer() at Microsoft.Maui.Platform.ContentView.RemoveContentMask() at Microsoft.Maui.Platform.ContentView.WillRemoveSubview(UIView uiview) at Foundation.NSObject.ReleaseManagedRef() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 458 at Foundation.NSObject.NSObject_Disposer.Drain(NSObject ctx) in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 1072 ``` Given we're never unsubscribing from the KVO legacy observer, what we're doing may lead to issues. This PR introduces an `.xcframework` for Apple platforms which could really help in the future also for other purposes. I moved the observer to a `Swift` implementation which relies on the new KVO API which lets you skip the unsubscribe and all those managed weak-refs. ### Security For security concerns, the MAUI team should use the attached script to re-build the `.xcframework.zip` and commit that on my behalf like we did with Android in the past. <img width="759" height="62" alt="image" src="https://github.com/user-attachments/assets/bd372451-9e39-4a24-9d59-b0dbdadd5258" /> This is how the project looks like: <img width="410" height="406" alt="image" src="https://github.com/user-attachments/assets/7be12553-40ec-4afc-a88e-3109c5c0eb2e" /> --------- Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
## What's Coming .NET MAUI inflight/candidate introduces significant improvements across all platforms with focus on quality, performance, and developer experience. This release includes 27 commits with various improvements, bug fixes, and enhancements. ## CollectionView - [iOS][CV2] Fix page can be dragged down, and it would cause an extra space between Header and EmptyView text by @devanathan-vaithiyanathan in #31840 <details> <summary>🔧 Fixes</summary> - [I8_Header_and_Footer_Null - The page can be dragged down, and it would cause an extra space between Header and EmptyView text.](#31465) </details> - [iOS] Fixed the Items not displayed properly in CarouselView2 by @Ahamed-Ali in #31336 <details> <summary>🔧 Fixes</summary> - [[iOS] Items are not updated properly in CarouselView2.](#31148) </details> ## Docs - Improve Controls Core API docs by @jfversluis in #33240 ## Editor - [iOS] Fixed an issue where an Editor with a small height inside a ScrollView would cause the entire page to scroll by @Tamilarasan-Paranthaman in #27948 <details> <summary>🔧 Fixes</summary> - [[iOS][Editor] An Editor that has not enough height and resides inside a ScrollView/CollectionView will scroll the entire page](#27750) </details> ## Image - [Android] Image control crashes on Android when image width exceeds height by @KarthikRajaKalaimani in #33045 <details> <summary>🔧 Fixes</summary> - [Image control crashes on Android when image width exceeds height](#32869) </details> ## Mediapicker - [Android 🤖] Add a log telling why the request is cancelled by @pictos in #33295 <details> <summary>🔧 Fixes</summary> - [MediaPicker.PickPhotosAsync throwing TaskCancelledException in net10-android](#33283) </details> ## Navigation - [Android] Fix for App Hang When PopModalAsync Is Called Immediately After PushModalAsync with Task.Yield() by @BagavathiPerumal in #32479 <details> <summary>🔧 Fixes</summary> - [App hangs if PopModalAsync is called after PushModalAsync with single await Task.Yield()](#32310) </details> - [iOS 26] Navigation hangs after rapidly open and closing new page using Navigation.PushAsync - fix by @kubaflo in #32456 <details> <summary>🔧 Fixes</summary> - [[iOS 26] Navigation hangs after rapidly open and closing new page using Navigation.PushAsync](#32425) </details> ## Pages - [iOS] Fix ContentPage BackgroundImageSource not working by @Shalini-Ashokan in #33297 <details> <summary>🔧 Fixes</summary> - [.Net MAUI- Page.BackgroundImageSource not working for iOS](#21594) </details> ## RadioButton - [Issue-Resolver] Fix #33264 - RadioButtonGroup not working with Collection View by @kubaflo in #33343 <details> <summary>🔧 Fixes</summary> - [RadioButtonGroup not working with CollectionView](#33264) </details> ## SafeArea - [Android] Fixed Label Overlapped by Android Status Bar When Using SafeAreaEdges="Container" in .NET MAUI by @NirmalKumarYuvaraj in #33285 <details> <summary>🔧 Fixes</summary> - [SafeAreaEdges works correctly only on the first tab in Shell. Other tabs have content colliding with the display cutout in the landscape mode.](#33034) - [Label Overlapped by Android Status Bar When Using SafeAreaEdges="Container" in .NET MAUI](#32941) - [[MAUI 10] Layout breaks on first navigation (Shell // route) until soft keyboard appears/disappears (Android + iOS)](#33038) </details> ## ScrollView - [Windows, Android] Fix ScrollView Content Not Removed When Set to Null by @devanathan-vaithiyanathan in #33069 <details> <summary>🔧 Fixes</summary> - [[Windows, Android] ScrollView Content Not Removed When Set to Null](#33067) </details> ## Searchbar - Fix Android crash when changing shared Drawable tint on Searchbar by @tritter in #33071 <details> <summary>🔧 Fixes</summary> - [[Android] Crash on changing Tint of Searchbar](#33070) </details> ## Shell - [iOS] - Fix Custom FlyoutIcon from Being Overridden to Default Color in Shell by @prakashKannanSf3972 in #27580 <details> <summary>🔧 Fixes</summary> - [Change the flyout icon color](#6738) </details> - [iOS] Fix Shell NavBarIsVisible updates when switching ShellContent by @Vignesh-SF3580 in #33195 <details> <summary>🔧 Fixes</summary> - [[iOS] Shell NavBarIsVisible is not updated when changing ShellContent](#33191) </details> ## Slider - [C] Fix Slider and Stepper property order independence by @StephaneDelcroix in #32939 <details> <summary>🔧 Fixes</summary> - [Slider Binding Initialization Order Causes Incorrect Value Assignment in XAML](#32903) - [Slider is very broken, Value is a mess when setting Minimum](#14472) - [Slider is buggy depending on order of properties](#18910) - [Stepper Value is incorrectly clamped to default min/max when using bindableproperties in MVVM pattern](#12243) - [[Issue-Resolver] Fix #32903 - Sliderbinding initialization order issue](#32907) </details> ## Stepper - [Windows] Maui Stepper: Clamp minimum and maximum value by @OomJan in #33275 <details> <summary>🔧 Fixes</summary> - [[Windows] Maui Stepper is not clamped to minimum or maximum internally](#33274) </details> - [iOS] Fixed the UIStepper Value from being clamped based on old higher MinimumValue - Candidate PR test failure fix- 33363 by @Ahamed-Ali in #33392 ## TabbedPage - [windows] Fixed Rapid change of selected tab results in crash. by @praveenkumarkarunanithi in #33113 <details> <summary>🔧 Fixes</summary> - [Rapid change of selected tab results in crash on Windows.](#32824) </details> ## Titlebar - [Mac] Fix TitleBar Content Overlapping with Traffic Light Buttons on Latest macOS Version by @devanathan-vaithiyanathan in #33157 <details> <summary>🔧 Fixes</summary> - [TitleBar Content Overlapping with Traffic Light Buttons on Latest macOS Version](#33136) </details> ## Xaml - Fix for Control does not update from binding anymore after MultiBinding.ConvertBack is called by @BagavathiPerumal in #33128 <details> <summary>🔧 Fixes</summary> - [Control does not update from binding anymore after MultiBinding.ConvertBack is called](#24969) - [The issue with the MultiBinding converter with two way binding mode does not work properly when changing the values.](#20382) </details> <details> <summary>🔧 Infrastructure (1)</summary> - Avoid KVO on CALayer by introducing an Apple PlatformInterop by @albyrock87 in #30861 </details> <details> <summary>🧪 Testing (2)</summary> - [Testing] Enable UITest Issue18193 on MacCatalyst by @NafeelaNazhir in #31653 <details> <summary>🔧 Fixes</summary> - [Test Issue18193 was disabled on Mac Catalyst](#27206) </details> - Set the CV2 handlers as the default by @Ahamed-Ali in #33177 </details> <details> <summary>📦 Other (3)</summary> - Update WindowsAppSDK to 1.8 by @mattleibow in #32174 <details> <summary>🔧 Fixes</summary> - [Update to WindowsAppSDK](#30858) </details> - Fix command dependency reentrancy by @simonrozsival in #33129 - Fix SafeArea AdjustPan handling and add AdjustNothing mode tests by @PureWeen via @Copilot in #33354 </details> **Full Changelog**: main...inflight/candidate
…30861) ### Description of Change On a recent `macios` workload, a regression caused issues with `WeakReference`s bringing lots of crashes in our app, all tied to `KVO`s. It potentially causes an issue with hot-reload which may or may not be related. ``` System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Microsoft.Maui.Platform.StaticCAShapeLayer'. at ObjCRuntime.ThrowHelper.ThrowObjectDisposedException(Object o) in /Users/builder/azdo/_work/2/s/macios/src/ObjCRuntime/ThrowHelper.cs:line 52 at Foundation.NSObject.get_SuperHandle() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 660 at CoreAnimation.CALayer.RemoveFromSuperLayer() in /Users/builder/azdo/_work/2/s/macios/src/build/dotnet/ios/generated-sources/CoreAnimation/CALayer.g.cs:line 783 at Microsoft.Maui.Platform.StaticCAShapeLayer.RemoveFromSuperLayer() at Microsoft.Maui.Platform.ContentView.RemoveContentMask() at Microsoft.Maui.Platform.ContentView.WillRemoveSubview(UIView uiview) at Foundation.NSObject.ReleaseManagedRef() in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 458 at Foundation.NSObject.NSObject_Disposer.Drain(NSObject ctx) in /Users/builder/azdo/_work/2/s/macios/src/Foundation/NSObject2.cs:line 1072 ``` Given we're never unsubscribing from the KVO legacy observer, what we're doing may lead to issues. This PR introduces an `.xcframework` for Apple platforms which could really help in the future also for other purposes. I moved the observer to a `Swift` implementation which relies on the new KVO API which lets you skip the unsubscribe and all those managed weak-refs. ### Security For security concerns, the MAUI team should use the attached script to re-build the `.xcframework.zip` and commit that on my behalf like we did with Android in the past. <img width="759" height="62" alt="image" src="https://github.com/user-attachments/assets/bd372451-9e39-4a24-9d59-b0dbdadd5258" /> This is how the project looks like: <img width="410" height="406" alt="image" src="https://github.com/user-attachments/assets/7be12553-40ec-4afc-a88e-3109c5c0eb2e" /> --------- Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
Description of Change
On a recent
maciosworkload, a regression caused issues withWeakReferences bringing lots of crashes in our app, all tied toKVOs.It potentially causes an issue with hot-reload which may or may not be related.
Given we're never unsubscribing from the KVO legacy observer, what we're doing may lead to issues.
This PR introduces an
.xcframeworkfor Apple platforms which could really help in the future also for other purposes.I moved the observer to a
Swiftimplementation which relies on the new KVO API which lets you skip the unsubscribe and all those managed weak-refs.Security
For security concerns, the MAUI team should use the attached script to re-build the
.xcframework.zipand commit that on my behalf like we did with Android in the past.This is how the project looks like:
