Представляем вам пятничную подборку полезных гайдов и шпаргалок от Джеймса Монтемагно для разработчиков разного уровня.



Далее повестовование будет вестись от имени автора.

Меня очень вдохновил недавний пост Скотта Хансельмана в его блоге о том, что разработчики .NET должны знать на начало 2017 года. И я решил пойти немного дальше этого и написать небольшой путеводитель для разработчиков Xamarin, создающих приложения iOS, Android и macOS в .NET. Так что я связался с Крисом Харди, и мы совместно подготовили обширный список понятий и полезных ресурсов, имеющих отношение к Xamarin. Прежде чем мы начнем, вам непременно стоит посетить замечательный блог Скотта, поскольку он просто переполнен отличной информацией. Кроме того, чтобы сделать этот пост максимально полезным, я разделил его на специальные секции: «необходимо знать», «следует знать» и «неплохо бы знать», к тому же я подготовил специальные разделы для iOS и Android.

Когда вы будете готовы приступить к работе с Xamarin, отправляйтесь на портал, который, безусловно, является идеальным местом для начинающих разработчиков. Именно там я начал работу в области мобильной разработки в далеком 2011 году. Итак, приступаем!

С чего начать?


Тем, кто желает много читать, скачивать, изучать и смотреть по теме Xamarin, рекомендуем сразу взять на заметку следующие порталы:

  • Читайте и качайте материалы, связанные с Xamarin!
  • Бесплатное самостоятельное обучение в университете Xamarin.
  • Xamarin Workbooks позволяет разработчикам протестировать API-интерфейсы в интерактивном режиме.
  • xamarinshow.com: Еженедельное шоу на CH9, посвященное разработке и организованное мною.
  • Здесь представлены проекты Xamarin на основе открытого исходного кода.

Необходимо знать: Xamarin


Что такое Xamarin? Благодаря платформе Xamarin разработчики могут создавать полностью нативные приложения для iOS, Android и macOS, используя C#, F# или даже VB.NET. При этом в наличие 100% доступ к нативному API и возможность совместного использования логики с другими приложениями .NET.

У нас есть одна супер-оптимизированная среда выполнения .NET, которая доставляет .NET на iOS, Android, macOS, IoT, Linux, PS4, Xbox и т. д. Она реализует .NET API и приводит в действие .NET Standard, поэтому вам не придется беспокоиться о реализации «под капотом».

Традиционная Xamarin разработка известная также как нативная Xamarin разработка, она дает разработчикам возможность совместного использования бизнес-логики приложений и создания нативных пользовательских интерфейсов для каждой платформы со 100% доступа к каждому API.

Xamarin.Forms разработка предлагает разработчикам кросс-платформенный пользовательский интерфейс абстракции для iOS, Android и Windows. Пользовательские интерфейсы могут быть созданы в коде XAML или ином виде, и к тому же нативные элементы управления установлены в среде выполнения для каждой платформы. Кроме того, предлагаются такие функции MVVM (Model-View-ViewModel), как привязка данных и управление ими. Получить доступ к нативным API-интерфейсам можно через платформу проектов и сервисы зависимостей.

Кросс-платформенное совместное использование кода




Существует несколько способов использования общего кода в разных приложениях:

  • PCL (Portable Class Library). Эта библиотека, также известная как Pickle, дает разработчикам возможность для создания «библиотеки классов», рассчитанной на несколько платформ. Эта библиотека фактически действует в качестве опорного узла, предоставляющего перекрестный API, который доступен на каждой платформе. Чем больше платформ вы выберите, тем меньшая плоскость API будет доступна.

  • Общий проект. Самый простой способ совместного использования кода на разных платформах. Он функционирует как «связывающий файл», разделяя код с целевой платформой. Преимущества, состоят в том, что здесь доступны все целевые API-интерфейсы, так что вы можете производить условную компиляцию. Однако, такой подход может обернуться запутанным кодом, и, кроме того, в этом случае не создается сборка: файлы связываются между собой в проект платформы.

  • .NETStandard или «netstandard». Библиотека netstandard — это следующий этап эволюции, и она вполне может прийти на смену PCL. Разработчики получают по-настоящему кросс-платформенную библиотеку, и она может быть запущена в любой среде выполнения, которая реализует такие API-интерфейсы, как Mono, .NET Framework и .NET Core.

