Публікація десктоп-додатки в Windows Store c допомогою Desktop Application Converter

Не так давно ми опублікували розроблене нами корпоративне додаток для десктопів, яке доповнює функціонал 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 of manifest 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 empty 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 of manifest 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 empty 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 empty 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. Як виявилося, всі нові десктопні програми вимагають ручної валідації – і для цього потрібно написати в техпідтримку.
Ми залишили заявку здесьі вже через кілька днів з нами зв'язався співробітник Майкрософт.
Пошук рішення спільно з Microsoft
Ми зібрали конференцію по Skype for Business, де розповіли, що EasyLy – це десктопное додаток, яке розширює функціонал Skype4B, наприклад вміє зберігати історію діалогів. І за результатами зустрічі відправили APPX-файл з додатком для перевірки.
Також паралельно довелося підписати ще одну угоду з Microsoft — Centennial Early Adopter Program Addendum.
Спілкування було ускладнено тим, що співробітники Microsoft перебували в Америці, і різниця в часі становила 10 годин. В результаті – доводилося спілкуватися пізно ввечері, а чекати відповідь на листи – добу.
Через деякий час ми отримали листа від Microsoft. У них виникли питання, як EasyLy інтегрується зі Skype for Business. Їм було необхідно впевнитися, що EasyLy зможе нормально працювати з наступною версією Skype for Business.
загалом, потрібно було підготувати технічний опис англійською. При цьому домовилися, що якщо щось залишиться незрозумілим, то будемо знову влаштовувати онлайн-мітинг.
На щастя, нашого опису виявилося достатньо, і співробітник Майкрософт нас запевнив, що процес схвалення йде.
Перевірка на міцність
Ми не очікували, що в Microsoft ще будуть проводитися якісь тести над нашим додатком. Представник Microsoft повідомив, що наше додаток затверджено для Windows Store, але не пройшло CARE тест. До того ж, він вказав на можливість скористатися додатковими функціями API, доступними тільки для конвертованих додатків. З цих можливостей ми вибрали автозапуск при логін користувача і додали в AppxManifest.xml елемент
<Application>
такий розділ:
<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 вирішила дбайливо не повідомляти про всі помилки відразу, а видавати їх по частинах, і кожну наступну частину показувати тільки після виправлення помилок у попередній. Воно, може, і правильно, тому що якщо б ми побачили всі помилки відразу, ймовірність того, що ми вирішили б продовжувати, була б, безумовно, менше. Але тепер, коли половина шляху було пройдено, відступати тому вже не хотілося.
В 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 Files\WindowsApps\Microsoft.DesktopAppConverter_1.0.1.0_x64__8wekyb3d8bbwe\DesktopAppConverter.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
З приводу третьої помилки Microsoft сказали, що в Windows Store процес підписання автоматичний і не потрібно намагатися підписати AppX самим. Таким чином, помилка №3 пішла.
Щодо помилки №1 нам повідомили, що можливо, це баг конвертера, пов'язаний з довжиною параметра PackageName і запропонували обхідний шлях:
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:\ProgramData\Microsoft\Windows\Images\baseImage-14393" -Installer "installer\easyly_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 в магазин.
А далі все було просто – заповнити необхідну інформацію, завантажити скріншоти і проставити суму, яку ми хочемо отримувати за продукт, і, через кілька діб, він з'явився в магазині.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.