Разработка под iOS на Visual Studio (Xamarin.iOS/Monotouch)

VS and iOS

Для разработки под iOS на Visual Studio с использование Xamarin.iOS(Monotouch) нужно специфичное окружение:

  1. Windows: Visual Studio + Xamarin.iOS
  2. Mac OS(или виртуальная машина): Xcode + Xamarin.iOS

Где на Windows происходит компиляция в Mono-бинарники, после чего они отправляються на Mac OS. Там уже происходит компиляция в нативный код, а также запуск приложения на симуляторе или устройстве. При необходимости с отладкой, которая свяжется с Visual Studio.

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

Как все это вместе собрать и соединить, а также какие могут возникнуть подводные камни ниже.

Виртуальная машина

Советую найти образ с уже установленной системой. Я взял за основу MAC OS X Mountain Lion 10.8.3, для него потребуется VMware Workstation 9.x. Если вы решили его использовать, единственное что нужно сделать перед запуском, это увеличить объем памяти выделяемый системе, нужно минимум 2Gb.

Если VMware ругается на наличие Hyper-V, то его можно легко отключить Hyper-V через консоль:

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

И включить Hyper-V, если он вам понадобиться:

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

Запускаем виртуальную машину, на ней сразу включаться настройки аккаунта. После них мы попадем на рабочий стол.

От первого запуска виртуальной машины до рабочего стола проходит около 5 минут.

Установка инструментов на Mac OS

Xcode

Install Xcode

Ставим Xcode через App Store, у меня это заняло порядка 20 минут.

Теперь нам нужно обновить SDK и документацию для него до последней версии, без этого возможны ошибки при компиляции и запуске:

  1. Запускаем Xcode.
  2. Через главное меню сверху, открываем Preferences.
  3. Открываем вкладку Downloads и нажимаем Check and Install Now.
  4. Ждем порядка 30 минут.

Update Xcode

Xcode готов к компиляции нашего кода, больше он нам его трогать не понадобится.

Xamarin.iOS

C xamarin.com скачиваем последнюю версию Xamarin.iOS и устанавливаем ее. На это понадобиться около 10 минут.

Install Xamarin.iOS

Для работы с Visual Studio нужна Business версия.

Если у вас ее нет, то можно воспользоваться пробным периодом на 30 дней. Чтобы его активировать нужно:

  1. Запустить Xamarin Studio.
  2. Нажать на Login справа и зайти под своей учетной записью или создать новую.
  3. Создать проект на базе любого шаблона приложения под iOS.Xamarin Login
  4. В меню выбираем Project -> Profile — Mono…Xamarin How get Business Trial
  5. Появиться окно, которое предложит нам купить или попробовать бизнес версию.

На этом настройка инструментов и виртуальной машины законченна. В целом на это придется потратить около 1.5 часа, а образ диска виртуальной машины будет весить около 15Gb.

Подключаем Visual Studio

У меня установленная Visual Studio 2012, поддержку Xamarin.iOS для других версий нужно уточнять. 

Что нужно сделать:

  1. Скачать и установить Xamarin.iOS.
  2. Войти в аккаунт Xamarin, который используется в Mac OS.Visual Studio Xamarin Login
  3. Создать проект под iOS по шаблону HelloWorld Application.
  4. Появиться окошко с выбором Build Host-а.Connect to Build Host
  5. Найти в нем вашу Mac OS и подключиться(если сразу не дает нажать Connect, можно попробовать нажать Diagnose…, откроется окно с более подробными этапами подключения)Build Host Diagnosis

После того, как все это проделано, наша Visual Studio теперь связанна с Mac OS. И мы можем собирать приложения, а также запускать их на симуляторе или телефоне.

Выбираем профиль сборки iPhoneSimulator,и у нас панелька Xamarin.iOS приобретает такой вид:

Xamarin Toolbar

Но для запуска на надо проделать еще одну вещь, это правильно выставить параметры приложения в свойствах проекта. Без этого приложение не запустится на эмуляторе. А если вы уже пробовали запускать без них, то придется на эмуляторе сделать сброс настроек.

Правой кнопкой мыши по проекту, выбираем Properties, переходим на вкладку iOS Application. Необходимо обязательно заполнить поля: Application name, Identifier, Version.

iOS Application Properties

После чего жмем кнопку Start, начнется поэтапная сборка проекта:

  1. Visual Studio соберет exe-файл и отправит его на Mac OS.
  2. Xcode перекомпилирует приложение в нативный код iOS.
  3. Приложение запуститься в симуляторе.

В конечном итоге все должно выглядеть примерно так:Finish Screen

 

  • Artur Shellunts

    А сколько у тебя заняла настройка вирт машины и инструментов с нуля?

    • StrangeAndr

      С нуля, когда я вообще ничего не знал — почти целый рабочий день, т.к. с начало я пытался вручную установить MacOS безрезультатно, а потом со стандартными шаблонами была проблема, и они не запускались на эмуляторе.

      А когда статью писал, около часа 3-4, это со скачкой образа.

      • Artur Shellunts

        То есть, что бы написать статью ты потратил еще 3-4 часа, чтобы воспроизвести все шаги и описать их в статье?

        • StrangeAndr

          Да, дело не быстрое.
          Для таких случаев надо делать образ с чистой и настроенной средой.

          • Artur Shellunts

            Результат отличный!

  • Pingback: Создание проекта MonoGame для Visual Studio под платформу iOS | Strange Andr Blog()

  • Виталий Куракин

    Что означает «Выбираем профиль сборки iPhoneSimulator». Я выбрал этот пункт в настройках проекта в выпадающем списке «Platform». Но после этого у меня не изменилось меню Xamarain.iOS.

    • StrangeAndr

      Скорее всего студия не подключена к хосту с Mac OS, или еще возможно на самой Mac OS нет эмуляторов.

      • Виталий Куракин

        Нет, нужно было в свойствах солюшена сделать то же самое.
        Теперь другая проблема:
        При попытке сбилдить проект (который передали подрядчики) пишет ошибку «The name ‘Info.plist’ is reserved and cannot be used.»

        Если удаляю этот файл, то ругается, что он не найден.

        • StrangeAndr

          Возможно у него выставлен неправильный Build Action.

          • Виталий Куракин

            Спасибо, помогло.
            Действительно, надо было ставить Build Action = None