Знаете ли вы, что у вас есть варианты iOS IDE?

Xcode - это IDE (интегрированная среда разработки) от Apple с долгой историей. Он предназначен для разработки под iOS, поддерживает как Objective-C, так и Swift, включает редакторы XIB и Storyboard, компиляторы, отладчики и все необходимое для разработки.

Зачем кому-то разрабатывать приложения для iOS без Xcode? Есть несколько возможных причин:

  • Xcode потребляет много памяти и медленно работает на многих компьютерах Mac.
  • В Xcode много ошибок. Apple исправляет их, но добавляет новые ошибки с новыми функциями.
  • Xcode работает только в macOS, что неудобно для разработчиков с других платформ.

К сожалению, Apple сделала все возможное, чтобы помешать разработчикам использовать другие платформы; Симулятор iOS является частью пакета приложения Xcode, альтернативы редактированию раскадровки нет, и очень сложно создать полную подписанную сборку без Xcode.

Итак, чтобы прояснить, есть вещи, которые невозможны, поэтому не ожидайте преодоления этих ограничений:

  • Родные приложения для iOS можно разрабатывать только на Mac. Вы можете писать код даже в Windows или Linux, но вы не можете создать и подписать его там.
  • Ненативные платформы, такие как Flutter или React Native, также не будут создавать сборки iOS без Mac.
  • Раскадровки можно редактировать только в Xcode, поэтому разработка без Xcode означает разработку без раскадровок.
  • Альтернативные IDE для разработки iOS требуют Xcode. Его не нужно запускать, но он должен быть установлен.
  • Подпись и загрузка приложений в App Store (или тестовый полет) могут быть выполнены из командной строки (см. Ниже), но вам необходимо установить Xcode.

Я не говорю, что Xcode абсолютно непригоден для использования. Как раз наоборот; это самый простой способ создавать приложения для iOS. Но если вы столкнулись с одной из упомянутых выше трудностей или просто хотите попробовать что-то новое, эта история для вас.

Родной или не родной?

Приложения для iOS могут быть родными или неродными. На самом деле это не черное или белое; есть много вариантов между ними.

Абсолютно нативные приложения написаны на Objective-C или Swift. Некоторые их части могут быть написаны на C или C ++. Пользовательский интерфейс обычно представлен в виде файлов раскадровки или XIB.

Абсолютно неродные приложения - это просто веб-сайты, завернутые в WKWebView (UIWebView). Сейчас Apple отвергает такие приложения, но раньше они были довольно распространены. Очевидно, что такие приложения не нуждаются в большом взаимодействии с Xcode, и создание одного UIViewController с одним WebView вряд ли станет проблемой, даже если вы арендуете Mac через Интернет и не имеете опыта работы с Xcode.

Все остальные варианты посередине. Они используют собственные компоненты, но код обычно написан на неродном языке. Например, Flutter использует Dart, React Native - JavaScript, Unity - C #. Все эти фреймворки используют свои собственные среды разработки, но все они экспортируют проект Xcode. Вам нужно собрать его, чтобы опубликовать релиз с помощью… Xcode. Обычно это не проблема. Документация содержит пошаговые инструкции для людей, которые никогда раньше не видели Xcode.

Написание приложений Flutter в Android Studio на самом деле не является темой этой истории. Это вариант по умолчанию, поэтому мы не будем тратить на него время. Мы поговорим о разработке, тестировании и распространении нативных приложений для iOS без Xcode.

Какие у нас проблемы?

Давайте посмотрим, почему не так просто писать приложения для iOS без Xcode.

  • Создание проекта - Xcode сохраняет вашу работу в проектах и ​​рабочих областях. Рабочее пространство - это просто набор связанных друг с другом проектов. Оба они представляют собой папки с текстовыми файлами внутри. Формат этих файлов является проприетарным, но они большие и содержат множество сгенерированных идентификаторов, поэтому они не должны редактироваться людьми.
  • Пользовательский интерфейс. Раскадровка - еще один проприетарный формат. Вы не можете редактировать его вне Xcode.
  • Сборка и тестирование. Существуют компиляторы командной строки swiftc, gcc и llvm, но как создать работающее приложение для iOS?

