обновить приложение uwp с USB-накопителя на Raspberry Pi

У меня есть универсальное приложение для Windows, которое я создал в Visual Studio 2017. Я развернул это приложение на своем Raspberry Pi, и оно работает хорошо. Я также создал пакет, используя 2017. Я хочу добавить кнопку обновления в свое приложение, и при нажатии она будет искать USB-накопитель и проверять файл. Если он увидит этот файл, он обновит приложение так же, как если бы он искал обновление в магазине. Это устройство не имеет подключения к Интернету и предназначено только для внутреннего использования. Но я хочу убедиться, что я могу обновить их или дать USB-накопитель с обновлением, чтобы коллега мог его обновить.

Я понятия не имею, как это сделать и возможно ли это. Любая помощь приветствуется.


person PBSnake    schedule 03.12.2018    source источник


Ответы (1)


Я хочу добавить кнопку обновления в свое приложение, и при нажатии она будет искать USB-накопитель и проверять наличие файла.

packagemanager.UpdatePackageAsync API может помочь вам сделать это в приложении UWP и обновить себя.

Но вы не можете просто «найти USB-накопитель и проверить наличие файла», как вы можете сделать на рабочем столе с помощью FilePicker, который не поддерживается в Windows IoT Core. Здесь я показываю пример, чтобы указать местоположение и версию файла, а затем обновить его.

Чтобы использовать этот API, вам нужно добавить возможность packageManagement в Package.appxmanifest следующим образом:

...   
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" 

IgnorableNamespaces="uap mp rescap">

...

  <Capabilities>
    <rescap:Capability Name="packageManagement" />
  </Capabilities>

Есть пример кода, на который вы можете ссылаться:

MainPage.xaml

<StackPanel VerticalAlignment="Center">
    <Button Content="Update" Click="Button_Click"/>
    <TextBox Name="NewVersion" PlaceholderText="For example: 1.0.5.0"/>
    <TextBox Name="PkgPath" PlaceholderText="For example: D:\AppUpdate"/>
    <TextBlock Text="Install result: " Name="Result" />
</StackPanel>

MainPage.xaml.cs

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            string versionNum = NewVersion.Text;
            string packagePath = PkgPath.Text; 
            string packageLocation = packagePath + @"\TestAppUpdate_" + versionNum + "_x86_x64_arm_Debug.appxbundle";
            PackageManager packagemanager = new PackageManager();
            await packagemanager.UpdatePackageAsync(new Uri(packageLocation), null, DeploymentOptions.ForceApplicationShutdown);
        }
        catch (Exception ex)
        {
            Result.Text = ex.Message;
        }
    }

Приложение обновится и автоматически перезапустится до новой версии.

person Rita Han    schedule 03.12.2018
comment
Спасибо за подробный пост. Кажется довольно простым, я попробую это позже сегодня или завтра и вернусь к вам по результатам. Еще раз спасибо за вашу помощь в этом очень ценится. - person PBSnake; 03.12.2018
comment
Хорошо, у меня была возможность поиграть с этим. Я очень близок, я создаю свой пакет приложений, и у него новый номер версии. Затем я копирую файлы на свой USB-накопитель и помещаю его в USB-порт Raspberry PI, нажимаю кнопку обновления и получаю следующее сообщение. Предоставленный пакет уже установлен, и переустановка пакета была заблокирована - person PBSnake; 04.12.2018
comment
@PBSnake Ошибка указывает на то, что вы устанавливаете ту же версию, что и запущенная в данный момент. Увеличьте версию приложения и повторите попытку. - person Rita Han; 04.12.2018
comment
@PBSnake Обратите внимание, что если текущая работающая версия развернута из VS2017, операция обновления завершится ошибкой из-за того, что работающее приложение является неупакованным приложением, поэтому вы не можете обновить его с помощью упакованного. Поэтому убедитесь, что работающий также установлен с упакованным appxbundle. Я сделал это через портал устройств. - person Rita Han; 04.12.2018
comment
Я несколько раз увеличивал номер версии. Я установил версию с опцией развертывания в Visual Studio. Как правильно это сделать? - person PBSnake; 04.12.2018
comment
@PBSnake Операция завершится ошибкой, если вы захотите обновить приложение, развернутое из Visual Studio. Он может обновлять только приложение, установленное с помощью упакованного appxbundle. Например, вы можете установить его через портал устройств, здесь находится документ, на который вы можете сослаться. - person Rita Han; 04.12.2018
comment
Рита, я хотел вернуться к тебе по этому поводу. У меня все работает, и я очень благодарен вам за вашу помощь. Я очень новичок, и иногда я даже не знаю, что нужно гуглить. Вы быстро помогли мне и указали мне на нужную литературу, чтобы помочь мне. Если бы я мог голосовать, я бы помог вам. - person PBSnake; 04.12.2018
comment
Рита; Извините, что беспокою вас снова, но я подумал, что вы можете быстро ответить. Есть ли возможность откатиться на предыдущую версию? С тем, что у меня есть, он не позволит мне. У меня он отлично обновляется, но если по какой-то причине они обновляются и есть проблемы, которые были пропущены, я подумал, что было бы неплохо вернуться к последней версии, пока мы не решим ее. - person PBSnake; 07.12.2018
comment
Рита, я вернулась, как ты знаешь, у меня все работает как по маслу. Это промышленное приложение, и у нас есть только одно приложение, и мы никогда не хотим, чтобы IoT обновлялся. При этом мы включили единый фильтр записи, чтобы устранить проблемы с загрузкой. Мы хотели бы по-прежнему обновлять наше приложение с USB-накопителя. Я верю, что у меня есть все исключения, добавленные для файлов. Однако я думаю, что Windows добавляет пару записей в реестр? Как я могу узнать, что они собой представляют, чтобы исключить их | - person PBSnake; 13.09.2019