title author date CreateTime categories
win10 uwp 安装文件 appinstaller 格式
lindexi
2019-02-11 08:55:31 +0800
2019-02-11 08:55:31 +0800
Win10 UWP

本文详细告诉大家 appinstaller 的格式,和如何通过 appinstaller 设置自动更新和安装

在使用 appinstaller 安装 UWP 应用之前,需要系统的版本是 Windows 10 Fall Creators Update 以上,通过 appinstaller 文件可以用来分发应用给用户,不需要通过微软的商店。

在微软安装的应用,需要知道应用的三个部分,第一个是应用的本身,第二个是应用使用的可选包,第三个是依赖文件。

那么这三个分开的如何在安装的时候找到?就是使用 appinstaller 文件

这里 appinstaller 不是实体,不是包含代码的安装的应用,是一个 xml 文件,里面包含了链接,应用安装器通过这个文件可以进行安装应用。

这样只需要给用户一个 appinstaller 文件,就可以通过应用安装器找到应用需要的文件安装

这是从官方文档找到的完整代码

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller
xmlns="http://schemas.microsoft.com/appx/appinstaller/2017/2"
Version="1.0.0.0"
Uri="http://mywebservice.azurewebsites.net/appset.appinstaller" > <MainBundle
Name="Contoso.MainApp"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/mainapp.appxbundle" /> <OptionalPackages>
<Bundle
Name="Contoso.OptionalApp1"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/OptionalApp1.appxbundle" /> <Bundle
Name="Contoso.OptionalApp2"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/OptionalApp2.appxbundle" /> <Package
Name="Fabrikam.OptionalApp3"
Publisher="CN=Fabrikam"
Version="10.34.54.23"
Uri="http://mywebservice.azurewebsites.net/OptionalApp3.appx" /> </OptionalPackages> </AppInstaller>

在用户通过应用安装器使用 appinstaller 安装的时候,就可以每个包的 URI 里面的链接的应用,通过 Name 和 Publisher 校验,所以这里的 Name 和 Publisher 和 Version 需要和应用的包的设置对应

下面从零开始创建一个 appinstaller 文件

首先通过 SublimeText 或 VSC 创建一个后缀是 appinstaller 的文件

一个最简单的 appinstaller 文件需要有下面的内容

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller
xmlns="http://schemas.microsoft.com/appx/appinstaller/2017/2"
Version="1.0.0.0"
Uri="http://mywebservice.azurewebsites.net/appset.appinstaller" >
</AppInstaller>

注意文件使用 utf8 格式

这里的 AppInstaller 就是告诉应用安装器这个文件的链接,就是上面的 Uri 里面的链接,还告诉应用安装器版本,这样就可以通过比较读取这个链接然后比较版本就知道是不是可以更新应用。

通过安装器的文件链接,可以告诉应用,下一次更新去哪个链接访问,如当前是从 abc.com/xx.appinstaller 访问,但是这个域名就快过期了,于是可以在这个文件里面修改 uri 为 新的域名,这样更新之后的应用就会去新的域名。

这里有一个细节是 xmlns 命名空间,这里的命名空间在给不同的系统使用是不相同的

在 UWP 应用有主要包和可选包的区别,主要包就是核心的程序,很多 uwp 程序只有主要包。现在有 appxbundle 和 msixbundle 两个不同的格式,但是这两个格式相同的写法,通过 MainBundle 如下代码。

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller
xmlns="http://schemas.microsoft.com/appx/appinstaller/2017/2"
Version="1.0.0.0"
Uri="http://mywebservice.azurewebsites.net/appset.appinstaller" > <MainBundle
Name="Contoso.MainApp"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/mainapp.appxbundle" /> </AppInstaller>

如果主要包的格式是 appx 或 msix 文件,就使用 MainPackage 替换代码的 MainBundle 代码

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller
xmlns="http://schemas.microsoft.com/appx/appinstaller/2017/2"
Version="1.0.0.0"
Uri="http://mywebservice.azurewebsites.net/appset.appinstaller" > <MainPackage
Name="Contoso.MainApp"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/mainapp.appxbundle" /> </AppInstaller>