Проект iOS

Любое приложение, более сложное, чем «Hello world», имеет более одного файла. В случае iOS даже «Hello world» имеет более одного файла.

Приложения iOS, запускаемые в Simulator, состоят как минимум из двух компонентов:

  • Исполняемый двоичный файл
  • Info.plist файл

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

Для создания двоичного файла вам понадобится как минимум два элемента:

  • Исходный код
  • Сценарий сборки

Приложения для iOS можно создавать из командных строк; например, используя make. Мы посмотрим, как это сделать позже.

Более удобный способ создания приложений для iOS - использовать проект Xcode. Я нашел только одно приложение (помимо Xcode), которое может создавать такие проекты - AppCode. Это одно из приложений JetBrain, аналогичное IDEA и Android Studio, но предназначенное для разработки под Apple, macOS и iOS. Он работает только на macOS и является платным (от 8,90 долларов в месяц или 89 долларов в год в апреле 2020 года).

Внимание! AppCode не может редактировать раскадровки. Он открывает Xcode, когда вы пытаетесь. И для этого требуется установка Xcode; в противном случае приложение не будет создано.

Структура проекта Xcode

Как я упоминал ранее, проекты Xcode не должны редактироваться вручную.

xcodeproj - это папка, содержащая один файл и несколько папок внутри.

Это файл project.pbxproj. Он содержит всю информацию о проекте, и это самый важный файл.

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

project.pbxproj - это файл, похожий на plist. Этот формат пришел из платформы NeXTSTEP. Современный plist - это XML, но project.pbxproj больше похож на JSON (хотя это не JSON).

project.pbxproj - это в основном набор объектов. У каждого объекта есть уникальный идентификатор (96-битное число или строка из 24 шестнадцатеричных символов). Объектами могут быть исходные файлы, связанные структуры, этапы сборки и т. Д. Объектом может быть группа, содержащая другие объекты. Объекты могут иметь атрибуты и тип. Один из объектов - корневой объект. Он имеет тип PBXProject.

Если после всех предупреждений вы решили отредактировать project.pbxproj файл, вы можете использовать Visual Studio Code с расширением Syntax Xcode Project Data. Здесь вы можете найти подробное описание формата файла.

Помимо project.pbxproj, проекты Xcode содержат несколько папок. Все они варианты.

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

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

xcshareddata - это папка с данными, совместно используемыми пользователями; например, схемы.

Если вы не используете Xcode, вам понадобится только project.pbxproj.

Создавайте приложения для iOS с консоли с помощью make

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

Прежде всего, давайте получим путь к SDK:

xcrun --sdk iphonesimulator --show-sdk-path

Результат будет примерно таким:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk

Внутри Makefile вы можете вставить вывод xcrun или использовать команду как часть сценария:

SDKROOT:=$(shell xcrun --sdk iphonesimulator --show-sdk-path)

Сделаем app цель:

app: main.m
    clang -isysroot $(SDKROOT) -framework Foundation -framework UIKit -o MakeTest.app/$@ $^

clang - стандартный компилятор из пакета Xcode.

Добавляем два фреймворка:

  • Фонд
  • UIKit

Выходной файл - MakeTest.app/app.

$@ - автоматическая переменная, которая оценивает имя цели. В нашем случае это app. $^ - еще одна автоматическая переменная. Он оценивает полный список зависимостей - main.m в этом эксперименте.

И clean цель:

.PHONY: clean
clean:
    rm MakeTest.app/app

Наконец, давайте объявим app основной целью:

default: app

Вот полный Makefile:

Если вы никогда не использовали make для создания проектов:

  • make app создает app цель.
  • make clean очищает (удаляет app файл).

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

