Внедренные платформы в Xamarin.iOS

В этом документе описывается, как разработчики приложений могут внедрять пользовательские платформы в свои приложения.

Благодаря iOS 8.0 Apple позволило создать внедренную платформу для совместного использования кода между расширениями приложений и основным приложением в Xcode.

Xamarin.iOS 9.0 добавляет поддержку использования этих внедренных платформ (созданных с помощью Xcode) в приложениях Xamarin.iOS. Создавать внедренные платформы из любого типа проектов Xamarin.iOS невозможно, использовать только существующие собственные (Objective-C) платформы.

Существует два способа использования платформ в Xamarin.iOS:

  • Передайте платформу в средство mtouch, добавив следующие аргументы в дополнительные аргументы mtouch в параметрах сборки iOS проекта:

    --framework:/Path/To/My.Framework
    

    Это необходимо задать для каждой конфигурации проекта.

  • Добавление собственных ссылок из контекстного меню

Щелкните правой кнопкой мыши проект и перейдите к добавлению собственных ссылок

Select Add native references in Visual Studio for Mac

Это будет работать для всех конфигураций.

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

На сайте GitHub можно найти несколько примеров проектов.

Ограничения

  • Внедренные платформы поддерживаются только в унифицированных проектах.
  • Внедренные платформы поддерживаются только в проектах с целью развертывания по крайней мере iOS 8.0.
  • Если для расширения требуется внедренная платформа, приложение-контейнер также должно иметь ссылку на платформу, в противном случае платформа не будет включена в пакет приложений.

Среда выполнения Mono

Внутренне Xamarin.iOS использует эту функцию, чтобы связаться с средой выполнения Mono в качестве платформы, а не связывать среду выполнения Mono статически с каждым расширением и приложением контейнера.

Это происходит автоматически, если приложение-контейнер является единым приложением, оно содержит расширения, а целевое развертывание — iOS 8.0 или более поздней версии.

Приложения без расширений по-прежнему будут связываться со средой выполнения Mono статически, так как существует штраф размера для использования платформы, если есть только одно приложение, ссылающееся на него.

Это поведение можно переопределить разработчиком приложения, добавив следующий аргумент в качестве дополнительного аргумента mtouch в параметрах сборки iOS проекта:

  • --mono:static: ссылки со средой выполнения Mono статически.
  • --mono:framework: ссылки на среду выполнения Mono в качестве платформы.

Один из сценариев связывания среды выполнения Mono в качестве платформы даже для приложений без расширений заключается в уменьшении размера исполняемого файла, чтобы преодолеть все ограничения размера, которые Apple применяет к исполняемому файлу. Для справки среда выполнения Mono добавляет примерно 1,7 МБ на архитектуру (с Xamarin.iOS 8.12, однако его зависит от выпусков и даже между приложениями). Платформа Mono добавляет примерно 2.3 МБ на каждую архитектуру, что означает, что для одноуровневого приложения без расширений, что делает приложение ссылкой на среду выполнения Mono в качестве платформы сжимать исполняемый файл на ~1,7 МБ, но добавляет платформу ~2.3 МБ, что приводит к тому, что в целом более крупное приложение составляет ~0,6 МБ больше.