Источники библиотек


Существует множество API, доступных в .NET и на каждой платформе, но иногда хочется больше! И здесь их можно получить:

  • NuGet — это менеджер пакетов для платформы разработки Microsoft, включающей .NET. Клиентские инструменты NuGet обеспечивают возможность создания и использования пакетов. Галерея NuGet является центральным хранилищем пакетов, и используется всеми их авторами и пользователями.

  • Component — «магазин компонентов» является специально подобранной галереей библиотек и менеджером платформ Xamarin. Он предлагает платные и бесплатные библиотеки, которые могут быть установлены непосредственно в приложения iOS и Android. Эти библиотеки создаются как разработчиками компонентов Xamarin, так и сторонними девелоперами.

  • Plugin — по правде сказать, плагины для Xamarin и Windows просто превосходные. Они позволяют вам получать доступ к нативным функциям кросс-платформенного API прямо из общего кода! У них открытый исходный код, и здесь доступно немало классных вещей, в том числе для геолокации, возможности подключений и фотографий. Каждый плагин доступен по лицензии MIT и может быть установлен в любую библиотеку iOS, Android, Windows, PCL или .NETStandard Library через NuGet.

Библиотеки


Давайте познакомимся с некоторыми по-настоящему классными библиотеками, созданными или поддерживаемыми Xamarin:

  • MonoGame является эффективным, гибким и кросс-платформенным API для разработки игр в 2D и 3D. Он обеспечивает основу для многих кросс-платформенных игровых движков. Однако, он может также использоваться и непосредственно в играх, не будучи обернутым в игровой движок.

  • UrhoSharp является кросс-платформенным движком высокого уровня (3D и 2D), который может быть использован для создания анимированных 3D и 2D игр и сцен в приложениях, использующих геометрические формы, материалы, огни и камеры. UrhoSharp совместим с мобильными и десктопными приложениями, а также с HoloLens и VR.

  • SkiaSharp предлагает богатый и мощный графический API, который можно использовать для визуализации в 2D буферах. Вы можете использовать их для реализации элементов пользовательского интерфейса и 2D-графики, которые могут быть включены в приложение. SkiaSharp является привязкой .NET с библиотекой Skia и наследует функции и силу этой библиотеки.

  • CocosSharp является простой библиотекой для 2D-игр, использующей C# и F#. Это .NET порт популярного движка Cocos2D.

Необходимо знать: iOS


Расширения — это виджеты, которые предоставляются iOS в стандартных обстоятельствах, как, например, в «Центре уведомлений», когда пользователь запрашивает клавиатуру или редактирует фотографии. Все расширения устанавливаются в сочетании с приложением Container и активируются с определенной «точки расширения» в приложении Host.

watchOS — это определенная версия iOS, которая предназначена для устройств Apple Watch.
tvOS — Apple выпустила 4-е поколение аппаратных средств Apple TV, отличающихся переработанным пультом с поддержкой сенсорного управления и новой операционной системой (основанной на iOS9).

Регистрационные профили — когда нужно установить приложение на устройство или выпустить его в App Store, требуется получить учетную запись разработчика и создать регистрационный профиль. Они должны связать вместе устройства, учетные записи и компьютеры разработчика.

Необходимо знать: Android


Android Wear — это версия Android, которая предназначена для таких носимых устройств, как умные часы.

Keystore — используется для подписи приложений Android, с тем чтобы размещать их в соответствующих магазинах.

Разбор APIs & SDKs — компиляции, минимизация, планирование — всё, что является важным и заслуживает изучения. Ознакомьтесь с коротким видео по теме.

Необходимо знать: Xamarin


Linker используется для уменьшения размера приложений для iOS и Android, осуществляет статический анализ приложения, с тем чтобы определить, какие в нем используются узлы, типы и члены классов. Благодаря этому любая неиспользуемая вещь будет отброшена.

IL — некий промежуточный язык, который создается при компиляции. Как написал Скотт: C# — это яблоки, из которых IL делает яблочный соус, а JIT/АОТ и среда выполнения — яблочный сок.