Следующим шагом будет создание папки приложения. Да, приложение для iOS - это папка.

mkdir MakeTest.app

Внутри MakeTest.app должно быть два файла:

  • app - это двоичный файл, который мы создаем с помощью нашей команды make.
  • Info.plist (начинающийся с заглавной I) - это список свойств проекта. Устройство или симулятор iOS должны знать, какой двоичный файл запускать, какая у него версия и другие данные.

Вот наш Info.plist. Вы можете изменить некоторые поля, если запустите собственный тест:

Последний файл - main.m. В традиционном проекте iOS есть три разных файла:

  • main.m
  • AppDelegate.h
  • AppDelegate.m

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

Вот основная функция приложения. Единственная его цель - войти в основной цикл. Также передаем имя делегата приложения - AppDelegate:

int main(int argc, char *argv[]) {
  @autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
}

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

Не забудьте включить UIKit во все файлы Objective-C вашего проекта:

#import <UIKit/UIKit.h>

Если вы пришли из Swift, вы можете не знать, что в Objective-C (а также в C ++) каждый класс должен быть объявлен и определен.

Объявление класса:

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

Определение класса:

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(id)options {
  CGRect mainScreenBounds = [[UIScreen mainScreen] bounds];
  self.window = [[UIWindow alloc] initWithFrame:mainScreenBounds];
  
  UIViewController *viewController = [[UIViewController alloc] init];
  viewController.view.backgroundColor = [UIColor whiteColor];
  viewController.view.frame = mainScreenBounds;
  UILabel *label = [[UILabel alloc] initWithFrame:mainScreenBounds];
  [label setText:@"Wow! I was built with clang and make!"];
  [viewController.view addSubview: label];
  self.window.rootViewController = viewController;
  [self.window makeKeyAndVisible];
  
  return YES;
}
@end

Он создает окно, контроллер представления и метку в его центре. Я не буду вдаваться в подробности, так как это не имеет ничего общего с кодированием вне Xcode. Это просто программирование для iOS.

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

Вот как это выглядит:

Полный исходный код main.m:

Так что же дальше?

  • Файл с правами. Если вам нужно добавить какие-либо возможности в проект iOS, вам понадобится файл с правами. Это plist файл с парой "ключ-значение", описывающей, какие ресурсы или службы устройства iOS или учетной записи Apple он использует. Более подробную информацию вы можете найти в документации Apple.
  • Вы можете видеть, что приложение в нашем примере не работает в полноэкранном режиме. Это можно исправить, добавив изображение запуска или соответствующий размер, или раскадровку экрана запуска.
  • Сделайте две мишени: для iOS-устройств и для симуляторов. Сборки iOS требуют подписи, о чем мы поговорим позже.
  • Значок приложения может быть добавлен как часть папки ресурсов Assets.xcassets или как набор файлов PNG (со ссылками в Info.plist). Assets.xcassets - это папка с активами приложения. Мы вернемся к этому позже.

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

Создайте пользовательский интерфейс

Я нашел четыре способа создания пользовательского интерфейса без Xcode и без раскадровок:

  • SwiftUI - новый конструктор пользовательского интерфейса от Apple можно редактировать в любом текстовом редакторе. Например, в Visual Studio Code (VS Code) есть плагин для написания кода Swift. И это бесплатно. Недостатком является то, что вам нужна iOS 13 для запуска приложения с SwiftUI. Через несколько лет это перестанет быть недостатком, но сейчас преждевременно отказываться от поддержки iOS 12 и более ранних версий.
  • Создание компонентов из кода. Любой компонент может быть создан из кода Objective-C или Swift без каких-либо дизайнеров пользовательского интерфейса. Он длинный и неудобный, но очень универсальный. Код можно писать где угодно, и ваше приложение будет работать даже на первом iPhone (если вам удастся собрать его для такого старого устройства).
  • Внешние инструменты. Существуют инструменты, позволяющие преобразовать дизайн (например, сделанный в Sketch) в собственный код iOS (в Objective-C или Swift). Пример такого инструмента - Supernova. Он платный, как и любой другой инструмент с аналогичной функциональностью.
  • Внешние библиотеки. Эти библиотеки позволяют писать короткий код для создания собственного пользовательского интерфейса. Они бесплатны, но вам нужно научиться ими пользоваться. Это почти как изучение нового языка программирования. Пример: LayoutKit от LinkedIn.

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

