Как разрабатывать и распространять приложения для iOS без Mac с помощью Flutter и Codemagic

Узнайте из этой заметки, как создавать и публиковать приложения для iOS, если вы работаете в Linux или Windows. Мы покажем, как это возможно с помощью Flutter и Codemagic.

NB! Существует разница между разработкой iOS-приложений и их созданием и публикацией с помощью Codemagic.

Трудно представить себе разработку приложений для iOS без компьютера Mac. В ближайшее время ситуация не изменится, но все же есть способы создать приложение для iOS и опубликовать его в App Store, даже если у вас нет Mac. С помощью Flutter и Codemagic вы можете создавать и распространять приложения для iOS, не покупая компьютер Mac.

В этой статье мы расскажем вам, как можно создать приложение Flutter на Linux или Windows и использовать Codemagic CI/CD для настройки подписи кода для вашего проекта iOS и выпуска приложения в App Store. В этом примере мы будем использовать приложение Flutter для iOS из примеров проектов Codemagic.

РЕКВИЗИТЫ

  • Вам необходимо приобрести лицензию Apple Developer Program, чтобы подписать код и опубликовать приложение.
  • У вас также должно быть устройство iOS для дымового тестирования приложения

Создание и распространение приложений для iOS без Mac с помощью Flutter & Codemagic Начало работы

Прежде чем приступить к работе, важно сформулировать, какую проблему мы собираемся решить. Вы не можете разрабатывать приложения для iOS без компьютера Mac. Эта статья о том, как создать приложение для iOS и выпустить его для своих пользователей. Но в чем же разница?

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

Когда вы не можете использовать Linux или Windows для разработки iOS-приложений?

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

Я бы сказал, что одна из самых печально известных функций, которая вездесуща во всех приложениях, с которыми вам придется иметь дело, — это push-уведомления. Хотя в большинстве случаев симулятора iOS будет достаточно, есть некоторые сценарии, когда вы должны протестировать приложение на реальном устройстве, и push-уведомления — один из них.

Когда вы сможете создавать и публиковать iOS-приложения без компьютера Mac?

Одно из больших преимуществ Flutter заключается в том, что не нужно создавать совершенно новое приложение только для iOS или любой другой ОС, а можно использовать существующий проект для отправки на все платформы.

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

Попробуйте перевернуть ситуацию, если вы являетесь пользователем macOS и рассматриваете возможность выпуска настольной версии своего приложения в Microsoft Partner Center. Вы можете пойти и купить машину Windows для создания приложения или использовать существующий инструмент CI/CD и переключить тип экземпляра на Windows.

Второй наиболее распространенный случай, с которым я сталкивался, — это когда вы работаете в команде, и у некоторых членов команды есть компьютеры Mac, а у других — Linux или Windows. Было бы здорово, если бы после того, как вы будете готовы к слиянию PR, CI собирал для всех платформ и автоматически передавал двоичные файлы команде QA, а не просил других собирать двоичные файлы или поручал это QA.

Разработка приложений Flutter на Linux или Windows

Flutter — это многоплатформенная среда разработки приложений, которая позволяет, помимо прочих платформ, разрабатывать приложения для iOS и Android из одного исходного кода. Однако для создания приложения для iOS необходимо использовать Xcode, а Xcode работает только на macOS. Вы не сможете обойтись Linux или Windows. Однако мы можем создавать и распространять приложения в Google Play Store или Apple App Store с помощью CI/CD-продукта, такого как Codemagic.

Flutter вместе с Codemagic позволяет выпускать iOS-приложения для разработчиков, использующих Linux или Windows.

Настройка среды разработки для Flutter

Давайте начнем с установки Android SDK и Flutter. После этого вы можете клонировать репозиторий образцов проектов Codemagic с GitHub, и мы сможем сразу же начать работу над ними. Мы будем использовать демонстрационный проект Flutter для Android и iOS. Руководства по началу работы с Flutter также доступны на официальном сайте Flutter docs.

Имейте в виду, что мы можем использовать Linux или Windows, чтобы разрабатывать только для Android, а не для iOS. К концу этой статьи мы все равно получим приложение для iOS, которое можно будет развернуть в App Store, но для этого мы будем использовать Codemagic CI/CD со средой macOS.