在 AppInstaller 包含了 MainBundle 元素,在里面有 Name 表示主要包的名,发布者信息和版本,这里的 Uri 就是 appbudle 等文件的下载地址,看到了这里是不是就知道了如何通过 CDN 提供下载的方法?就是通过修改这个 URI 属性为 文件服务的链接,这样就可以从文件服务下载。如果不同的用户访问的时候返回不同的 appinstaller 文件,不同的文件的 uri 不相同,那么就可以让不同的用户在不同的服务器下载

上面的包的 Name 和 发布者版本信息需要和应用程序包清单里面的信息对应

这里的 Name 的要求是 3 到 50 个字符,发布者的信息要求是 1-8192 个字符,同时满足下面的正则表达式

(CN|L|O|OU|E|C|S|STREET|T|G|I|SN|DC|SERIALNUMBER|(OID\.(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))+))=(([^,+="<>#;])+|".*")(, ((CN|L|O|OU|E|C|S|STREET|T|G|I|SN|DC|SERIALNUMBER|(OID\.(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))+))=(([^,+="<>#;])+|".*")))*

之所以会说到这里就是因为我给小伙伴的演示随意写,然后发现无法安装,如果发现无法安装,请看一下自己的 appinstaller 文件是否没符合规则,特别需要小心 uri 的链接的长度是 1-2048 个字符

很少有开发者使用可选包,但是原因官网有告诉大家如何添加可选包,所以本文这里也写了。下面可选包内容我只是复制官网的内容,我自己没有试过,如果发现问题了,请到官网问大佬

可选包可以使用很多包,放在 OptionalPackages 里面,如下代码

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller
xmlns="http://schemas.microsoft.com/appx/appinstaller/2017/2"
Version="1.0.0.0"
Uri="http://mywebservice.azurewebsites.net/appset.appinstaller" > <MainBundle
Name="Contoso.MainApp"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/mainapp.appxbundle" /> <OptionalPackages>
<Bundle
Name="Contoso.OptionalApp1"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/OptionalApp1.appxbundle" /> <Bundle
Name="Contoso.OptionalApp2"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/OptionalApp2.appxbundle" /> <Package
Name="Fabrikam.OptionalApp3"
Publisher="CN=Fabrikam"
Version="10.34.54.23"
Uri="http://mywebservice.azurewebsites.net/OptionalApp3.appx" /> </OptionalPackages> </AppInstaller>

每一个可选包带的信息都包括 Name 发布者和版本,下载的链接,这部分就不用多说,不同的包可以有不同的发布者和版本等,需要这些信息和可选包的信息相同

如果使用的是 appxbundle 和 msixbundle 两个不同的格式,就使用 Bundle 表示,如果使用 appx 或 msix 就使用 Package 表示

在安装 UWP 很重要就是依赖包,有开发桌面应用的小伙伴就知道,很多用户都有环境问题,在 UWP 安装就会下载 UWP 需要的依赖包

很多的 UWP 包都依赖 VC 的库,如需要引用 VC 的库,可以使用下面的代码

    <Dependencies>
<Package Name="Microsoft.VCLibs.140.00" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" Version="14.0.24605.0" ProcessorArchitecture="x86" Uri="http://foobarbaz.com/fwkx86.appx" />
</Dependencies>

在这里也可以知道,不同的 UWP 可以引用相同的依赖库,所以通过 uri 可以让不同的安装程序使用相同的链接的依赖包,这样可以减少一点空间

现在看起来的 appinstaller 文件的代码已经很长

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller
xmlns="http://schemas.microsoft.com/appx/appinstaller/2017/2"
Version="1.0.0.0"
Uri="http://mywebservice.azurewebsites.net/appset.appinstaller" > <MainBundle
Name="Contoso.MainApp"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/mainapp.appxbundle" /> <OptionalPackages>
<Bundle
Name="Contoso.OptionalApp1"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/OptionalApp1.appxbundle" /> <Bundle
Name="Contoso.OptionalApp2"
Publisher="CN=Contoso"
Version="2.23.12.43"
Uri="http://mywebservice.azurewebsites.net/OptionalApp2.appxbundle" /> <Package
Name="Fabrikam.OptionalApp3"
Publisher="CN=Fabrikam"
Version="10.34.54.23"
ProcessorArchitecture="x86"
Uri="http://mywebservice.azurewebsites.net/OptionalApp3.appx" /> </OptionalPackages> <Dependencies>
<Package Name="Microsft.VCLibs.140.00" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" Version="14.0.24605.0" ProcessorArchitecture="x86" Uri="http://foobarbaz.com/fwkx86.appx" />
<Package Name="Microsoft.VCLibs.140.00" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" Version="14.0.24605.0" ProcessorArchitecture="x64" Uri="http://foobarbaz.com/fwkx64.appx" />
</Dependencies> </AppInstaller>

在应用安装文件可以告诉安装应用程序更新的频率,也就是多少小时之后访问这个文件,判断是不需要更新,这个属性是可选的。在 OnLaunch 指定时间多少小时访问文件,如 HoursBetweenUpdateChecks=10 就是 10 个小时访问一次这个文件,判断是不是需要更新。如果没有设置 HoursBetweenUpdateChecks 默认就是一天,如果设置为 0 就是每次启动应用的时候访问这个文件

    <UpdateSettings>
<OnLaunch HoursBetweenUpdateChecks="12" />
</UpdateSettings>

自动更新除了使用 OnLaunch 还可以使用 AutomaticBackgroundTask 通过这个可以在 8 小时,即使应用没有启动的时候都会访问是否更新

<UpdateSettings>
<AutomaticBackgroundTask/>
</UpdateSettings>

有时候更新了程序发现这个程序有坑,需要回滚,但是默认的自动更新只是判断文件版本比当前的新才更新,需要通过 ForceUpdateFromAnyVersion 才可以判断 appinstaller 文件的版本和当前的不同就更新,支持更新到新的版本或比当前小的版本

<UpdateSettings>
<OnLaunch HoursBetweenUpdateChecks="12"/>
<AutomaticBackgroundTask/>
<ForceUpdateFromAnyVersion>true</ForceUpdateFromAnyVersion>
</UpdateSettings>

如果需要使用 UpdateSettings 就需要使用命名空间为 http://schemas.microsoft.com/appx/appinstaller/2017/2 这在 1803 和以上的系统才能使用

在 1809 之后的 OnLaunch 提供特别复杂的功能,本文在这里就不告诉大家

总结一下,在 appinstaller 一个 xml 文件,根元素是 AppInstaller 包括命名空间和版本,这里的版本的格式是 主版本.次版本.构建号.修订号 里面可以包含下面内容

  • MainPackage 或 MainBundle 主要包

  • Dependencies 依赖包,不是必须

  • OptionalPackages 可选包 不是必须

  • RelatedPackages 相关库,不是必须

  • UpdateSettings 更新设置 不是必须

在这里需要注意,因为 appinstaller 可以指定 uri 告诉应用安装程序去哪里更新这个 appinstaller 文件,如果这里的 uri 和当前访问的不相同,那么应用安装程序就会去新的 uri 访问,如果访问新的 uri 发现这个 appinstaller 文件里面的 uri 和当前的 uri 还是不相同,那么应用安装程序会继续访问新的 uri 但是这个跳转只能三次,如果再次发现链接和当前的路劲不相同,那么就会告诉用户安装失败

2019-2-11-win10-uwp-安装文件-appinstaller-格式的更多相关文章

  1. win10 UWP读写文件

    C# uwp应用的文件读写最常见错误就是没有权限. 而最简单的方法是对已知的文件路径进行访问 已知的文件路径常见的是自身的路径 权限这个和之前不同,UWP读写文件多用StorageFile来读写文件 ...

  2. win10 uwp 关联文件

    有时候应用需要打开后缀名为x的文件,那么如何从文件打开应用? 首先,需要打开 Package.appxmanifest 添加一个功能,需要添加最少有名称,文件类型. 上面的图就是我添加jpg 的方法, ...

  3. python第三方包的windows安装文件exe格式

    今天弄了一上午的python-ldap,发现要么安装vc,要么用其他比较麻烦的方法,都比较麻烦.幸好找到这个地址: http://www.lfd.uci.edu/~gohlke/pythonlibs/ ...

  4. win10 uwp 判断文件存在

    本文主要翻译http://stackoverflow.com/questions/37119464/uwp-check-if-file-exists/37152526#37152526 我们有多种方法 ...

  5. win10 uwp 入门

    UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...

  6. win10 uwp 如何开始写 uwp 程序

    本文告诉大家如何创建一个 UWP 程序. 这是一系列的 uwp 入门博客,所以写的很简单 本文来告诉大家如何创建一个简单的程序 安装 VisualStudio 在开始写 UWP 需要安装 Visual ...

  7. win10 uwp smms图床

    本文,如何使用smms图床上传图片,用到win10 uwp post文件,因为我是渣渣,如果本文有错的,请和我说,在本文评论,或发给我邮箱lindexi_gd@163.com,请不要发不良言论 找到一 ...

  8. win10在安装Oracle11g时出现了:[INS-13001]环境不满足最低要求,及未找到文件 E:\app\xxj\product\11.2.0\dbhome_1\owb\external\oc4j_applications\applications\WFMLRSVCApp.ear

    win10安装Oracle11g碰到的3个问题: 1.win10在安装Oracle11g时出现了:[INS-13001]环境不满足最低要求 2.未找到文件 E:\app\xxj\product\11. ...

  9. 'Rem EverythingAutoSetup.VBS 安装Everything的VBS脚本 2019年11月25日写

    'Rem EverythingAutoSetup.VBS 安装Everything的VBS脚本 2019年11月25日写 'Rem Everything是voidtools开发的一款本地NTFS文件和 ...

  10. 【Unity_UWP】Unity 工程发布win10 UWP 时的本地文件读取 (上篇)

    Universal Windows Platform(UWP)是微软Windows10专用的通用应用平台,其目的在于在统一操作系统下控制所有智能电子设备. 自从Unity 5.2之后,配合VS 201 ...

随机推荐

  1. Locust如何实现负载测试?

    一.场景要求 我们在使用locust时,有时候默认的场景无法满足我们的要求时,这时后我们需要自定义场景 比如我们要设置每一段时间启动10个用户运行,执行60s后再一次启动10个用户,总共运行10分钟, ...

  2. 记录--一行代码修复100vh bug

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 你知道奇怪的移动视口错误(也称为100vh bug)吗?或者如何以正确的方式创建全屏块? 一.100vh bug 什么是移动视口错误? 你 ...

  3. AntSK 0.2.3 版本更新:轻松集成 AI 本地离线模型

    大家好,今天和大家分享 AntSK 知识库/智能体项目的最新进展. AntSK 是一个基于 .Net 8.Blazor 及 SemanticKernel 开发的 AI 项目,旨在为开发者提供一个强大的 ...

  4. 程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享)

    程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享) 应届生面试经验参考:https://www.cnblogs.com/rainbow-1/p/16779048.html 简历: 1.个 ...

  5. Android实现简单登录界面

    LoginActivity 1 package com.example.myapplication; 2 3 import android.os.Bundle; 4 import android.vi ...

  6. 【已解决】Android学习---注册和登录功能模块合并报错以及解决办法

    问题① 我在另外一个项目里写了一个注册和登录功能的几个文件,当我想把这些代码和另一个文件合起来的时候就出现了问题. 首先不可以直接把另外一个项目的某个文件直接复制过来, 最好的办法是重新新建一个相同名 ...

  7. HTTP长连接和短链接代理与网关

    长连接和短链接 代理与网关 HTTP/)服务器端网关:网关与客户端使用HTTP协议通信,使用其他协议与服务端通信 (/HTTP)客户端网关:网关与客户端使用其他协议通信,使用HTTP协议与服务端通信 ...

  8. 小师妹学JavaIO之:File copy和File filter

    目录 简介 使用java拷贝文件 使用File filter 总结 简介 一个linux命令的事情,小师妹非要让我教她怎么用java来实现,哎,摊上个这么杠精的小师妹,我也是深感无力,做一个师兄真的好 ...

  9. 我把分布式音乐播放器适配了Stage模型

     OpenAtom OpenHarmony(以下简称"OpenHarmony")应用开发自API 8及其更早版本一直使用的是FA模型进行开发.FA模型是Feature Abilit ...

  10. Git 01 概述

    版本控制 版本控制(Revision Control)用于在开发过程中管理文件修改历史,方便查看和备份. 它的作用如下: 实现跨区域多人协同开发. 追踪和记载一个或者多个文件的历史记录. 组织和保护你 ...