SwiftUI

SwiftUI - это новый фреймворк от Apple, который должен заменить UIKit и раскадровки.

Плюсы:

  • Это нативно для iOS. Apple будет поддерживать его, продвигать и мотивировать разработчиков использовать его.
  • Код SwiftUI можно написать в любом текстовом редакторе.
  • SwiftUI можно смешивать с UIKit в том же макете.

Минусы:

  • SwiftUI может ориентироваться только на iOS 13 или более поздние версии. Он не работает на iOS 12.
  • Предварительный просмотр и моделирование макета работает только в Xcode. Нет плагинов для AppCode, VS Code или любых других редакторов кода.

Давайте посмотрим, как работает SwiftUI:

Этот пример заимствован из официального Apple Tutorial.

Здесь вы можете найти еще один подробный учебник по SwiftUI.

Создание компонентов UIKit из кода

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

Вот как это работает:

Этот код должен находиться внутри подклассаUIViewController.

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

Внешние инструменты

Дизайнеры используют Sketch, Adobe XD, Zeplin или другие инструменты для макетов iOS. Разве не было бы замечательно, если бы вы могли просто экспортировать их в приложение для iOS? Определенно. И это возможно, но не бесплатно.

Я нашел несколько инструментов, позволяющих это сделать:

Обращаем ваше внимание, что цены не являются фиксированными и могут измениться в любой момент.

Результатом использования этих инструментов / плагинов является собственный код iOS, Swift или Objective-C.

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

Приложение Sketch открыло его с предупреждением (несоответствие версии), но это не проблема. Следующий шаг - Сверхновая.

В Supernova Studio есть возможность импортировать файл Sketch или Adobe XD.

Импорт работал, но есть небольшие глюки. Например, стрелка назад (см. Снимок экрана). Кроме того, при предварительном просмотре текст перекрывает кнопку, но это должно быть решено с помощью ограничений или UIScrollView.

Проблема со стрелкой может быть решена с помощью растровых изображений или вручную. Посмотрим, как это экспортируется в код iOS. ФайлЭкспорт в iOS. Попытка экспорта показала мне список отсутствующих шрифтов.

Хорошо, пока не будем обращать на это внимания. Системный шрифт в порядке.

Я выбрал экспорт только для iPhone и только для портретной ориентации, чтобы не вдаваться в подробности.

Язык может быть только Swift. Как по мне, имеет смысл выбирать самую последнюю. В настоящее время это Swift 5. Пользовательский интерфейс должен быть кодом. Другие варианты - это раскадровка и XIB, но их можно открыть только с помощью Xcode, поэтому это не вариант для нас.

Процесс экспорта занял меньше минуты. Он создал проект Xcode с Podfile. Podfile почти пуст; у него есть только скелет, но нет зависимостей.

В любом случае, давайте установим Pods для создания рабочего пространства.

Каждый экран представляет собой отдельный класс, подкласс UIViewController, расположенный в отдельных папках. Шрифты, изображения и другие ресурсы также экспортируются. И никаких раскадровок. Значит, мы можем открыть его с помощью AppCode.

Вот пример экспорта из Supernova Studio, файл HomeActivityNavViewController:

Этот файл содержит «авторское право © 2018 Supernova». Это интересная деталь, потому что я сделал этот экспорт в марте 2020 года.

Проект успешно строится и запускается. Вот как это выглядит:

