Особенности публикации Electron-приложений на macOS — обложка

Разработка программного кода всегда приносит удовольствие, особенно когда речь идёт о веб-платформах и десктопных приложениях. Результат сразу виден — его можно «пощупать» и оценить удобство использования.

Некоторые формальности, связанные, например, с публикацией десктопного приложения, омрачают радость. Операционные системы, такие как macOS и Windows, защищают пользователей от вредоносного ПО, поэтому просто так установить приложение не получится. Чтобы система разрешила запуск, она должна быть уверена, что приложение создано доверенным разработчиком (процесс подписания), а его код не содержит угроз для пользователей (процесс нотаризации). Windows требует только подписи приложения, а начиная с macOS 10.14 Mojave Apple также стала обязать проходить проверку кода — то есть нотаризацию.

На самом деле, данная статья, а также ее продолжение (Apple привнесла боль в процесс публикации Electron-приложений на Mac OS) появились вследствие того, что недавно пришлось столкнуться с “болью” в процессе публикации ElectronJS-приложения для macOS, и мне захотелось “сгруппировать” и описать весь свой опыт. Поэтому начнём повествование с вводной части. Если вы уже разрабатывали и публиковали приложения с использованием библиотеки ElectronJS, эту часть статьи можно спокойно пропустить и перейти к самой интересной части – продолжению, которое выйдет у нас чуть позже :)

Об ElectronJS

ElectronJS позволяет легко создать кросс-платформенное приложение, которое можно собрать и запустить на всех популярных операционных системах. Библиотека использует движок Chrome (V8) и создаёт отдельное окно, в которое можно загружать собственный HTML-код — например, написанный с помощью ReactJS. Для работы с операционной системой, например, для отображения диалоговых окон, Electron применяет собственный бэкенд. Обмен данными между интерфейсом, который видит пользователь, и бэкендом Electron происходит через события (events).

Сборка приложения не представляет сложности — для этого используются «дочерние» библиотеки Electron, такие как electron-builder, electron-packager и другие. В результате получается готовый бинарный файл: .exe для Windows, .app для macOS или исполняемый файл для Linux.

Ну что, написали и собрали приложение... Готовы публиковать и отправлять заказчику?

К сожалению, нет… Чтобы приложение запустилось у пользователей, нужен сертификат разработчика. Это так называемая «цифровая подпись» — она подтверждает авторство программы. Приложения с цифровой подписью проверены и вызывают меньше подозрений у операционной системы, антивирусов и брандмауэров. Такие программы почти никогда не попадают в карантин.

В случае отсутствия подписи у приложения macOS вежливо попросит переместить файл приложения в корзину (Рис. 1), а Windows предупредит, что издатель приложения неизвестен и использование его может быть небезопасным (Рис. 2).

Отсутствие подписи приложения на MacOS
Отсутствие подписи приложения на macOS
Отсутствие подписи приложения на Windows
Отсутствие подписи приложения на Windows

Не стоит пугать пользователя такими сообщениями — лучше сразу получить сертификат разработчика. Добавьте его в хранилище ключей (keychain) операционной системы, на которой будет подписываться приложение. После этого сертификат можно использовать для подписи. На macOS, например, для этого подходит утилита codesign из XCode Developer Tools. Библиотеки electron-builder и electron-packager предоставляют собственные обёртки для подписи — достаточно указать им, что после сборки нужно сразу подписать приложение сертификатом с таким-то именем. Кроме того, для macOS существует отдельная обёртка — библиотека electron-osx-sign. Она выполняет те же действия по подписи приложения.

Хорошо, сертификат получили, приложение подписали… Ещё что-то нужно?

Да, с выходом macOS 10.14 Mojave приложение нужно нотаризовать — то есть проверить код на серверах Apple на наличие потенциально вредоносного кода. Иначе при первом запуске пользователь может увидеть такое «неприятное» сообщение.

Пример “неприятного” сообщения при первом запуске Electron-приложения на Mac OS
Пример «неприятного» сообщения при первом запуске Electron-приложения на Mac OS

Для отправки приложения на нотаризацию нужен Apple ID — учётная запись с сайта developer.apple.com и сгенерированный пароль Apple ID, который можно получить здесь: appleid.apple.com.

Для нотаризации используется утилита altool из приложения XCode. К сожалению, она не входит в состав XCode Developer Tools, поэтому придётся устанавливать XCode целиком (тот самый случай, когда ты вообще не пользуешься XCode, но он всё равно нужен — и занимает около 30 Гб на диске).

Отправляем приложение на нотаризацию с помощью команды:

  
  xcrun altool --notarize-app --primary-bundle-id "" -u "" -p ""
  

В качестве primary-bundle-id может быть что угодно: как выяснилось, на процесс нотаризации это никак не влияет. Например, можно указать com.electron.<appName>.

Процесс нотаризации приложения на серверах Apple занимает около 5–10 минут, так что придётся подождать. Когда приложение отправится на нотаризацию, Apple выдаст вам уникальный RequestUUID — по нему можно проверить статус нотаризации с помощью команды:

 
 xcrun altool --notarization-info  -u "" -p ""
 

Также можно проверить всю историю нотаризации с помощью следующей команды:

 
 xcrun altool --notarization-history -u "" -p ""
 

Разработчики Electron-приложений также позаботились об этом процессе и расширили библиотеки electron-builder и electron-packager, добавив в общий workflow процесс нотаризации. Существует отдельная обёртка — библиотека electron-notarize, которая выполняет те же действия. Для работы нужно всего четыре вещи: собранное и подписанное .app-приложение, appleId, appleIdPassword и appBundleId.

Если автоматизированная утилита нотаризации не нашла в приложении ничего подозрительного, вы увидите статус нотаризации «Package Approved» со статус-кодом 0. В противном случае Apple сообщит, что приложение не прошло проверку — «Package Invalid», и присвоит статус-код 2. Пугаться не стоит: к каждой неудачной нотаризации прилагается лог, в котором подробно описаны все проблемы и указаны пути к файлам приложения, где они возникли.

В случае успешной нотаризации можно смело поздравить — теперь вы готовы к публикации своего приложения!

“Я... понятно объясняю?” (с) Добрыня

В процессе разработки десктопного приложения на ElectronJS (и не только) заранее подумайте о получении сертификата для подписи приложения, а также о проверке его на серверах Apple — нотации. Иначе из-за конфликтов с операционной системой число пользователей может значительно сократиться.

  • Разработка