Updating Existing Xamarin.Forms Apps
Follow these steps to update an existing Xamarin.Forms app to use the Unified API and update to version 1.3.1
Important
Because Xamarin.Forms 1.3.1 is the first release that supports the Unified API, the entire solution should be updated to use the latest version at the same time as migrating the iOS app to Unified. This means that in addition to updating the iOS project for Unified support, you'll also need to edit code in all the projects in the solution.
The update is performed in two steps:
Migrate the iOS app to the Unified API using Visual Studio for Mac's build in migration tool.
Use the migration tool to automatically update the project.
Update iOS native APIs as outlined in the instructions to update iOS apps (specifically in custom renderer or dependency service code).
Update the entire solution to Xamarin.Forms version 1.3.
Install the Xamarin.Forms 1.3.1 NuGet package.
Update the
App
class in the shared code.Update the
AppDelegate
in the iOS project.Update the
MainActivity
in the Android project.Update the
MainPage
in the Windows Phone project.
1. iOS App (Unified Migration)
Part of the migration requires upgrading Xamarin.Forms to version 1.3, which supports the Unified API. In order for the correct assembly references to be created, we first need to update the iOS project to use the Unified API.
Migration Tool
Click on the iOS project so that it's selected, then choose Project > Migrate to Xamarin.iOS Unified API... and agree to the warning message that appears.
This will automatically:
- Change the project type to support the Unified 64-bit API.
- Change the framework reference to Xamarin.iOS (replacing the old monotouch reference).
- Change the namespace references in the code to remove the
MonoTouch
prefix. - Update the csproj file to use the correct build targets for the Unified API.
Clean and Build the project to ensure there are no other errors to fix. No further action should be required. These steps are explained in more detail in the Unified API docs.
Update native iOS APIs (if required)
If you have added additional iOS native code (such as custom renderers or dependency services) you may need to perform additional manual code fixes. Re-compile your app and refer to the Updating Existing iOS Apps instructions for additional information on changes that may be required. These tips will also help identify changes that are required.
2. Xamarin.Forms 1.3.1 Update
Once the iOS app has been updated to the Unified API, the rest of the solution needs to be updated to Xamarin.Forms version 1.3.1. This includes:
- Updating the Xamarin.Forms NuGet package in each project.
- Changing the code to use the new Xamarin.Forms
Application
,FormsApplicationDelegate
(iOS),FormsApplicationActivity
(Android), andFormsApplicationPage
(Windows Phone) classes.
These steps are explained below:
2.1 Update NuGet in all Projects
Update Xamarin.Forms to 1.3.1 pre-release using the NuGet Package Manager for all projects in the solution: PCL (if present), iOS, Android, and Windows Phone. It is recommended that you delete and re-add the Xamarin.Forms NuGet package to update to version 1.3.
Note
Xamarin.Forms version 1.3.1 is currently in pre-release. This means you must select the pre-release option in NuGet (via a tick-box in Visual Studio for Mac or a drop-down-list in Visual Studio) to see the latest pre-release version.
Important
If you are using Visual Studio, ensure the latest version of the NuGet Package Manager is installed. Older versions of NuGet in Visual Studio will not correctly install the Unified version of Xamarin.Forms 1.3.1. Go to Tools > Extensions and Updates... and click on the Installed list to check that the NuGet Package Manager for Visual Studio is at least version 2.8.5. If it is older, click on the Updates list to download the latest version.
Once you've updated the NuGet package to Xamarin.Forms 1.3.1, make the following changes in each project to upgrade to the new Xamarin.Forms.Application
class.
2.2 Portable Class Library (or Shared Project)
Change the App.cs file so that:
- The
App
class now inherits fromApplication
. - The
MainPage
property is set to the first content page you wish to display.
public class App : Application // superclass new in 1.3
{
public App ()
{
// The root page of your application
MainPage = new ContentPage {...}; // property new in 1.3
}
We have completely removed the GetMainPage
method, and instead set the MainPage
property on the Application
subclass.
This new Application
base class also supports the OnStart
, OnSleep
, and OnResume
overrides to help you manage your application's lifecycle.
The App
class is then passed to a new LoadApplication
method in each app project, as described below:
2.3 iOS App
Change the AppDelegate.cs file so that:
- The class inherits from
FormsApplicationDelegate
(instead ofUIApplicationDelegate
previously). LoadApplication
is called with a new instance ofApp
.
[Register ("AppDelegate")]
public partial class AppDelegate :
global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate // superclass new in 1.3
{
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init ();
LoadApplication (new App ()); // method is new in 1.3
return base.FinishedLaunching (app, options);
}
}
2.3 Android App
Change the MainActivity.cs file so that:
- The class inherits from
FormsApplicationActivity
(instead ofFormsActivity
previously). LoadApplication
is called with a new instance ofApp
[Activity (Label = "YOURAPPNAM", Icon = "@drawable/icon", MainLauncher = true,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity :
global::Xamarin.Forms.Platform.Android.FormsApplicationActivity // superclass new in 1.3
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
global::Xamarin.Forms.Forms.Init (this, bundle);
LoadApplication (new App ()); // method is new in 1.3
}
}
2.4 Windows Phone App
We need to update the MainPage - both the XAML and the codebehind.
Change the MainPage.xaml file so that:
- The root XAML element should be
winPhone:FormsApplicationPage
. - The
xmlns:phone
attribute should be changed toxmlns:winPhone="clr-namespace:Xamarin.Forms.Platform.WinPhone;assembly=Xamarin.Forms.Platform.WP8"
An updated example is shown below - you should only have to edit these things (the rest of the attributes should remain the same):
<winPhone:FormsApplicationPage
...
xmlns:winPhone="clr-namespace:Xamarin.Forms.Platform.WinPhone;assembly=Xamarin.Forms.Platform.WP8"
...>
</winPhone:FormsApplicationPage>
Change the MainPage.xaml.cs file so that:
- The class inherits from
FormsApplicationPage
(instead ofPhoneApplicationPage
previously). LoadApplication
is called with a new instance of the Xamarin.FormsApp
class. You may need to fully qualify this reference since Windows Phone has it's ownApp
class already defined.
public partial class MainPage : global::Xamarin.Forms.Platform.WinPhone.FormsApplicationPage // superclass new in 1.3
{
public MainPage()
{
InitializeComponent();
SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;
global::Xamarin.Forms.Forms.Init();
LoadApplication(new YOUR_APP_NAMESPACE.App()); // new in 1.3
}
}
Troubleshooting
Occasionally you will see an error similar to this after updating the Xamarin.Forms NuGet package. It occurs when the NuGet updater does not completely remove references to older versions from your csproj files.
YOUR_PROJECT.csproj: Error: This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see https://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ../../packages/Xamarin.Forms.1.2.3.6257/build/portable-win+net45+wp80+MonoAndroid10+MonoTouch10/Xamarin.Forms.targets. (YOUR_PROJECT)
To fix these errors, open the csproj file in a text editor and look for <Target
elements that refer to older versions of Xamarin.Forms, such as the element shown below. You should manually delete this entire element from the csproj file and save the changes.
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see https://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.1.2.3.6257\build\portable-win+net45+wp80+MonoAndroid10+MonoTouch10\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.1.2.3.6257\build\portable-win+net45+wp80+MonoAndroid10+MonoTouch10\Xamarin.Forms.targets'))" />
</Target>
The project should build successfully once these old references are removed.
Considerations
The following considerations should be taken into account when converting an existing Xamarin.Forms project from the Classic API to the new Unified API if that app relies on one or more Component or NuGet Package.
Components
Any component that you have included in your application will also need to be updated to the Unified API or you will get a conflict when you try to compile. For any included component, replace the current version with a new version from the Xamarin Component Store that supports the Unified API and do a clean build. Any component that has not yet been converted by the author, will display a 32 bit only warning in the component store.
NuGet Support
While we contributed changes to NuGet to work with the Unified API support, there has not been a new release of NuGet, so we are evaluating how to get NuGet to recognize the new APIs.
Until that time, just like the components, you'll need to switch any NuGet Package you have included in your project to a version that supports the Unified APIs and do a clean build afterwards.
Important
If you have an error in the form "Error 3 Cannot include both 'monotouch.dll' and 'Xamarin.iOS.dll' in the same Xamarin.iOS project - 'Xamarin.iOS.dll' is referenced explicitly, while 'monotouch.dll' is referenced by 'xxx, Version=0.0.000, Culture=neutral, PublicKeyToken=null'" after converting your application to the Unified APIs, it is typically due to having either a component or NuGet Package in the project that has not been updated to the Unified API. You'll need to remove the existing component/NuGet, update to a version that supports the Unified APIs and do a clean build.
Enabling 64 Bit Builds of Xamarin.iOS Apps
For a Xamarin.iOS mobile application that has been converted to the Unified API, the developer still needs to enable the building of the application for 64 bit machines from the app's Options. Please see the Enabling 64 Bit Builds of Xamarin.iOS Apps of the 32/64 bit Platform Considerations document for detailed instructions on enabling 64 bit builds.
Summary
The Xamarin.Forms application should now be updated to version 1.3.1 and the iOS app migrated to the Unified API (which supports 64-bit architectures on the iOS platform).
As noted above, if your Xamarin.Forms app includes native code such as custom renderers or dependency services then these may also need updating to use the new Types introduced in the Unified API.