AOT — расшифровывается как Ahead of Time Compilation («компиляция на опережение») и принимает IL и компилирует его в машинный код с целью выполнения полученного двоичного файла в нативном виде. Это то, что использует Xamarin.iOS.

JIT — Расшифровывается как Just in Time Compilation («мгновенная компиляция») и принимает IL и компилирует его, подготавливая для запуска в качестве машинного кода. Это то, что использует Xamarin.Android.

Следует знать: iOS


Storyboard позволяет разработчику определять оба контроллера предоставлений и перемещаться между ними на поверхности дизайна, а также предлагает WYSIWYG редактирование пользовательского интерфейса приложения.

XIB — шаблон iOS View XIB, в который можно добавлять автономный файл .xib, который может быть присоединен к определенному обратному классу.

Регистраторы — код, который выставляет управляемый код на Objective-C. Он достигает этого путем создания списка каждого управляемого класса, унаследованного от NSObject.

Следует знать: Android


Dalvik & ART. ART — это среда выполнения Android, которая используется приложениями и некоторыми системными службами на Android. ART и ее предшественник Dalvik изначально были созданы специально для проекта Android.

Multi-Dex — приложение Android (APK) состоит из исполняемых байткодовых файлов в виде Dalvik Executable (DEX), и они содержат скомпилированный код, используемый для запуска приложения. В спецификациях DalvikExecutable ограничено общее количество методов, на которые можно ссылаться в одном файле DEX до 65,536. Multi-Dex создает несколько файлов DEX для APK, и, таким образом, ограничения можно обойти.

ABI (Application Binary Interface) — один APK может содержать машинный код для поддержки нескольких различных архитектур. Каждая коллекция архитектурно-зависимого кода связана с бинарным интерфейсом приложения (ABI).

Android и Managed Callable Wrappers — это то, что позволяет .NET общаться с Java и наоборот.

Android Virtual Devices — это эмуляторы Android, которые используются для отладки приложений.

HAXM (Hardware Accelerated Execution Manager) — программное обеспечение от Intel для Windows и macOS, предназначенное для виртуализации, благодаря которому Вы получаете потрясающие AVDs.

Неплохо бы знать всем


Xamarin.Forms Roadmap — замечательный стратегический план готовящихся функций и исправлений для Xamarin.Forms.

Профайлер Xamarin интегрируется с существующим инструментарием для сбора информации о приложениях Xamarin. Используйте его для поиска утечек памяти, устранения узких мест в производительности, а также для полировки приложения перед тем, как пускать их в свободное плавание.

Model-View-ViewModel (MVVM) — это архитектурный шаблон, который был изобретен с учетом XAML. Шаблон устанавливает разделение пользовательского интерфейса XAML (предоставления) и исходных данных (модели) через класс, который служит посредником между предоставлением и моделью (ViewModel). View и ViewModel часто соединяются через привязки данных, определенных в файле XAML. BindingContext для представления, как правило, является экземпляром ViewModel.

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

Порталы, которые стоит взять на заметку


  • Releases Blog — будьте в курсе того, что происходит.
  • Xamarin в Twitter — твит и еще раз твит!
  • События Xamarin — все что происходит в мире Xamarin.
  • Xamarin Podcast — в то время, когда вы не слушаете Merge Conflict, я настоятельно рекомендую слушать Xamarin Podcast.
  • Weekly Xamarin — специально подобранные еженедельные материалы в рассылке «все о Xamarin»!

Благодарим за перевод


Александр Алексеев — Xamarin-разработчик, фрилансер. Работает с .NET-платформой с 2012 года. Участвовал в разработке системы автоматизации закупок в компании Digamma. C 2015 года ушел во фриланс и перешел на мобильную разработку с использованием Xamarin. В текущее время работает в компании StecPoint над iOS приложением.

Ведет ресурс XamDev.ru и сообщества «Xamarin Developers» в социальных сетях: VK, Facebook, Telegram.
Поделиться с друзьями
-->

