How to Publish a .NET MAUI App on the App Store
.NET MAUI (Multi-platform App UI) is Microsoft's cross-platform framework for building native apps with C# and XAML. Publishing MAUI apps to the App Store requires a Mac build host (for compilation) and understanding how .NET's AOT compilation works for iOS. This guide covers the MAUI-specific publishing workflow, from configuring your project for release to navigating Apple's submission process.
Prerequisites
- Visual Studio 2022 17.8+ with .NET MAUI workload (on Mac or Windows with Mac build host)
- A Mac with Xcode 15+ installed (required for iOS compilation)
- An Apple Developer Program membership ($99/year)
- .NET 8+ SDK installed
- Your MAUI app targeting iOS 16.0+
Step-by-Step Build Process
Configure the project for iOS release
In your .csproj file, set the ApplicationId, ApplicationDisplayVersion, and ApplicationVersion. For iOS-specific settings, add `<RuntimeIdentifier>ios-arm64</RuntimeIdentifier>` and `<CodesignKey>` in a Release configuration property group.
Set up the Mac build host
If developing on Windows, connect to a Mac build host via Visual Studio's 'Pair to Mac' feature. The Mac handles all Xcode toolchain operations. Ensure the Mac has the matching .NET SDK and Xcode versions installed.
Publish for iOS
Run `dotnet publish -f net8.0-ios -c Release -p:ArchiveOnBuild=true -p:CodesignKey="Apple Distribution" -p:CodesignProvision="YourProvisioningProfile"`. This creates a signed .ipa file ready for App Store upload.
Alternatively, publish from Visual Studio
Right-click the project > Publish. Select 'App Store' as the distribution method. Visual Studio handles the build, AOT compilation, and archiving process. The resulting archive can be uploaded via Xcode's Transporter app.
Code Signing & Certificates
iOS provisioning for MAUI
Create an App Store distribution provisioning profile in the Apple Developer portal. The bundle ID must match your MAUI project's ApplicationId. Download the profile and install it on the Mac build host.
Distribution certificate
Create an Apple Distribution certificate on the Mac build host via Keychain Access. This certificate is used to sign the .ipa file. For teams, export the certificate as .p12 and share securely with other developers.
Entitlements.plist
Create an Entitlements.plist file in your MAUI project's Platforms/iOS/ directory for any required capabilities (Push Notifications, HealthKit, etc.). Reference it in your .csproj with `<CodesignEntitlements>`.
Store Submission Steps
Upload to App Store Connect
Use Apple's Transporter app (available on the Mac App Store) to upload the .ipa file. Alternatively, if you archived via Xcode's command line tools, use `xcrun altool --upload-app`.
Configure the listing
Create the app in App Store Connect with matching bundle ID. MAUI apps appear as native apps — Apple cannot distinguish them from Swift apps. Fill in metadata, upload screenshots, and set pricing.
Test with TestFlight
Distribute the build via TestFlight to catch any release-specific issues. MAUI's AOT compilation can surface bugs not present in debug (JIT) mode. Pay attention to performance and startup time.
Submit for review
Complete all required sections and submit. Include demo credentials in review notes if authentication is required.
Common Rejection Reasons & Fixes
Guideline 2.1 - Crashes on launch
MAUI apps can crash in release mode due to AOT compilation trimming needed code. Add `[DynamicallyAccessedMembers]` attributes to types used via reflection. Test the Release configuration thoroughly on physical devices.
Guideline 4.0 - Non-native UI feel
MAUI uses native controls by default, but custom renderers or handlers can produce non-native-looking UI. Use iOS-specific styling in your MAUI app using platform-specific code or OnPlatform XAML markup.
Large binary size
MAUI apps include the .NET runtime, which increases binary size. Enable trimming in your .csproj: `<PublishTrimmed>true</PublishTrimmed>`. Use the linker aggressively with `<MtouchLink>Full</MtouchLink>`.
Missing privacy descriptions
Add NSUsageDescription entries in Info.plist (Platforms/iOS/) for any device features accessed via MAUI APIs or NuGet packages (camera, location, photos, etc.).
Pro Tips
- Use .NET MAUI's conditional compilation (#if IOS) for platform-specific behavior rather than runtime checks
- Enable AOT compilation for better iOS performance: `<UseInterpreter>false</UseInterpreter>` in csproj
- Test on real iOS devices frequently — the iOS simulator uses JIT which masks AOT-related issues
- Use NativeAOT when available for even faster startup times (requires .NET 9+)
- Consider using CommunityToolkit.Maui for additional iOS-native controls and behaviors
Skip the hassle. Let us handle it.
Publishing a .NET MAUI app on the App Store (iOS) involves dozens of steps, certificates, and potential rejection pitfalls. Our team handles the entire process for you — from build configuration to store approval.