Очевидно, что кнопки не работают, потому что я никогда не добавлял логику в Supernova Studio. Но это возможно. У кнопки нет зеленого фона. На мой взгляд, эти проблемы несущественны и могут быть легко исправлены в коде после экспорта. Логику можно добавить как в Supernova Studio, так и в IDE (Xcode или App Code).

Внешние библиотеки

Существуют разные фреймворки верстки. Они появляются и исчезают, поэтому, если вы выберете этот метод, просто найдите фреймворк, который имеет последние обновления (в течение прошлого года) и который поддерживает Swift 5 и имеет необходимые вам функции.

Рассмотрим один из самых популярных - LayoutKit от LinkedIn.

Пример заимствован с официального сайта LayoutKit.

Он создает стандартные компоненты UIKit (как и все фреймворки) так же, как мы делали ранее, но имеет две дополнительные функции:

  • Код короче и понятнее.
  • Он добавляет простые способы автоматического изменения размера компонентов.

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

SnapKit помогает добавлять ограничения с помощью кода.

Пример заимствован с официального сайта SnapKit.

Резюме

Что бы вы ни выбрали, не забывайте, что ваши макеты должны соответствовать Руководству по человеческому интерфейсу Apple.

Ресурсы

В большинстве приложений для iOS есть специальная папка с активами. Обычно это одна папка с именем Assets.xcassets. Если вы создаете новый проект Xcode, эта папка будет создана автоматически.

Он содержит различные типы ресурсов: изображения, цвета, данные, ресурсы AR, наборы стикеров и другие. Самый популярный актив - наборы изображений. У наборов изображений, помимо изображений, есть важные метаданные. Например, наборы изображений могут иметь разные изображения для разных размеров экрана, типов устройств и разрешений. Изображения из набора могут быть визуализированы как исходное изображение или как шаблон. Цвета изображений шаблона можно изменить с помощью атрибута tint.

В папке ресурсов есть json файлов для хранения метаданных. Имя у всех этих файлов одинаковое - Contents.json. Корень Contents.json обычно выглядит так:

