Публикация десктоп-приложения в Windows Store c помощью Desktop Application Converter

в 15:08, , рубрики: .net, desktop application converter, windows store, разработка под windows

Не так давно мы опубликовали разработанное нами корпоративное приложение для десктопов, которое дополняет функционал Skype for Business. Например, может «по-человечески» сохранять историю переписки, как это делают все «приличные» мессенджеры, умеет отправлять сообщения в оффлайн, позволяет упорядочить контакты и ещё много всего, чего не хватало в Skype for Business. И когда появилась возможность поделиться приложением с помощью Windows Store, мы решили этой возможностью воспользоваться. В статье мы расскажем, как это происходило и чего нам это стоило.

Про сам процесс разработки и про то, чего нам стоила идея работы со SfB в режиме Suppression Mode (подавление SfB), читайте здесь.
EasyLy разрабатывался как настольное приложение WPF & Lync SDK для Windows, и конечно же, мы стремились поделиться своей разработкой со всем миром. Публикация «классических» десктопных приложений (без метро-интефейса) стала доступна не так давно, опыта у нас совсем не было, поэтому мы начали изучать, как загрузить наше приложение в Windows Store.

Начало

Вся суть заключалась в том, чтобы с помощью Desktop Application Converter преобразовать приложение в AppX пакет для UWP (Universal Windows Platform), чтобы затем его можно было загрузить в Windows Store.
Нужно заметить, что не любое настольное приложение можно разместить в магазине. Оно должно удовлетворять требованиям, описанным в этой статье.
Для самого процесса конвертирования необходима ОС “Юбилейное обновление Windows 10 Pro” или “Корпоративная” (10.0.14393.0 и более поздней версии) x64. Также нужно будет установить Microsoft Windows 10 SDK. А перед работой с конвертером понадобится скачать один из базовых образов Windows 10.

ВАЖНО: Версия билда операционной системы должна в точности совпадать с версией образа BaseImage-xxxxx.wim.

После прочтения статьи о том, как работать с конвертером, мы разработали систему скриптов для Command Prompt и Power Shell, которые генерировали AppxManifest.xml и конечный пакет AppX.

И вот, наконец, всё было готово для загрузки EasyLy.appx в Windows Store. Честно говоря, мы не рассчитывали на то, что процесс размещения приложения окажется так растянут по времени, но в общей сложности у нас на это ушло примерно два месяца. Мы также не ожидали, что впереди нас будут ждать странные ошибки, с которыми придётся бороться совместно с сотрудниками Microsoft. Эмоции команды были на переделе, но всё же нам это удалось. О том, что это были за ошибки и как мы их устраняли, читайте ниже.

Ошибка, и не одна.

При первой попытке публикации в Windows Store мы получили четыре ошибки.

  1. Package acceptance validation error: We don’t allow the capability you’ve specified: runFullTrust.

  2. Package acceptance validation error: The PublisherDisplayName element in the app manifest of EasyLy.signed.appx is GROVETY, INC, which doesn't match your publisher display name: GROVETY INC.

  3. Package acceptance validation error: Apps are not allowed to have a Version with a revision number other than zero specified in the app manifest. The package EasyLy.signed.appx specifies 1.61.6088.26940.

  4. Package acceptance validation error: You don't have permissions to specify the following namespaces in the appx manifest file of the package EasyLy.signed.appx: schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities

Мы исправили ошибку №3 с версией. Оказалось, что запрещено иметь ревизию версии (последний разряд версии), отличную от нуля (major.minor[.build[.revision]]). Что ж, это было несложно.

Было: DesktopAppConverter.exe … -Version 1.61.6088.26940
Стало: DesktopAppConverter.exe … -Version 1.61. 6088.0

В дальнейшем мы отказались и от версии билда: DesktopAppConverter.exe … -Version 1.61.0.0

Оставались ещё три ошибки.

1. Package acceptance validation error: The PublisherDisplayName element in the app manifest of EasyLy.s.appx is GROVETY, INC, which doesn't match your publisher display name: GROVETY INC.
2. Package acceptance validation error: You don't have permissions to specify the following namespaces in the appx manifest file of the package EasyLy.s.appx: schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities
3. Package acceptance validation error: Your developer account doesn’t have permission to submit apps converted with the Desktop App Converter at this time.

Была исправлена ошибка №1 с именем сертификата в AppxManifest.xml:

Было: <PublisherDisplayName>GROVETY, INC</PublisherDisplayName>
Стало: <PublisherDisplayName>GROVETY INC</PublisherDisplayName>

Если честно, было странно, что это исправление сработало, и непонятно, с каким значением происходит сравнение имени сертификата, т.к. в свойствах AppX пакета в разделе “Цифровые подписи” имя сертификата было как раз с запятой, а к интерфейсу выкладывания в Windows Store разработчики доступа не имели (чтобы посмотреть, как там выглядит имя издателя и что оно вообще там присутствует), потому что публикация осуществлялась отделом маркетинга.

image

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

1. Package acceptance validation error: You don't have permissions to specify the following namespaces in the appx manifest file of the package EasyLy.s.appx: schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities
2. Package acceptance validation error: Your developer account doesn’t have permission to submit apps converted with the Desktop App Converter at this time.

Что делать с этими ошибками нам подсказал один из авторов habrahabr'а — asommer. Как оказалось, все новые десктопные приложения требуют ручной валидации – и для этого нужно написать в техподдержку.

Мы оставили заявку здесь, и уже через несколько дней с нами связался сотрудник Майкрософт.

Поиск решения совместно с Майкрософт

Мы собрали конференцию по Skype for Business, где рассказали, что EasyLy – это десктопное приложение, которое расширяет функционал Skype4B, например умеет сохранять историю диалогов. И по результатам встречи отправили APPX-файл с приложением для проверки.

Также параллельно пришлось подписать ещё одно соглашение с Майкрософт — Centennial Early Adopter Program Addendum.

Общение было затруднено тем, что сотрудники Майкрософт находились в Америке, и разница во времени составляла 10 часов. В результате – приходилось общаться поздно вечером, а ждать ответ на письма – сутки.

Через некоторое время мы получили письмо от Майкрософт. У них возникли вопросы, как EasyLy интегрируется со Skype for Business. Им было необходимо удостовериться, что EasyLy сможет нормально работать со следующей версией Skype for Business.

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

Проверка на прочность

Мы не ожидали, что в Microsoft ещё будут проводиться какие-то тесты над нашим приложением. Представитель Microsoft сообщил, что наше приложение утверждено для Windows Store, но не прошло CARE тест. К тому же, он указал на возможность воспользоваться дополнительными функциями API, доступными только для конвертируемых приложений. Из этих возможностей мы выбрали автозапуск при логине пользователя и добавили в AppxManifest.xml в элемент такой раздел:

<Extensions>
  <desktop:Extension EntryPoint="Windows.FullTrustApplication" Executable="EasyLy.exe" Category="windows.startupTask">
    <desktop:StartupTask DisplayName="EasyLy" Enabled="true" TaskId="GROVETYINC.EasyLyCorp.Startup"/>
  </desktop:Extension>
</Extensions>

Чуть подробнее о тесте CARE. Судя по отчёту прохождения, который они нам прислали, проверяются следующие вещи:

Test for Drivers and Services (Drivers cannot be installed)
Test for DDE Exec registry verbs (DDE Exec warning)
Validate Appx Manifest (Application Identity Name can't be empty)
Validate security policy settings (EXE can not request admin elevation, EXE can not request UIAccess)
Validate PE integrity (PE Files must be validly signed)

EasyLy провалился на втором пункте. Программа обращалась к нестандартным ключам реестра. Это было исправлено.

Теперь, когда все проблемы были решены, мы предвкушали радость победы и долгожданной загрузки EasyLy в Windows Store. Но удача снова не была на нашей стороне и появились очередные ошибки:

1. Invalid package identity name: EasyLy (expected: GROVETYINC.EasyLyCorp).
2. Invalid package family name: EasyLy_04mzw0hspzxdg (expected: GROVETYINC.EasyLyCorp_8qq6gc35dw28r)
3. Invalid package publisher name: CN=”GROVETY, INC”, O=”GROVETY, INC”, L=Wilmington, S=”Delaware”, C=US (expected: CN=71A49F4D-5C79-40F1-A333-B79F06F50E03)
4. This package uses a display name that you have not reserved: EasyLy

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

В Майкрософт ответили следующее:

  1. Непонятно, что это такое. Попробуйте исправить вначале остальные ошибки.
  2. Всё верно, регистрируемый пакет называется «GROVETYINC.EasyLyCorp_8qq6gc35dw28r».
  3. Уберите запятую из имени издателя.
  4. Имя регистрируемого приложения “EasyLy Corp”.

Было: DesktopAppConverter.exe … -Publisher «CN=GROVETY»
Стало: DesktopAppConverter.exe … -Publisher «CN=GROVETY INC» -PackageDisplayName «EasyLy Corp» -AppDisplayName «EasyLy» -AppExecutable «EasyLy.exe»
После этих изменений ушла ошибка №4.

Пытаясь устранить ошибку №1 добавили в параметры конвертера -PackageName «GROVETYINC.EasyLyCorp», но получили непонятную ошибку при конвертации:

Error:
PowerShell Error Record:
Could not find a part of the path.
PowerShell Stack Trace:
at <ScriptBlock>, C:Program FilesWindowsAppsMicrosoft.DesktopAppConverter_1.0.1.0_x64__8wekyb3d8bbweDesktopAppConverter.ps1: line 719
at <ScriptBlock>, <No file>: line 1
Inner Exception[0]:
System.IO.DirectoryNotFoundException: Could not find a part of the path.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileInfo.MoveTo(String destFileName)
   at Microsoft.PowerShell.Commands.FileSystemProvider.MoveFileInfoItem(FileInfo file, String destination, Boolean force, Boolean output)
Inner Exception Stack Trace[0]
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileInfo.MoveTo(String destFileName)
   at Microsoft.PowerShell.Commands.FileSystemProvider.MoveFileInfoItem(FileInfo file, String destination, Boolean force, Boolean output)

Также опытным путём было замечено, что если PackageNamе имеет длину 19 символов или меньше, то ошибки не возникает, а имя GROVETYINC.EasyLyCorp имеет длину 21 символ.

Пытаясь устранить ошибку №3 с сертификатом пробовали разные варианты:

  1. CN=«GROVETY INC»
  2. CN=«GROVETY INC», O=«GROVETY INC», L=Wilmington, S=Delaware, C=US
  3. CN=71A49F4D-5C79-40F1-A333-B79F06F50E03 (как указано в сообщении об ошибке)

Но наш сертификат имеет именно такой вид: CN=«GROVETY, INC», O=«GROVETY, INC», L=Wilmington, S=Delaware, C=US, поэтому ожидаемо, что мы получали ошибку при подписывании:
image

По поводу третьей ошибки Майкрософт сказали, что в Windows Store процесс подписывания автоматический и не нужно пытаться подписать AppX самим. Таким образом, ошибка №3 ушла.
Насчёт ошибки №1 нам сообщили, что возможно, это баг конвертера, связанный с длиной параметра PackageName и предложили workaround:

a.      Укоротите PackageName насколько нужно и добавьте легко узнаваемы флаг, например, EasyLyChangeMe.

b.      Соберите appx пакет.

c.       Откройте пакет

makeappx unpack /p “[appx path and file]” /d “[Unpack folder]”
d.       Вручную измените PackageName на GROVETYINC.EasyLyCorp.

<Identity Name="xxxx" ProcessorArchitecture="x86" Publisher="CN=pppp" Version="1.0.0.0" /> 

В строке сверху в манифест файле атрибут Name должен совпадать со значением Name, на странице приложения в Windows Store в разделе APP management -> App Identity

e.       Пересоберите appx пакет.

makeappx pack /p “[new appx path and file]” /d “[Unpack folder]”

Следуя этому workaround мы решили наши проблемы. В конечном итоге строка с параметрами конвертера теперь выглядит так:

DesktopAppConverter.exe -ExpandedBaseImage "C:ProgramDataMicrosoftWindowsImagesbaseImage-14393" -Installer "installereasyly_v1.61_setup.exe" -Version 1.61.0.0 -InstallerArguments "/verysilent" -Destination "out" -PackageName "GROVETYINC.EasyLy" -PackageDisplayName "EasyLy Corp" -AppDisplayName "EasyLy" -AppExecutable "EasyLy.exe" -AppId "GROVETYINC.EasyLyCorp" -Publisher "CN=71A49F4D-5C79-40F1-A333-B79F06F50E03" -PackagePublisherDisplayName "CN=GROVETY INC" -Verbose 

Счастливый конец

В результате всех этих действий мы получили пакет, который прошёл валидацию! И — ура! Можно было отправить наш EasyLy в магазин.

А дальше всё было просто – заполнить необходимую информацию, загрузить скриншоты и проставить сумму, которую мы хотим получать за продукт, и, через несколько суток, он появился в магазине.

Автор: EasyLy

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js