
Xamarin Ios Migration
- 21 installs
- 163 repo stars
- Updated July 6, 2026
- davidortinau/maui-skills
Guides migrating Xamarin.iOS, Xamarin.Mac, and Xamarin.tvOS native apps to .NET for iOS/macOS/tvOS, covering SDK-style project conversion and code signing.
About
Walks through converting Xamarin.iOS/Mac/tvOS projects to modern .NET, updating MSBuild properties, Info.plist, NuGet dependencies, binding libraries, and code-signing settings. A developer uses it when upgrading a legacy Xamarin Apple app to .NET SDK-style projects.
- Covers MtouchArch to RuntimeIdentifier and CodeSigningKey to CodesignKey renames
- Flags that Xamarin iOS/Mac NuGet packages have no backward compatibility
Xamarin Ios Migration by the numbers
- 21 all-time installs (skills.sh)
- Ranked #105 of 153 .NET & C# skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/davidortinau/maui-skills --skill xamarin-ios-migrationAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 21 |
|---|---|
| repo stars | ★ 163 |
| Last updated | July 6, 2026 |
| Repository | davidortinau/maui-skills ↗ |
What it does
Guides migrating Xamarin.iOS, Xamarin.Mac, and Xamarin.tvOS native apps to .NET for iOS/macOS/tvOS, covering SDK-style project conversion and code signing.
Files
Xamarin.iOS / Xamarin.Mac / Xamarin.tvOS → .NET Migration
For SDK-style project templates, MSBuild property tables, RuntimeIdentifier conversion tables, and namespace mappings, see references/ios-migration-api.md.
Migration Workflow
1. Create new .NET for iOS/macOS/tvOS project (same name, copy code into it) 2. Update MSBuild properties (see references/ios-migration-api.md) 3. Move MinimumOSVersion from Info.plist → SupportedOSPlatformVersion in csproj 4. Copy code, resources, storyboards, entitlements 5. Update NuGet dependencies 6. Migrate binding libraries (if applicable) 7. Replace Xamarin.Essentials with <UseMauiEssentials>true</UseMauiEssentials> 8. Remove .dll.config files (not supported in .NET) 9. Delete bin//obj/, build, verify code signing, test on device
Strategy: Create a new project and copy code into it — don't edit the existing project file.
Critical Gotchas
⚠️ No Backward Compatibility for iOS/Mac NuGet Packages
Unlike Android, there is no backward compatibility with old Xamarin iOS/Mac TFMs. Packages targeting monotouch, xamarinios, xamarinios10, monomac, or xamarinmac will not work — they must be recompiled for net8.0-ios etc.
⚠️ CodeSigningKey → CodesignKey Rename
<!-- ❌ Old property name — silently ignored -->
<CodeSigningKey>Apple Distribution: My Company</CodeSigningKey>
<!-- ✅ Renamed property -->
<CodesignKey>Apple Distribution: My Company</CodesignKey>Also rename MtouchEnableSGenConc → EnableSGenConc.
⚠️ No .dll.config or .exe.config Support
.dll.config and <dllmap> are not supported in .NET Core. Migrate configuration to appsettings.json, embedded resources, or platform preferences.
⚠️ watchOS Is Not Supported
Xamarin.watchOS has no .NET equivalent. Bundle Swift extensions with .NET for iOS apps instead.
⚠️ OpenGL (iOS) Is Not Supported
OpenTK is unavailable in .NET for iOS. Migrate to Metal or SceneKit.
⚠️ Linker Behavior Is Stricter
Update LinkDescription XML files if custom linker configuration was used. The linker in .NET is stricter and may trim symbols that the Xamarin linker preserved.
Platform-Specific Pitfalls
| Pitfall | Impact | Mitigation |
|---|---|---|
| iOS/Mac NuGet packages not backward-compatible | Build failures for packages targeting xamarinios | Recompile or find .NET-compatible alternatives |
CodeSigningKey silently ignored | App fails to sign but no clear error | Rename to CodesignKey |
MtouchArch not converted | Wrong architecture targeted | Convert to RuntimeIdentifier(s) — see reference tables |
MinimumOSVersion left in Info.plist | Ignored — uses csproj value | Move to SupportedOSPlatformVersion |
| Entitlements path wrong | Build succeeds but runtime failures | Verify CodesignEntitlements points to correct file |
.dll.config files present | Silently ignored at runtime | Remove and migrate to alternatives |
Binding Library Migration Tips
- Use SDK-style project format with
net8.0-iosTFM - The binding generator and API definitions work the same way
- Verify native frameworks are updated for the target iOS version
- Test thoroughly — binding edge cases are common in .NET migrations
NuGet Compatibility Decision
| Situation | Action |
|---|---|
| You own the package | Recompile with .NET TFMs |
| Package has preview .NET version | Use preview |
| No compatible version | Replace with .NET-compatible alternative |
| .NET Standard library (no platform deps) | ✅ Still works |
Build Troubleshooting
| Issue | Fix |
|---|---|
| Namespace not found | Most UIKit namespaces are unchanged — verify against .NET for iOS API surface |
| Linker errors | Update LinkDescription XML files — linker is stricter in .NET |
| Code signing failure | Verify CodesignKey, CodesignProvision, CodesignEntitlements |
| Entitlements mismatch | Ensure entitlements file matches provisioning profile |
API Currency Warning
If your migrated app will also adopt .NET MAUI controls (e.g., via UseMaui), check the maui-current-apis skill for deprecated MAUI APIs to avoid (ListView, Frame, Device.*, etc.).
Quick Checklist
1. ☐ Created new .NET for iOS/macOS/tvOS project 2. ☐ Set TargetFramework to net8.0-ios (or -macos/-tvos) 3. ☐ Moved MinimumOSVersion → SupportedOSPlatformVersion in csproj 4. ☐ Converted MtouchArch → RuntimeIdentifier(s) 5. ☐ Converted HttpClientHandler → UseNativeHttpHandler 6. ☐ Renamed CodeSigningKey → CodesignKey 7. ☐ Renamed MtouchEnableSGenConc → EnableSGenConc 8. ☐ Copied source, resources, storyboards, entitlements 9. ☐ Updated NuGet dependencies (no backward compat with Xamarin TFMs!) 10. ☐ Added UseMauiEssentials + Platform.Init() if using Essentials 11. ☐ Removed .dll.config files 12. ☐ Deleted bin/ and obj/ folders 13. ☐ Verified code signing and provisioning 14. ☐ Tested on physical device
Xamarin.iOS / Xamarin.Mac / Xamarin.tvOS Migration API Reference
SDK-Style Project File Templates
.NET for iOS
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-ios</TargetFramework>
<OutputType>Exe</OutputType>
<Nullable>enable</Nullable>
<ImplicitUsings>true</ImplicitUsings>
<SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
</PropertyGroup>
</Project>.NET for macOS (Mac Catalyst)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-macos</TargetFramework>
<OutputType>Exe</OutputType>
<Nullable>enable</Nullable>
<ImplicitUsings>true</ImplicitUsings>
<SupportedOSPlatformVersion>10.15</SupportedOSPlatformVersion>
</PropertyGroup>
</Project>.NET for tvOS
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-tvos</TargetFramework>
<OutputType>Exe</OutputType>
<Nullable>enable</Nullable>
<ImplicitUsings>true</ImplicitUsings>
<SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
</PropertyGroup>
</Project>For library projects, omit <OutputType> or set to Library.
Replacenet8.0withnet9.0ornet10.0as appropriate. Valid TFMs:
net8.0-ios,net8.0-macos,net8.0-tvos.
---
MSBuild Property Changes
| Xamarin Property | .NET Equivalent | Action |
|---|---|---|
MtouchArch / XamMacArch | RuntimeIdentifier / RuntimeIdentifiers | Convert (see table below) |
HttpClientHandler / MtouchHttpClientHandler | UseNativeHttpHandler | Convert (see table below) |
MtouchExtraArgs | (some still apply) | Copy and test |
EnableCodeSigning | (unchanged) | Copy |
CodeSigningKey | CodesignKey | Rename |
CodesignKey | (unchanged) | Copy |
CodesignProvision | (unchanged) | Copy |
CodesignEntitlements | (unchanged) | Copy |
CodesignExtraArgs | (unchanged) | Copy |
PackageSigningKey | (unchanged) | Copy |
PackagingExtraArgs | (unchanged) | Copy |
ProductDefinition | (unchanged) | Copy |
MtouchEnableSGenConc | EnableSGenConc | Rename |
LinkDescription | (unchanged) | Copy |
---
MtouchArch → RuntimeIdentifier Conversion
iOS
| MtouchArch Value | RuntimeIdentifier | RuntimeIdentifiers |
|---|---|---|
ARMv7 | ios-arm | |
ARMv7s | ios-arm | |
ARMv7+ARMv7s | ios-arm | |
ARM64 | ios-arm64 | |
ARMv7+ARM64 | ios-arm;ios-arm64 | |
ARMv7+ARMv7s+ARM64 | ios-arm;ios-arm64 | |
x86_64 | iossimulator-x64 | |
i386 | iossimulator-x86 | |
x86_64+i386 | iossimulator-x86;iossimulator-x64 |
Use RuntimeIdentifiers (plural) when targeting multiple architectures.macOS
| Value | RuntimeIdentifier |
|---|---|
x86_64 | osx-x64 |
tvOS
| Value | RuntimeIdentifier |
|---|---|
ARM64 | tvos-arm64 |
x86_64 | tvossimulator-x64 |
---
HttpClientHandler Conversion
| Xamarin Value | UseNativeHttpHandler |
|---|---|
HttpClientHandler | false |
NSUrlSessionHandler | (don't set — default) |
CFNetworkHandler | (don't set — default) |
---
Info.plist Changes
Move MinimumOSVersion / LSMinimumSystemVersion from Info.plist to the project file:
<!-- BEFORE (Info.plist) -->
<key>MinimumOSVersion</key>
<string>13.0</string>
<!-- AFTER (csproj) -->
<PropertyGroup>
<SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
</PropertyGroup>Other Info.plist entries (display name, bundle identifier, permissions, etc.) remain in Info.plist.
---
NuGet Dependency Compatibility
| Compatible Frameworks | Incompatible Frameworks |
|---|---|
net8.0-ios | monotouch, xamarinios, xamarinios10 |
net8.0-macos | monomac, xamarinmac, xamarinmac20 |
net8.0-tvos | xamarintvos |
Unlike Android, there is no backward compatibility with old Xamarin iOS/Mac
TFMs. Packages must be recompiled for net8.0-ios etc..NET Standard libraries without incompatible dependencies remain compatible.
---
Xamarin.Essentials Namespace Mapping
| Xamarin.Essentials | .NET MAUI Namespace |
|---|---|
| App actions, permissions, version tracking | Microsoft.Maui.ApplicationModel |
| Contacts, email, networking | Microsoft.Maui.ApplicationModel.Communication |
| Battery, sensors, flashlight, haptics | Microsoft.Maui.Devices |
| Media picking, text-to-speech | Microsoft.Maui.Media |
| Clipboard, file sharing | Microsoft.Maui.ApplicationModel.DataTransfer |
| File picking, secure storage, preferences | Microsoft.Maui.Storage |
Essentials Initialization (iOS)
using Microsoft.Maui.ApplicationModel;
[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
public override UIWindow? Window { get; set; }
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
Window = new UIWindow(UIScreen.MainScreen.Bounds);
var vc = new UIViewController();
Window.RootViewController = vc;
Platform.Init(() => vc);
Window.MakeKeyAndVisible();
return true;
}
}App Actions Override
public override void PerformActionForShortcutItem(
UIApplication application,
UIApplicationShortcutItem shortcutItem,
UIOperationHandler completionHandler)
{
Platform.PerformActionForShortcutItem(application, shortcutItem, completionHandler);
}---
Supported / Unsupported Project Types
| Project Type | Status |
|---|---|
| Xamarin.iOS | ✅ Supported |
| Xamarin.Mac | ✅ Supported |
| Xamarin.tvOS | ✅ Supported |
| iOS App Extensions | ✅ Supported |
| SpriteKit / SceneKit / Metal | ✅ Supported |
| Xamarin.watchOS | ❌ Not supported |
| OpenGL (iOS) | ❌ Not supported (OpenTK unavailable) |