Обновление существующих приложений Xamarin.Forms

Выполните следующие действия, чтобы обновить существующее приложение Xamarin.Forms для использования единого API и обновления до версии 1.3.1

Внимание

Так как Xamarin.Forms 1.3.1 является первым выпуском, поддерживающим единый API, все решение должно быть обновлено для использования последней версии одновременно с переносом приложения iOS в Unified. Это означает, что помимо обновления проекта iOS для единой поддержки вам также потребуется изменить код во всех проектах в решении.

Обновление выполняется двумя шагами.

  1. Перенос приложения iOS в единый API с помощью сборки Visual Studio для Mac в средстве миграции.

    • Используйте средство миграции для автоматического обновления проекта.

    • Обновите собственные API iOS, как описано в инструкциях по обновлению приложений iOS (в частности, в пользовательском коде службы отрисовки или зависимостей).

  2. Обновите все решение до версии Xamarin.Forms версии 1.3.

    1. Установите пакет NuGet Xamarin.Forms 1.3.1.

    2. App Обновите класс в общем коде.

    3. AppDelegate Обновите проект iOS.

    4. MainActivity Обновите проект Android.

    5. MainPage Обновите проект Windows Телефон.

1. Приложение iOS (единая миграция)

Часть миграции требует обновления Xamarin.Forms до версии 1.3, которая поддерживает единый API. Чтобы создать правильные ссылки на сборки, сначала необходимо обновить проект iOS для использования унифицированного API.

Средство миграции

Щелкните проект iOS, чтобы он был выбран, а затем выберите "Миграция проекта > " в единый API Xamarin.iOS... и примите предупреждение, которое появится.

Choose Project > Migrate to Xamarin.iOS Unified API... and agree to the warning message that appears

Это автоматически:

  • Измените тип проекта для поддержки 64-разрядного API Единого.
  • Измените ссылку на платформу на Xamarin.iOS (заменив старую ссылку monotouch ).
  • Измените ссылки на пространство имен в коде, чтобы удалить MonoTouch префикс.
  • Обновите csproj-файл, чтобы использовать правильные целевые объекты сборки для единого API.

Очистка и сборка проекта, чтобы убедиться, что для устранения других ошибок нет. Никаких дополнительных действий не требуется. Эти действия подробно описаны в документации по унифицированным API.

Обновление собственных API iOS (при необходимости)

Если вы добавили дополнительный машинный код iOS (например, пользовательские отрисовщики или службы зависимостей), вам может потребоваться выполнить дополнительные исправления кода вручную. Повторно скомпилируйте приложение и ознакомьтесь с инструкциями по обновлению существующих приложений iOS для получения дополнительных сведений об изменениях, которые могут потребоваться. Эти советы также помогут определить необходимые изменения.

2. Обновление Xamarin.Forms 1.3.1

После обновления приложения iOS до единого API остальной части решения необходимо обновить до версии Xamarin.Forms версии 1.3.1. В том числе:

  • Обновление пакета NuGet Xamarin.Forms в каждом проекте.
  • Изменение кода для использования новых классов Xamarin.Forms Application, FormsApplicationDelegate (iOS), FormsApplicationActivity (Android) и FormsApplicationPage (Windows Телефон).

Ниже описаны следующие действия.

2.1 Обновление NuGet во всех проектах

Обновите предварительную версию Xamarin.Forms до версии 1.3.1 с помощью диспетчер пакетов NuGet для всех проектов в решении: PCL (при наличии), iOS, Android и Windows Телефон. Рекомендуется удалить и повторно добавить пакет NuGet Xamarin.Forms для обновления до версии 1.3.

Примечание.

Xamarin.Forms версии 1.3.1 в настоящее время находится в предварительной версии. Это означает, что необходимо выбрать вариант предварительного выпуска в NuGet (с помощью флажка в Visual Studio для Mac или раскрывающемся списке в Visual Studio), чтобы просмотреть последнюю предварительную версию.

Внимание

Если вы используете Visual Studio, убедитесь, что установлена последняя версия диспетчер пакетов NuGet. Старые версии NuGet в Visual Studio не будут правильно устанавливать единую версию Xamarin.Forms 1.3.1. Перейдите к расширениям инструментов > и Обновления... и щелкните список "Установленные", чтобы проверка, что диспетчер пакетов NuGet для Visual Studio имеет по крайней мере версию 2.8.5. Если он более старый, щелкните список Обновления, чтобы скачать последнюю версию.

После обновления пакета NuGet до Xamarin.Forms 1.3.1 внесите следующие изменения в каждом проекте, чтобы обновить его до нового Xamarin.Forms.Application класса.

2.2 Переносимая библиотека классов (или общий проект)

Измените файл App.cs таким образом:

  • Теперь App класс наследует от Application.
  • Свойство MainPage установлено на первую страницу содержимого, которую вы хотите отобразить.
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
    }

Мы полностью удалили GetMainPage метод и вместо этого задайте MainPageсвойство в подклассе Application .

Этот новый базовый Application класс также поддерживает OnStartи OnSleepOnResume переопределяет, чтобы помочь вам управлять жизненным циклом приложения.