Комментарии (40)


  1. maniacscientist
    03.02.2017 17:37
    +1

    Запилите уже общий UI, не так уж сильно андроид от огрызка отличается.


    1. habradante
      03.02.2017 18:05
      +3

      Уже есть, Xamarin.Forms называется. Содержит то, что работает на всех платформах. Т.е. плюхи, которые реализованы под конкретную платформу и возможности — недоступны. Иными словами, хотите красивый интерфейс по гайдлайнам платформы — пилите под конкретную платформу.

      А, ну да, самая «мякотка». Под Андроид и iOS доступна куча библиотек для работы с БД, интерфейсом и сетью. Всего этого Xamarin лишен. А подключение нативных библиотек достойно пера самого Маркиза Де Сада.


      1. ad1Dima
        03.02.2017 18:36
        +4

        Т.е. плюхи, которые реализованы под конкретную платформу и возможности — недоступны.
        не недоступны, а доступны труднее. Кастомные контролы с кастомными рендерами ещё никто не отменял.

        А, ну да, самая «мякотка». Под Андроид и iOS доступна куча библиотек для работы с БД, интерфейсом и сетью. Всего этого Xamarin лишен. А подключение нативных библиотек достойно пера самого Маркиза Де Сада.
        Для БД есть SQLite и Realm, что ещё надо? С сетью .Net самостоятельно прекрасно справляется.
        Подключение большинства UI библииотек не такое уж сложное: pod через консольную утилиту прогнал на iOS, на android там ещё проще.


        1. habradante
          03.02.2017 18:49
          -3

          Кастомные контролы с кастомными рендерами ещё никто не отменял.

          Ну то есть рисовать заново то, что уже есть.
          Для БД есть SQLite и Realm, что ещё надо?

          А 640Кб памяти хватит всем.
          С сетью .Net самостоятельно прекрасно справляется.

          Вот только прослойки для подключения к REST сервисам приходится писать самостоятельно, вместо того чтобы взять готовую.
          Подключение большинства UI библииотек не такое уж сложное: pod через консольную утилиту прогнал на iOS, на android там ещё проще.

          Это только в документации все просто. Реальность куда хуже, подключение кастомных бибилиотек для того же Андроида часто выливается в большую головную боль из-за того что неправильно понимаются дженерики и анонимные классы. И плюс ко всему все равно для разных платформ приходится подключать разные библиотеки, потому что для Xamarin ничего толкового не написали. Например, библиотеки для отрисовки графиков.


          1. kekekeks
            03.02.2017 18:56
            +1

            Например, библиотеки для отрисовки графиков.
            OxyPlot чем не устроил?


            1. habradante
              03.02.2017 22:30
              -1

              Возможностей и видов графиков недостаточно.


              1. mike114
                04.02.2017 18:04

                Я вот давно мучаюсь с байндингами для Zendesk SDKs. Точнее как, оно работает почти всегда, но иногда даже запустить приложение не удаётся, так как что-то не до конца работает, а их поддержка отказывается помогать, так как они не работают с Xamarin. Ну и сам процесс создания отличается сильно от справочной статьи в худшую сторону.


                1. ad1Dima
                  05.02.2017 08:06

                  Ну так-то с вопросами биндинга надо в саппорт Xamarin обрщаться. (ну или на их форум и SO). 


                1. habradante
                  05.02.2017 23:06

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


          1. ad1Dima
            03.02.2017 18:58
            +3

            А 640Кб памяти хватит всем.
             не понимаю вашего сарказма. Есть ещё тормозной couchbase который тоже Xamarin поддерживает. Де факто ничего на мобилах больше и нет.

            Вот только прослойки для подключения к REST сервисам приходится писать самостоятельно, вместо того чтобы взять готовую.
             А все .net-библиотеки куда-то резко пропали? 

            Не знаю, что там у вас с андроидом не получается, все что мы хотели сбиндить — сбиндилось. А графики — вообще фиговый пример, из не только под ксамарин нормальных нет. Их и так днем с огнем не сыщешь.


            1. habradante
              03.02.2017 22:37
              -2

              не понимаю вашего сарказма. Есть ещё тормозной couchbase который тоже Xamarin поддерживает. Де факто ничего на мобилах больше и нет.

              OrmLite, ActiveAndroid, SugarORM, GreenDAO, это только из тех что я вспомнил, что рассматривали.
              А все .net-библиотеки куда-то резко пропали?

              Библиотеки не-PCL не работают под Xamarin.
              Не знаю, что там у вас с андроидом не получается, все что мы хотели сбиндить — сбиндилось. А графики — вообще фиговый пример, из не только под ксамарин нормальных нет. Их и так днем с огнем не сыщешь.

              Как раз с Андроидом все бы получилось, а вот разработка под Xamarin вышла сильно дороже.


              1. ad1Dima
                03.02.2017 22:50
                +2

                OrmLite, ActiveAndroid, SugarORM, GreenDAO,
                 Прекрасно, и в чем принципиальное преимущество перед SQLite.net?

                Библиотеки не-PCL не работают под Xamarin.

                не PCL, не .Net Standart, не Xamarin и не OpenSource.

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


                1. habradante
                  04.02.2017 00:38
                  -2

                  Прекрасно, и в чем принципиальное преимущество перед SQLite.net?

                  С ним нормально не работал апдейт базы. И в sqlite.net, на тот, момент, были проблемы с передачей параметров.
                  в краткосрочной перспективе она и дороже, как и практически любая кросс-платформенная разработка. Есть задачи для которых Xamarin вообще не подходит. что уж тут скажешь.

                  Xamarin был выбран как возможность упростить переиспользование кода между Android и iOS, а по факту, как раз написание этого немногочисленного «общего» кода заняло меньше всего времени. Больше всего ушло на подключение библиотек для отображения графиков и создание интерфейса по гайдлайнам.
                  Самое смешное, что одну из основных проблем при работе с интерфейсом, Xamarin, как раз, не решает — динамическая подгрузка разметки экранов. Была надежда что с доведением до ума Xamarin.Forms, это удастся, но нет.


                  1. ad1Dima
                    04.02.2017 06:30
                    +1

                    Xamarin был выбран как возможность упростить переиспользование кода между Android и iOS, а по факту, как раз написание этого немногочисленного «общего» кода заняло меньше всего времени. Больше всего ушло на подключение библиотек для отображения графиков и создание интерфейса по гайдлайнам.
                    Вот сходу 2 ошибки: использование кросс-платформы для проекта без логики. Использование общего UI для проекта с высоким требованием к соответствию гайдлайнам.

                    Спасибо вам, сейчас как раз готовлю презентацию по Xamarin. Обязательно приведу вас в пример.


                    1. habradante
                      04.02.2017 10:38
                      -1

                      Вот сходу 2 ошибки: использование кросс-платформы для проекта без логики. Использование общего UI для проекта с высоким требованием к соответствию гайдлайнам.

                      Не читайте по диагонали. Как раз этих ошибок не было. Проект имеет общую логику работы с веб-сервисом и в нем не используются Xamarin.Forms, как раз по причине следования гайдлайнам.


                      1. ad1Dima
                        05.02.2017 08:09

                        Проект имеет общую логику работы с веб-сервисом
                        Судя по вашим комментам, это минималная часть приложения, а основной упор делается на UI. Xamarin в таком случает преимуществ не дает. Ну кроме языка разработки, но это на вкус и цвет, как говорится.  


                        1. habradante
                          05.02.2017 22:56

                          Эта часть важна, хоть и заняла меньше всего времени от общего количества часов, и не хотелось ее переписывать каждый раз при обновлении и вообще писать повторно.


                          1. ad1Dima
                            06.02.2017 06:46

                            Это известная причина для того чтоб посмотреть в сторону кросс-платформы. Но в вашем случае, лучше, конечно, было смотреть в сторону c++/Qt.


          1. ad1Dima
            03.02.2017 19:06
            +2

            Ну то есть рисовать заново то, что уже есть.
             xто рисовать-то? берешь любой существующий контрол и оборачиваешь в рендер. Там сейчас даже в xaml можно нативные контролы вставлять. https://blog.xamarin.com/adding-bindable-native-views-directly-to-xaml/


            1. habradante
              03.02.2017 22:47
              -2

              Ну так о том и речь, без натива никуда.


              1. ad1Dima
                03.02.2017 22:51
                +3

                Я так понимаю, вы просто не провели надлежащий анализ перед выбором инструмента и теперь страдаете.


                1. habradante
                  04.02.2017 00:25
                  -3

                  Платформа сильно переоценена. И страдания начинаются от того, что в реальности сталкиваешься с кучей нюансов, которые в документации либо не описаны, либо просто и быстро не решаются.
                  И анализ как раз был проведен, но то как был продавлен Xamarin — отдельная история.


                  1. Nagg
                    04.02.2017 01:07

                    А есть какие-то конкретные нюансы, которые не описаны?


                  1. gleb_kudr
                    04.02.2017 02:09

                    Да все там норм уже давно, если не пытаться действительно делать платформонезависимый UI, оно под это не заточено. Два проекта с общей бэкендовой библиотекой, но своим UI — пашет только в путь.


    1. kekekeks
      03.02.2017 18:24
      +2

      Например. UI строится как в нормальных XAML-платформах (все контролы выражены через шаблоны). Рисуется через вышеупомянутую Skia.
      На мобилках, правда, пока в зачаточном состоянии — не работают попапы (надеюсь починить к очередному выпуску), обработчик тач-событий изображает из себя мышь, ну и подтормаживает (сейчас в процессе инфраструктура рендеринга только-того-что-поменялось и в фоновом потоке).


      1. denismaster
        04.02.2017 11:40

        Вот и кроссплатформенный WPF подъехал. Потрясающе!)


      1. gritsenko_biz
        05.02.2017 14:22

        Это же то! о чем я всегда мечтал!!!
        Давайте дружить :-)
        С радостью бы портировал GUI нашего https://icons8.com/lunacy на net core


        1. kekekeks
          05.02.2017 17:36

          Давайте. Заходите в наш уютный чатик — https://gitter.im/AvaloniaUI/Avalonia
          Инструкции и пример использования из .NET Core тут.


          Всё это счастье пока доступно только из nightly-фида (прописан в NuGet.config) в примерах. То, что на nuget.org работает только на обычном дотнете и Mono. Как стабилизируется новый студийный тулинг для .NET Core, планируем выпустить очередную версию и уже нормально это дело анонсировать.


          Сейчас уже портируют на .NET Core вот эту штуку. Ещё на авалонии умеет работать вот этот редактор диаграмм, который идейно ближе к вашему проекту.


  1. kekekeks
    03.02.2017 18:18

    У нас есть одна супер-оптимизированная среда выполнения .NET, которая доставляет .NET на iOS, Android, macOS, IoT, Linux, PS4, Xbox и т. д. Она реализует .NET API и приводит в действие .NET Standard, поэтому вам не придется беспокоиться о реализации «под капотом».
    Mono
    супер-оптимизированная
    И это в блоге Microsoft. Дожили.


    1. Nagg
      03.02.2017 18:30

      Что тебе не нравится, Никита? :)


      1. kekekeks
        03.02.2017 18:39
        +2

        Тормоза. Мне не нравятся тормоза.


  1. dmitry_dvm
    05.02.2017 20:43

    А переведите кто-нибудь ту статью про дотнет, о которой автор упоминает в начале?


    1. Schvepsss
      06.02.2017 09:40

      Если будет интерес, переведём конечно.


  1. dimka11
    05.02.2017 21:36

    Почему, для Android не используется AOT?


    1. kekekeks
      06.02.2017 14:13

      Потому что у вас галочка в настройках сборки проекта соответствующая не стоит.


      1. medvedevia
        06.02.2017 15:05

        речь про Xamarin? Подскажите где эта галочка?


        1. kekekeks
          06.02.2017 17:09

          project


          1. medvedevia
            06.02.2017 19:32

            Вот тут написано:

            This option requires an Enterprise license and is only available when Use Fast Deployment is disabled.

            А у меня Community. Ну да ладно, все равно пока использую для изучения и домашних поделок.


            1. medvedevia
              06.02.2017 19:39

              добавлю изображение

              Скрин того же окна
              image


    1. Jasper7
      06.02.2017 15:19

      В версии Xamarin Android 5.1 добавлена поддержка AOT как экспериментальная, но судя по описанию к релизу Xamarin Android 6.1 функция отключена из-за проблем, обещают включить в будущих релизах. На данный момент опция AOT все еще отсутствует в Xamarin Studio. Остается ждать новых релизов)