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

Некоторые формальности, связанные, например, с публикацией написанного десктопного приложения, омрачают радость. Операционные системы, такие как 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 (electron-osx-sign). Она выполняет аналогичные действия подписания приложения.

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

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

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

Для того, чтобы отправить приложение на нотаризацию, необходим Apple ID - e-mail с сайта developer.apple.com и сгенерированный Apple ID Password вот отсюда: appleid.apple.com.

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

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

  
  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 (electron-notarize), которая делает абсолютно аналогичные действия. Нужно всего лишь четыре вещи: собранное и подписанное .app приложение, appleId и appleIdPassword, а также appBundleId.

Если автоматизированная утилита нотаризации не обнаружила в приложении ничего плохого, то вы увидите статус нотаризации “Package Approved” со статус-кодом 0. Иначе, Apple скажет, что ваше приложение – “инвалид” (“Package Invalid”) и установит статус-код 2. Не стоит пугаться, к каждой “плохой” нотаризации прикреплен лог, в котором описаны все проблемы, а также приведены пути до файлов вашего приложения, где возникла та или иная проблема.

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

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

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

  • Разработка