{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

Я не вижу причин менять этот файл. Файлы во внутренних папках более интересны. Это пример файла aContents.json внутри AppIcon.appiconset:

{
  "images" : [
    {
      "size" : "20x20",
      "idiom" : "iphone",
      "filename" : "[email protected]",
      "scale" : "2x"
    },
    ...
    {
      "size" : "1024x1024",
      "idiom" : "ios-marketing",
      "filename" : "[email protected]",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

Раздел “info” такой же. “images” содержит массив изображений иконок для различных устройств и разрешений. Атрибуты:

  • size - размер иконки в пунктах
  • идиома - тип устройства
  • filename - имя файла. Файл должен находиться в той же папке.
  • scale - масштаб устройства (2x или 3x для устройств с экраном Retina, 1x для устройств с низким разрешением).

Файл Contents.json набора значков имеет аналогичную структуру. Например:

{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "button_back.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "[email protected]",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "[email protected]",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

Я оставлю другие типы активов за рамками. Они более продвинутые и используются не во всех проектах.

Папки с активами можно редактировать в Xcode и AppCode. Кроме того, если вы загрузите наборы изображений с некоторых веб-сайтов, например, значки материалов, вы получите imageset папки с Contents.json внутри. Во всех остальных случаях вам нужно создать json файлов вручную.

Работа с симулятором iOS

Допустим, вы создали приложение и у вас есть двоичный файл (на самом деле это папка, но в ней есть двоичный файл). Как запустить его на симуляторе iOS?

Прежде всего, вам нужно запустить его.

AppCode может запустить его за вас; в этом аспекте он очень похож на Xcode. Он поддерживает отладку кода и даже работает на физическом устройстве.

Если у вас есть папка с приложением iOS, вам необходимо выполнить три шага:

  1. Запустите симулятор iOS вручную.
  2. Перетащите папку приложения на работающий симулятор iOS.
  3. Найдите его на виртуальном экране и запустите.

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

open -a Simulator.app

Чтобы выбрать модель устройства и версию iOS, используйте меню ФайлОткрыть устройство или ОборудованиеУстройство (в более ранних версиях версии).

Отладка

У симулятора iOS есть один секрет. Все приложения, работающие в нем, на самом деле являются приложениями x86_64, работающими на вашем Mac (в какой-то песочнице). Это означает, что вы можете отлаживать приложение iOS локально, так же, как любое приложение macOS.

Прежде всего, запустите lldb:

lldb

Во-вторых, прикрепите к процессу:

(lldb) process attach --pid 12345

or:

(lldb) process attach --name MyApp

Вы можете найти свое приложение в приложении Activity Monitor, которое установлено на всех компьютерах Mac. Там вы можете найти pid вашего приложения (идентификатор процесса).

Если вы не знаете, как использовать lldb, вот документация.

Подписание приложений

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

Во-первых, вам нужно знать несколько вещей:

  • Приложение iOS, как и приложение macOS, представляет собой папку, в которой используется расширение app.
  • Чтобы распространять приложение для iOS, вам необходимо создать архив с именем ipa. Это zip-архив с папкой app внутри папки Payload.
  • Перед созданием ipa архива необходимо подписать приложение iOS.
  • Чтобы подписать приложение iOS, вам потребуется учетная запись разработчика Apple. Вы можете создать его на Портале разработчиков Apple.
  • Только подписанные приложения могут работать на физическом устройстве iOS, даже если это ваш собственный iPhone.
  • У вас должен быть сертификат и профиль подготовки для подписи приложения. Xcode создает их автоматически, но если вы подписываете приложение вручную, вам придется запросить их самостоятельно.
  • Информация о вашем приложении (идентификатор пакета, права) в ваших plist файлах и вашем профиле обеспечения должны совпадать.

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

В этом примере я буду использовать приложение, созданное ранее в разделе «Сборка приложений для iOS из консоли с помощью make» выше. Это называется MakeTest.

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

Шаг 0. Скомпилируйте приложение.

Прежде чем мы начнем, у вас должно быть приложение для armv7 и arm64. Если вы создаете его из Xcode или другой платформы, просто выберите правильную цель. Если вы используете пример, который мы создали ранее, внесите некоторые изменения в Makefile:

  1. Заменять:
SDKROOT:=$(shell xcrun --sdk iphonesimulator --show-sdk-path)

с участием:

SDKROOT:=$(shell xcrun --sdk iphoneos --show-sdk-path)

2. Измените команду сборки с:

clang -isysroot $(SDKROOT) -framework Foundation -framework UIKit -o MakeTest.app/$@ $^

to:

clang -isysroot $(SDKROOT) -arch armv7 -arch arm64 -framework Foundation -framework UIKit -o MakeTest.app/$@ $^

Это сгенерирует так называемый «толстый» двоичный файл с двумя архитектурами. Это именно то, что нам нужно.

Если вы получите какие-либо ошибки на этом этапе, у вас, вероятно, проблемы с Xcode. Установите его, если вы еще этого не сделали. Запустите его, и Xcode установит инструмент командной строки после каждого обновления.

Шаг 1. Создайте сертификат

Чтобы создать сертификат, перейдите по этой ссылке: https://developer.apple.com/account/resources/certificates/list. Если вы разрабатывали свои приложения для iOS с помощью Xcode на том же Mac, вы можете пропустить этот шаг. Если нет, нажмите кнопку + и добавьте новый сертификат Apple Distribution. Я не буду здесь вдаваться в подробности. Процесс довольно прост, и вы можете найти множество учебных пособий и руководств. Загрузите и установите его, когда он будет готов.

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

Шаг 2. Кодовое оформление

Откройте приложение «Терминал» и измените текущий каталог на свою рабочую папку (содержащую MakeTest.app).

cd full_path

Тип:

codesign -s "Apple Distribution: Your Account Name (TEAM_ID)" MakeTest.app

Через несколько секунд вы увидите папку _CodeSignature внутри MakeTest.app. Это цифровая подпись. И это причина не делиться своим сертификатом с людьми, которым вы не доверяете. Эта подпись подтверждает, что вы разработали приложение. Если кто-то украдет ваш сертификат и опубликует подписанное приложение, которое делает что-то незаконное, ваша учетная запись может быть заблокирована.

Шаг 3. Создайте профиль обеспечения.

Откройте портал подготовки Apple: https://developer.apple.com/account/resources/profiles/list.

Щелкните кнопку «+». Вы можете сгенерировать несколько типов профилей:

  • Разработка приложений для iOS - можно использовать только для ваших собственных устройств.
  • AdHoc - может распространяться на ограниченное количество устройств, включенных в профиль
  • App Store - можно загрузить в App Store

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

На следующем шаге вам нужно выбрать идентификатор своего приложения. Вероятно, вашего идентификатора еще нет в списке.

Если это так, перейдите к списку идентификаторов и добавьте новый идентификатор приложения: https://developer.apple.com/account/resources/identifiers/list. Помните, что идентификатор вашего приложения (идентификатор пакета) должен совпадать с идентификатором в вашем Info.plist. Вы можете выбрать возможности, которые используете в приложении. Для этого теста вам не нужно ничего выбирать. Некоторые из них можно выбрать заранее; оставьте их без изменений.

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

На следующем этапе вам нужно выбрать устройства. Если вы раньше использовали Xcode, ваше устройство, вероятно, зарегистрировано. Если нет, зарегистрируйте его вручную здесь:

Чтобы зарегистрировать новое устройство, вам необходимо ввести его UDID (уникальный идентификатор устройства). Получить его можно двумя способами:

  • Вы можете подключить свое устройство с помощью провода к ПК / Mac и найти UDID в iTunes. В macOS Catalina нет iTunes, но вы можете найти свое устройство в Finder. Под названием устройства вы увидите дополнительную информацию. Щелкните его один или несколько раз, пока не увидите UDID. Обратите внимание, что серийный номер и UDID отличаются.
  • Вы можете воспользоваться одним из сервисов вроде https://get.udid.io или аналогичным. Откройте его на своем устройстве iOS и следуйте инструкциям.

После регистрации устройства вернитесь к созданию профиля, проверьте одно или несколько устройств и сгенерируйте профиль. На последнем шаге вам нужно ввести имя профиля. Обычно я использую название приложения плюс «AdHoc». Загрузите профиль, когда он будет готов.

Шаг 4. Подготовка

Чтобы добавить профиль обеспечения в свое приложение, просто скопируйте его в папку app и переименуйте в embedded.mobileprovision.

Затем подпишите его еще раз:

codesign -f -s "Apple Distribution: Your Account Name (TEAM_ID)" MakeTest.app

Если вы подписывали его раньше, добавьте флаг -f (принудительно).

Шаг 5. Права

Сначала создадим файл прав:

security cms -D -i Payload/MakeTest.app/embedded.mobileprovision

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>TEAM_ID.com.test.make</string>
    <key>keychain-access-groups</key>
    <array>
        <string>TEAM_ID.*</string>
    </array>
    
    <key>get-task-allow</key>
    <false/>
    <key>com.apple.developer.team-identifier</key>
    <string>TEAM_ID</string>
</dict>
</plist>

У вас должен быть тот же идентификатор приложения, что и на всех предыдущих шагах, и TEAM_ID, соответствующий вашей учетной записи разработчика Apple.

Не следует включать файл прав в Payload. Вместо этого используйте его как аргумент командыcodesign:

codesign -f -s "Apple Distribution: Your Account Name (TEAM_ID)" --entitlements 'MakeTest.entitlements' Payload/MakeTest.app

Шаг 6. Создайте ipa

Чтобы установить приложение на физическое устройство, вам нужно создать ipa архив. Посмотрим, как это сделать:

mkdir Payload
cp -r MakeTest.app Payload
zip -r MakeTest.ipa Payload

Мы здесь! У нас есть архив - MakeTest.ipa.

Шаг 7. Распространение

Для распространения ваших приложений рекомендую Diawi. Diawi (разработка и беспроводная установка собственных приложений) - это услуга, позволяющая загрузить свой ipa (или apk для Android) и получить ссылку и QR-код. Вы отправляете эту ссылку (и / или QR-код) владельцу устройства (UDID устройства iOS должен быть в созданном вами профиле обеспечения), и они могут установить его с помощью пары нажатий.

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

Шаг 8. Обновите Info.plist и устраните неполадки.

Когда вы делаете сборку в Xcode, он добавляет несколько полей в Info.plist перед его подписанием.

Внимание! Вам следует обновить подпись приложения после любых изменений, включая изменения в Info.plist.

Эти два поля необходимы для загрузки релиза:

<key>CFBundleSupportedPlatforms</key>
<array>
  <string>iPhoneOS</string>
</array>
<key>MinimumOSVersion</key>
<string>10.0</string>

Номер версии может быть другим в зависимости от вашей целевой версии iOS.

Когда вы добавите эти поля, загрузка будет успешной, но вы все равно не сможете установить приложение. Производственная версия Info.plist должна содержать информацию о совместимых устройствах.

Я скопировал значения из созданного Xcode ipa. В некоторых из них нет необходимости, но они не причинят вреда:

<key>BuildMachineOSBuild</key>
<string>19D76</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>17B102</string>
<key>DTPlatformName</key>
<string>iphoneos</string>
<key>DTPlatformVersion</key>
<string>13.2</string>
<key>DTSDKBuild</key>
<string>17B102</string>
<key>DTSDKName</key>
<string>iphoneos13.2</string>
<key>DTXcode</key>
<string>1130</string>
<key>DTXcodeBuild</key>
<string>11C504</string>
<key>UIDeviceFamily</key>
<array>
    <integer>1</integer>
    <integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UIRequiresFullScreen</key>
<true/>
<key>UIStatusBarHidden</key>
<false/>

Вот последняя версия моего Info.plist файла:

Возможно, ваше приложение еще не установлено на ваше устройство. Скорее всего, вы не увидите никаких ошибок. Но если вы это сделаете, как вы их устраните?

Откройте приложение Console на вашем Mac. Ваше устройство iOS должно быть подключено.

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

На скриншоте выше вы можете увидеть проблему с файлом прав. Его не должно быть, если вы выполнили все шаги, но если ваш случай более сложный или вы пропустили какой-то шаг, вы можете использовать приложение Console, чтобы проверить, что не так.

Выполнено

Если вы все сделали правильно, вы увидите, что ваше приложение установлено на вашем устройстве.

Если у вас все еще есть проблемы:

  1. Попробуйте добавить иконку приложения. Для этого вам не нужен Каталог активов. Вы можете просто добавить необходимые файлы png и добавить их в свой Info.plist.
  2. Добавьте файл PkgInfo. Честно говоря, я не понимаю его цели, но все пакеты, генерируемые Xcode, включают его. В нем всего 8 символов: APPL????.

Заключение

Совершенно возможно создавать приложения для iOS без использования Xcode. Если у вас действительно есть что-то против Xcode, вам, вероятно, следует использовать AppCode. Вы можете писать код, строить и отлаживать прямо здесь. В нем много плагинов, которые упростят процесс.

Макеты можно создавать разными способами, используя код или альтернативные решения, такие как Supernova Studio или Sketch (с плагином).

Создание проектов iOS с использованием только Терминала и текстового редактора чрезвычайно сложно, но вполне возможно. Этот метод следует использовать только в том случае, если это действительно необходимо; например, для автоматических сборок.

Увидимся в следующий раз. Удачного кодирования!