2019-2-11-win10-uwp-安装文件-appinstaller-格式
| 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 命名空间,这里的命名空间在给不同的系统使用是不相同的
给 win10 1809 和以上使用的是 http://schemas.microsoft.com/appx/appinstaller/2018
给 win10 1803 和以上使用的是 http://schemas.microsoft.com/appx/appinstaller/2017/2
给 win10 1709 和以上使用的是 http://schemas.microsoft.com/appx/appinstaller/2017
在 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-格式的更多相关文章
- win10 UWP读写文件
C# uwp应用的文件读写最常见错误就是没有权限. 而最简单的方法是对已知的文件路径进行访问 已知的文件路径常见的是自身的路径 权限这个和之前不同,UWP读写文件多用StorageFile来读写文件 ...
- win10 uwp 关联文件
有时候应用需要打开后缀名为x的文件,那么如何从文件打开应用? 首先,需要打开 Package.appxmanifest 添加一个功能,需要添加最少有名称,文件类型. 上面的图就是我添加jpg 的方法, ...
- python第三方包的windows安装文件exe格式
今天弄了一上午的python-ldap,发现要么安装vc,要么用其他比较麻烦的方法,都比较麻烦.幸好找到这个地址: http://www.lfd.uci.edu/~gohlke/pythonlibs/ ...
- win10 uwp 判断文件存在
本文主要翻译http://stackoverflow.com/questions/37119464/uwp-check-if-file-exists/37152526#37152526 我们有多种方法 ...
- win10 uwp 入门
UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...
- win10 uwp 如何开始写 uwp 程序
本文告诉大家如何创建一个 UWP 程序. 这是一系列的 uwp 入门博客,所以写的很简单 本文来告诉大家如何创建一个简单的程序 安装 VisualStudio 在开始写 UWP 需要安装 Visual ...
- win10 uwp smms图床
本文,如何使用smms图床上传图片,用到win10 uwp post文件,因为我是渣渣,如果本文有错的,请和我说,在本文评论,或发给我邮箱lindexi_gd@163.com,请不要发不良言论 找到一 ...
- 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. ...
- 'Rem EverythingAutoSetup.VBS 安装Everything的VBS脚本 2019年11月25日写
'Rem EverythingAutoSetup.VBS 安装Everything的VBS脚本 2019年11月25日写 'Rem Everything是voidtools开发的一款本地NTFS文件和 ...
- 【Unity_UWP】Unity 工程发布win10 UWP 时的本地文件读取 (上篇)
Universal Windows Platform(UWP)是微软Windows10专用的通用应用平台,其目的在于在统一操作系统下控制所有智能电子设备. 自从Unity 5.2之后,配合VS 201 ...
随机推荐
- [Java]Socket套接字(网络编程入门)
[版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/129907893 出自[进步* ...
- vue3中使用simple-keyboard实现虚拟键盘(带中文切换数字键盘)
效果图 官网 simple-keyboard官网:https://hodgef.com/simple-keyboard/ 打不开的话请用魔法 不足 中文语言包支持度不够.不过自己可以找语言包替换 依赖 ...
- C# WinForm 获取执行路径的几种常见方法
//1.获取模块的完整路径. string path1 = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; Co ...
- Win10下安装Java JDK 1.8 配置环境变量
1.下载地址:https://www.oracle.com/java/technologies/javase-downloads.html 2.双击运行,下一步.下一步-- 3.新建变量名:JAVA_ ...
- 学习Python前要了解的tips
学习Python前要了解的tips 对后续的学习来说很重要,否则后续会出现一些奇奇怪怪的问题,而且很难找到解决方法.嘿嘿,就不要问我怎么知道的了吧,好多都是我踩过的坑 卸载电脑内软件 之前我一直用电脑 ...
- 数据解析之re正则表达式
数据解析之re正则表达式 1. 正则基础 1.1 为什么使用正则 需求 判断一个字符串是否是手机号 解决 编写一个函数,给函数一个字符串,如果是手机号则返回True,否则返回False 代码 def ...
- 13 JavaScript关于prototype(超重点)
13 JavaScript关于prototype(超重点) prototype是js里面给类增加功能扩展的一种模式. 写个面向对象来看看. function People(name, age){ th ...
- 掌握 Spring IoC 容器与 Bean 作用域:详解 singleton 与 prototype 的使用与配置
在您的应用程序中,由 Spring IoC 容器管理的形成其核心的对象被称为 "bean".一个 bean 是由 Spring IoC 容器实例化.组装和管理的对象 这些 bean ...
- 实践指南:EdgeOne与HAI的梦幻联动
在当今快速发展的数字时代,安全和速度已成为网络服务的基石.EdgeOne,作为腾讯云提供的边缘安全加速平台,以其全球部署的节点和强大的安全防护功能,为用户提供了稳定而高效的网络体验.而HAI(Hype ...
- Docker 11 数据卷
由来 Docker 是将应用和环境打包成一个镜像. 这样,数据就不应该保存在容器中,否则容器删除,数据就会丢失,有着非常大的风险. 为此,容器和主机之间需要有一个数据共享技术,使得在 Docker 容 ...