Затем App класс передается новому LoadApplication методу в каждом проекте приложения, как описано ниже:

Приложение iOS 2.3

Измените файл AppDelegate.cs таким образом:

  • Класс наследуется от FormsApplicationDelegate (вместо UIApplicationDelegate ранее).
  • LoadApplication вызывается с новым экземпляром App.
[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

Измените файл MainActivity.cs таким образом:

  • Класс наследуется от FormsApplicationActivity (вместо FormsActivity ранее).
  • LoadApplication вызывается с новым экземпляром App
[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 Телефон

Нам нужно обновить MainPage — как XAML, так и кодовый элемент.

Измените файл MainPage.xaml таким образом:

  • Корневой элемент XAML должен быть winPhone:FormsApplicationPage.
  • Атрибут xmlns:phone должен быть изменен на xmlns:winPhone="clr-namespace:Xamarin.Forms.Platform.WinPhone;assembly=Xamarin.Forms.Platform.WP8"

Ниже показан обновленный пример: необходимо только изменить эти вещи (остальные атрибуты должны оставаться неизменными):

<winPhone:FormsApplicationPage
   ...
   xmlns:winPhone="clr-namespace:Xamarin.Forms.Platform.WinPhone;assembly=Xamarin.Forms.Platform.WP8"
    ...>
</winPhone:FormsApplicationPage>

Измените файл MainPage.xaml.cs таким образом:

  • Класс наследуется от FormsApplicationPage (вместо PhoneApplicationPage ранее).
  • LoadApplication вызывается с новым экземпляром класса Xamarin.Forms App . Возможно, вам потребуется полностью указать эту ссылку, так как в Windows Телефон уже определен собственный App класс.
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
    }
 }

Устранение неполадок

Иногда вы увидите ошибку, аналогичную этой ошибке после обновления пакета NuGet Xamarin.Forms. Это происходит, когда модуль обновления NuGet не полностью удаляет ссылки на старые версии из csproj-файлов .

YOUR_PROJECT.csproj: ошибка. Этот проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Включите восстановление пакетов NuGet, чтобы скачать их. Дополнительные сведения см. в разделе https://go.microsoft.com/fwlink/?LinkID=322105. Отсутствующий файл — .. /.. /packages/Xamarin.Forms.1.2.3.6257/build/portable-win+net45+wp80+MonoAndroid10+MonoTouch10/Xamarin.Forms.targets. (YOUR_PROJECT)

Чтобы устранить эти ошибки, откройте csproj-файл в текстовом редакторе и найдите <Target элементы, ссылающиеся на старые версии Xamarin.Forms, например элемент, показанный ниже. Необходимо вручную удалить этот элемент из csproj-файла и сохранить изменения.

  <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>

Проект должен успешно выполнить сборку после удаления этих старых ссылок.

Рекомендации

При преобразовании существующего проекта Xamarin.Forms из классического API в новый унифицированный API следует учитывать, если это приложение использует один или несколько компонентов или пакета NuGet.

Компоненты

При попытке компиляции необходимо также обновить любой компонент, включенный в приложение, до единого API. Для любого включенного компонента замените текущую версию новой версией из хранилища компонентов Xamarin, которая поддерживает единый API и выполните чистую сборку. Любой компонент, который еще не преобразован автором, будет отображать 32-разрядное предупреждение только в хранилище компонентов.

Поддержка NuGet

Хотя мы внесли изменения в NuGet для работы с поддержкой единого API, не было нового выпуска NuGet, поэтому мы оцениваем, как получить NuGet для распознавания новых API.

До этого момента, как и компоненты, необходимо переключить любой пакет NuGet, включенный в проект, на версию, которая поддерживает унифицированные API и выполнить чистую сборку после этого.

Внимание

Если в форме "Ошибка 3 не удается включить как monotouch.dll", так и "Xamarin.iOS.dll" в один и тот же проект Xamarin.iOS, ссылка на "Xamarin.iOS.dll" указана явным образом. хотя на "monotouch.dll" ссылается xxx, Version=0.0.000, Culture=neutral, PublicKeyToken=null" после преобразования приложения в объединенные API, обычно это связано с компонентом или пакетом NuGet в проекте, который не был обновлен до единого API. Необходимо удалить существующий компонент или NuGet, обновить до версии, поддерживающей объединенные API и выполнить чистую сборку.

Включение 64-разрядных сборок приложений Xamarin.iOS

Для мобильного приложения Xamarin.iOS, преобразованного в единый API, разработчик по-прежнему должен включить сборку приложения для 64-разрядных компьютеров из параметров приложения. Дополнительные инструкции по включению 64-разрядных сборок приложений Xamarin.iOS см. в документе "Рекомендации по 32/64-разрядной платформе".

Итоги

Теперь приложение Xamarin.Forms должно быть обновлено до версии 1.3.1, а приложение iOS перенесено в Единый API (который поддерживает 64-разрядные архитектуры на платформе iOS).

Как отмечалось выше, если приложение Xamarin.Forms включает собственный код, например пользовательские отрисовщики или службы зависимостей, они также могут потребовать обновления для использования новых типов , представленных в Унифицированном API.