chore: [SDK-4364] prepare .NET MAUI demo for Appium E2E tests#173
Merged
Conversation
sherwinski
approved these changes
Apr 24, 2026
Contributor
Author
|
@claude rereview |
e826db0 to
439045a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
One Line Summary
Wires the .NET MAUI demo app up so the shared Appium E2E suite can drive it on iOS and Android, plus the supporting demo refactors and one small SDK fix.
dotnet-and.mov
dotnet-ios-720.mov
Details
Motivation
Linear: SDK-4364. The shared Appium harness in
sdk-shared/appiumalready runs the same spec set against the Flutter, React Native, and Cordova demos. This branch brings the .NET MAUI demo up to the same bar so it can be exercised by the same harness, and pulls in a handful of demo cleanups + one SDK-side null-safety fix that fell out of that work.Scope
Demo app (most of the diff). The demo's UI was reworked so every interactive element has a stable
AutomationId, dialog inputs use plain keyboards with autocorrect / spell-check /InputAccessoryViewdisabled (Appium can't reliably tap through the iOS predictive bar), and the section list is reorganised to match the spec ordering. A few pieces were rewritten more substantially:OneSignalRepositorywas deleted and its callers go directly through the SDK; the repo layer was only there to insulate against an older API and was making things harder to read.LoadingOverlay-> inlineLoadingStateper section so spinners don't block taps on unrelated controls.LogViewremoved in favour ofDebug.WriteLine; the in-app log was never used and added a lot of XAML noise.Dictionary<string, object?>path instead of stringly-typed args, and the underlyingToNativeConversionhelper was taught to forward null values to native dictionaries (previously they were silently dropped).iOS-only demo glue.
Platforms/iOS/PopupKeyboardAvoider.csshiftsCommunityToolkit.Mauipopups out from under the keyboard viaAdditionalSafeAreaInsets, so confirm buttons in tall modals stay tappable for Appium.MauiProgram.csregisters globalEntryHandler/EditorHandlermappings that null outInputAccessoryViewand installs the popup avoider on iOS.NotificationServiceExtension.csprojanddemo.csprojonly applyCodesignTeamId/CodesignProvisionfor device builds so iOS simulator builds work without a provisioning profile.OneSignalWidget/now ships an XcodeGenproject.yml(+ generatedxcodeprojand.gitignore) that produces the Live Activity widget extension, replacing a hand-checked-in debug.appexthat depended on a missing*.debug.dyliband failed to load at runtime. The new build links (but doesn't embed) the OneSignal xcframeworks already shipped underOneSignalSDK.DotNet.iOS.Binding/; the widget resolves them via the host app'sFrameworks/at runtime.SDK change.
OneSignalSDK.DotNet.iOS/Utilities/ToNativeConversion.csnow letsnullvalues through intoNSDictionary(asNSNull) instead of throwing. This keeps parity with the Android binding and is what unblocks the typed-event work above.What is not changing
sdk-sharedand are not in this PR.Testing
Manual testing
Ran the full shared Appium suite locally against the iOS simulator (iPhone 17, iOS 26.2) and Android emulator using
sdk-shared/appium/scripts/run-local.sh --platform=ios --sdk=dotnetand--platform=android --sdk=dotnet. All specs pass, including12_activity.spec.tswhich exercises the rebuilt Live Activity widget.Also exercised the demo by hand on the simulator to confirm the UI changes (loading states, custom-event dialogs, multi-pair alias dialog, popup keyboard avoidance) behave the same or better than before.
Unit testing
No new unit tests. The behaviour this branch cares about is covered by the shared Appium specs.
Affected code checklist
(No SDK-public surface affected; the one SDK file touched is an internal native-conversion helper. Everything else is the demo app.)
Checklist
Overview
Testing
Final pass
Made with Cursor