Добавление приложения в Codemagic

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

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

Запустите свою первую сборку

Давайте попробуем запустить сборку и вывести «My first green build!».

  1. Откройте редактор рабочего процесса Flutter и выберите Run tests only.
  2. Убедитесь, что тесты отключены в разделе Tests.
  3. Откройте кнопку + после раздела Distribution и напишите
#!/bin/sh

echo "My first green build!"

Войти в полноэкранный режим Выйти из полноэкранного режима
  1. Сохраните изменения.
  2. Запустите сборку.

Увы… сборка завершилась неудачно. В сообщении об ошибке говорится, что в корне клонированного репозитория нет файла pubspec.yaml. Это правда, потому что это монорепозиторий. Как указать Codemagic, какой путь использовать для рабочего каталога?

  1. Откройте редактор рабочего процесса.
  2. Перейдите в раздел Build и выберите демонстрационный проект Flutter в поле Project path.

  1. Сохраните изменения.
  2. Запустите сборку.

Успех!

Сборка проекта iOS

Теперь, когда вы сделали свою первую зеленую сборку, давайте попробуем собрать проект iOS.

  1. Откройте редактор рабочего процесса.
  2. Выберите iOS в качестве платформы сборки.
  3. В разделе Build выберите версию Xcode, CocoaPods и Flutter, которые вы хотите использовать.
  4. Сохраните настройки.
  5. Запустите сборку.
  6. Скрестите пальцы.

На момент написания этой статьи (3 февраля 2022 года) мы использовали Xcode 13.2.1 и Flutter 2.8.1.

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

Одна из распространенных проблем, с которой мы сталкиваемся, если вы никогда раньше не собирали проект iOS, — это создание Podfile или внесение небольших изменений в графический интерфейс пользователя (GUI) Xcode. Вы можете получить удаленный доступ к виртуальной машине Codemagic macOS, инициализировать новый файл и перенести изменения в ваш репозиторий. После подключения выполните эти команды из терминала. Например, так можно инициализировать pods.

cd iOS
pod init
gh auth login --with-token YOUR_GITHUB_PAT_TOKEN
git add .
git commit -m "Added Podfile"
git push

Войти в полноэкранный режим Выйти из полноэкранного режима

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

Для того чтобы перенести изменения в репозиторий, вам необходимо авторизоваться в git-провайдере. Это необходимо, поскольку Codemagic VM имеет только доступ на чтение к репозиторию GitHub. Для аутентификации в GitHub необходимо использовать персональный токен доступа GitHub. Посмотрите, как сгенерировать маркер на сайте https://github.com/settings/tokens.

Теперь вы на шаг ближе к получению файла .ipa!

Файл .ipa

.ipa — это двоичный файл, который вы можете запустить на физическом устройстве, подобно .apk для Android. Мы не можем создать двоичный файл .ipa ни на чем, кроме macOS. Способом преодоления этого препятствия будет использование службы непрерывной интеграции и доставки с окружением macOS. Нам нужно будет настроить Codemagic CI/CD, чтобы иметь возможность подписывать код в Xcode и собирать бинарный файл .ipa, а затем публиковать его в App Store Connect.

Подготовка проекта iOS к подписанию кода на локальной машине

Подобно тому, как вам нужно настроить Gradle на использование относительных путей вместо абсолютных для работы в среде CI/CD, нам также нужно внести некоторые изменения в наш проект iOS.

  1. Зарегистрируйте свой bundle id в Apple Developer Portal, перейдя по адресу https://developer.apple.com/account/resources/identifiers/list.

  2. Создайте запись приложения на https://appstoreconnect.apple.com/apps и используйте только что созданный идентификатор пакета.

  3. Откройте проект iOS в редакторе, откройте файл project.pbxproj и установите PRODUCT_BUNDLE_IDENTIFIER приложения на только что созданный идентификатор пакета. Это упоминается в нескольких местах в проекте, поэтому убедитесь, что изменили его везде. Вы можете редактировать этот файл без Mac.

  4. Бонусные очки: настройте webhooks для автоматического запуска сборки в Codemagic, открыв редактор рабочего процесса и установив триггер сборки на сборку по push to master.

  5. В терминале локальной машины сохраните изменения, внесенные в файл project.pbxproj, и переместите изменения в master в вашем репозитории. Если вы уже настроили webhooks, вы также должны увидеть, как сборка Codemagic будет запущена после этого push.

