Найти тему

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

Оглавление

Оригинальная версия статьи опубликована в блоге Codemagic

Добавьте описание
Добавьте описание
В этой статье Вы узнаете, как создавать и публиковать приложения для iOS, если Вы работаете в Linux или Windows. Мы покажем, что это возможно с помощью Flutter и Codemagic.
Обратите внимание! Существует разница между разработкой iOS-приложений и их созданием и публикацией с помощью Codemagic.

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

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

НАМ ПОНАДОБИТСЯ

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

Давайте приступим к созданию и публикации приложения для iOS используя только 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 вместо того, чтобы просить об этом других.

Разработка приложений 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. Откройте редактор workflow-процессов Flutter и выберите Run tests only.

2. Убедитесь, что тесты отключены в разделе Tests.

3. Откройте кнопку "+" после раздела "Распределение" и напишите:

#!/bin/sh
echo "My first green build!"

1. Сохраните изменения.

2. Запустите сборку.

Добавьте описание
Добавьте описание

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

1. Откройте редактор рабочего процесса.

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

Добавьте описание
Добавьте описание

1. Сохраните изменения.

2. Запустите сборку.

Добавьте описание
Добавьте описание

Успешно!

Сборка приложения для iOS

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

1. Откройте редактор workflow-процессов.

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, открыв редактор workflow-процессов и установив триггер сборки на build on push to master.

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

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

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

Начинаем подписание кода iOS

Судя по количеству вопросов, связанных с подписанием кода iOS на Stackoverflow, многие разработчики испытывают с этим трудности. Мы понимаем, что настройка подписи кода может стать головной болью, особенно если Вы пытаетесь заставить ее работать в среде 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. Откройте редактор workflow-процессов и перейдите в раздел Distribution > iOS code signing.

2. Следуйте подсказке, чтобы настроить интеграцию App Store Connect.

3. Перейдите на портал разработчиков Apple > Пользователи и доступ.

4. Перейдите в раздел "Ключи" и создайте 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. Откройте редактор workflow-процессов.

2. Перейдите в раздел Распространение > Подписание кода iOS.

3. Выберите автоматическое подписание кода.

4. Выберите ключ API.

5. Выберите тип профиля обеспечения как App Store.

6. Выберите идентификатор пакета.

7. Сохраните изменения.

8. Откройте раздел App Store Connect и включите публикацию App Store Connect; не забудьте выбрать ключ API, который мы только что создали.

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

Добавьте описание
Добавьте описание

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

Добавьте описание
Добавьте описание

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

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

Заключение

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

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

Переведено на русский язык с сайта: https://medium.com/flutter-community/how-to-build-and-distribute-ios-apps-without-mac-with-flutter-codemagic-34bf6c29436f