Если вы используете flavors, мы рассмотрели этот случай в отдельном посте здесь, а пример проекта доступен на GitHub здесь.

Если вы используете некоторые сервисы Google, например Firebase, то вам нужно будет получить удаленный доступ к виртуальной машине через VNC и добавить файл GoogleService-info.plist в проект iOS через Xcode. Статья о добавлении Firebase в проект iOS доступна в нашем блоге здесь.

Начало работы с подписыванием кода iOS

Судя по количеству вопросов, связанных с подписанием кода iOS на Stackoverflow, многие разработчики испытывают трудности с подписанием кода iOS. Мы понимаем, что настройка подписи кода может стать головной болью, особенно если вы пытаетесь заставить ее работать в среде CI/CD без Mac.

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

После WWDC 2019 стало возможным использовать App Store Connect API для генерации этих файлов подписи. Мы создали собственные инструменты CLI поверх API, и Codemagic использует их под капотом, чтобы упростить процесс подписания и публикации кода. Инструменты CLI находятся с открытым исходным кодом на GitHub.

Настройка интеграции App Store Connect в Codemagic

Теперь, когда вы успешно создали iOS-проект и настроили его для подписания кода, давайте включим подписание кода iOS и в Codemagic.

Для этого мы будем использовать интеграцию App Store Connect. Это означает, что вам необходимо создать API-ключ на Apple Developer Portal.

  1. Откройте редактор рабочих процессов и перейдите в раздел Distribution > iOS code signing.
  2. Следуйте подсказке, чтобы настроить интеграцию App Store Connect.
  3. Перейдите на портал разработчиков Apple > Пользователи и доступ.
  4. Перейдите в раздел Keys и создайте ключ API App Store Connect, затем загрузите его в Codemagic для аутентификации на портале разработчиков Apple.
  5. Завершите интеграцию Codemagic App Store Connect.

Мы рекомендуем создать специальный ключ для использования в Codemagic. Для автоматической подписи кода создайте ключ с ролью Developer. Чтобы использовать интеграцию также для публикации в App Store Connect, необходима роль App Manager. В этом примере мы будем публиковать в App Store Connect и создадим ключ с ролью App Manager.

  • Имя ключа API App Store Connect — это имя, которое поможет вам отличить ключ в Codemagic.
  • Issuer ID — это буквенно-цифровое значение над таблицей ключей API, которое идентифицирует, кто создал токен аутентификации.
  • Идентификатор ключа можно найти в таблице ключей API.
  • Ключ API — это файл ключа .p8, который можно загрузить из App Store Connect. Обратите внимание, что ключ можно загрузить только один раз.

Ссылка на документацию

Создание файла .ipa и публикация в App Store Connect

Теперь, когда вы включили интеграцию App Store Connect, вы можете использовать Codemagic для генерации файлов подписи кода (сертификат и профиль инициализации) и создания .ipa.

  1. Откройте редактор рабочего процесса.
  2. Перейдите в раздел Распространение > Подписание кода iOS.
  3. Выберите автоматическое подписание кода.
  4. Выберите ключ API.
  5. Выберите тип профиля обеспечения как App Store.
  6. Выберите идентификатор пакета.
  7. Сохраните изменения.
  8. Откройте раздел App Store Connect и включите публикацию App Store Connect; не забудьте выбрать ключ API, который мы только что создали.

Запустите новую сборку.

Вы можете столкнуться с дополнительными ошибками.

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

Если вы решили использовать конфигурацию файла .yaml в отличие от редактора рабочего процесса GUI, вы также можете указать закрытый ключ используемого сертификата распространения. Ссылка на документацию

Заключение

Вы можете использовать такой SDK, как Flutter, для разработки приложений на многих платформах. Codemagic CI/CD позволяет вам сотрудничать с вашей командой и быстро двигаться вперед, автоматически создавая и выпуская приложения для всех целевых платформ — либо для магазинов, либо для совместного использования в вашей команде.

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *