2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用
原文:2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
加强版在国内分发 UWP 应用正确方式 通过win32安装UWP应用
|
lindexi
|
2019-11-25 08:57:35 +0800
|
2019-11-25 08:57:35 +0800
|
UWP
|
几乎所有国内的 UWP 开发者都知道,在国内开发 UWP 应用最大的问题不在于那么多系统的适配和不断修改的 API 接口,而是用户根本无法下载安装应用。在国内除非能掌握入口,否则想要将 UWP 开发应用在商业团队是很难的。刚好我所在的团队能将硬件设备直接给到用户,此时预装的系统里面就可以带上自主开发的 UWP 应用,解决了用户无法在应用商店安装应用的坑。但是大多数的团队都不能这样做,同时我的团队如果只是依靠硬件设备预装,那么会限制用户量。本文告诉大家如何使用传统的方法,将 UWP 作为 win32 应用安装包方法分发给用户安装
将 UWP 作为安装包的方式分发也就是通过旁加载的方式,而微软干的不错的时使用旁加载如果使用的证书不清真,那么就要求用户信任证书。而大多数的用户都无法成功安装证书,我测试了几个应用,发现通过这个方式的没有一个能成功安装。所以需要解决的问题是先帮助用户安装证书,然后再安装应用。而 UWP 默认的安装程序的界面也不好看,想要定制好看的界面将需要做而外的界面开发。将 UWP 作为 win32 安装包的方式让用户安装的原理就是写一个安装程序,这个安装程序是控制台程序,在安装程序将会自动安装证书,自动安装应用。然后再写一个安装界面程序,安装界面程序可以和安装程序是两个进程,这样安装界面可以用很漂亮的 WPF 写,作出有趣的动画。因为所有 UWP 只能在 win10 运行,而 win10 系统自带 .NET 4.7 所以可以放心使用 WPF 程序。那些 WPF 程序运行不起来的系统应该是魔改的系统,这些系统也不要想 UWP 能运行
首先创建一个测试的 UWP 程序,这是一个空白的 UWP 程序,只是用来测试安装。先要求这个 UWP 程序的版本是基于 18362 的版本,当然命令行安装程序是对 UWP 版本没有要求的,只是我测试的是 18362 版本,如果小伙伴用随意的版本踩到坑了,就请自己解决
通过在 VisualStudio 右击项目,选择发布,使用旁加载方式发布,请看 Packaging UWP apps
此时建议勾选上自动更新的选项,这样才能做到自动更新。如何做自动更新请看 如何在国内发布 UWP 应用
此时可以看到发布的文件夹,这里的 *.cer 就是证书文件,而 *.msixbundle 就是安装文件,在 UWP 基于不同的版本打出来的安装文件将会不同,本文只是简单告诉大家如何使用命令行安装,所以建议大家使用 18362 的版本,这样文件才会相同
在安装程序里面,拿到当前发布的文件夹的路径,然后调用 InstallApp 方法,需要注意安装程序的调试和运行都需要使用管理员权限
private static void InstallApp(string appFolder)
{
var windowsPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
if (!windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator))
{
Console.WriteLine("请使用管理员权限运行");
return;
}
}
这里传入的 appFolder 就是如 FarwheebanaHeaceababar\AppPackages\FarwheebanaHeaceababar_1.0.1.0_Debug_Test 的文件夹,在这个文件夹里面就能找到证书文件
通过下面代码找到证书文件
private static string GetCerFile(string appFolder)
{
var cerFile = Directory.GetFiles(appFolder, "*.cer").FirstOrDefault();
if (!File.Exists(cerFile))
{
Console.WriteLine("找不到 cer 证书文件");
} return cerFile;
}
然后调用 certutil 程序安装证书,这个程序可以在 C:\Windows\System32\ 找到
private static void InstallCer(string cerFile, string appFolder)
{
var command = $" -addstore TrustedPeople \"{cerFile}\"";
var processStartInfo = new ProcessStartInfo
{
FileName = "certutil.exe",
Arguments = command,
RedirectStandardOutput = true,
Verb = "runas",
WorkingDirectory = appFolder,
UseShellExecute = false,
}; var process = new Process()
{
StartInfo = processStartInfo
};
process.Start();
var processStandardOutput = process.StandardOutput;
Console.WriteLine(processStandardOutput.ReadToEnd()); process.WaitForExit();
}
可以测试一下,使用命令行自己安装另一个证书
certutil -addstore TrustedPeople C:\lindexi\foo.cer
然后找到安装文件
private static string GetBundle(string appFolder)
{
var bundleFile = Directory.GetFiles(appFolder, "*.msixbundle").FirstOrDefault(); if (!File.Exists(bundleFile))
{
Console.WriteLine("找不到 msixbundle 安装文件");
} return bundleFile;
}
使用 PowerShell 的 Add-AppxPackage 安装
private static void InstallBundle(string bundleFile, string appFolder)
{
var powerShell = GetPowerShell(); var command = $" Add-AppxPackage -Path \"{bundleFile}\"";
var processStartInfo = new ProcessStartInfo()
{
FileName = powerShell,
Arguments = command,
Verb = "runas",
RedirectStandardOutput = true,
UseShellExecute = false,
WorkingDirectory = appFolder
}; var process = Process.Start(processStartInfo);
Console.WriteLine(process.StandardOutput.ReadToEnd());
process.WaitForExit();
} private static string GetPowerShell()
{
return "PowerShell.exe";
}
如果上面两个命令运行了,那么打开开始菜单看是否成功安装了应用,如果没有安装,那么请在命令行自己试试命令,看是不是路径没有写对
这样就完成了使用控制台安装 UWP 程序,但是这个方法存在的问题是如果用户没有开启旁加载,那么将会安装失败
我就通过这个安装程序,在 NSIS 将 UWP 程序打包,在安装的时候调用安装程序,让安装程序在后台安装 UWP 应用。因为使用安装包安装可以拿到管理员权限,所以上面的安装程序不需要说明需要管理员权限
大概使用这个方法才能让用户在国内用上 UWP 应用,用上了 UWP 应用可以使用现代化的触摸和极高的渲染性能,可以作出现代的应用。但是用 UWP 的不足在于稳定性还是比较差,同时因为 UWP 的底层 API 封装没有 WPF 做的好,所以在出现稳当性问题也比较难在开发的时候找到
如果有小伙伴准备商业化使用本文的方案,欢迎告诉我,这样我好去和小伙伴吹。如果是个人开发者的话,那么自己玩就好了。因为个人开发者不需要整套的 DevOps 以及应用分发的数据传回等
如果不想通过命令行调用的方式安装,可以使用 win32 的方法安装,请看 aL3891/AppxInstaller: Tools for installing Uwp apps outside the windows store 但是这个项目现在gg了,原因是微软改了接口,同时会在一些设备上安装失败
Install apps with the WinAppDeployCmd.exe tool - UWP apps
2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用的更多相关文章
- Beta冲刺(4/7)——2019.5.25
所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(4/7)--2019.5.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...
- [2019.03.25]Linux中的查找
TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...
- Alpha冲刺(2/10)——2019.4.25
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(2/10)--2019.4.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- 日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09
作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09 据日本政府提供的数据,日本2018年应届毕业生的“求人倍率”已经达到了1.78倍.换言之,就是100名大学生 ...
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- [New!!!]欢迎大佬光临本蒟蒻的博客(2019.11.27更新)
更新于2019.12.22 本蒟蒻在博客园安家啦!!! 本蒟蒻的博客园主页 为更好管理博客,本蒟蒻从今天开始,正式转入博客园. 因为一些原因,我的CSDN博客将彻底不会使用!!!(带来不便,敬请谅解) ...
- 2019.11.9 csp-s 考前模拟
2019.11.9 csp-s 考前模拟 是自闭少女lz /lb(泪奔 T1 我可能(呸,一定是唯一一个把这个题写炸了的人 题外话: 我可能是一个面向数据编程选手 作为一个唯一一个写炸T1的人,成功通 ...
- [MP3]MP3固件持续分享(2019.1.25)
转载自我的博客:https://blog.ljyngup.com/archives/179.html/ 所有的固件到我的博客就可以下载哦 最后更新于2019.2.1 前言 这篇文章会持续更新不同型号的 ...
- Oracle 11.2.0.4.0 Dataguard部署和日常维护(1)-数据库安装篇
本次测试环境 系统版本 CentOS release 6.8 主机名 ec2t-userdata-01 ec2t-userdata-01 IP地址 10.189.102.118 10.189.100. ...
随机推荐
- 配置文件_自定义section标签获取数据
前言:为了节约时间,先只粘贴关键代码: 1-添加section标签,name为自定义标签名称,type为:命名空间+类型,程序集名称 <section name="watchModel ...
- go-面向对象编程(上)
一个程序就是一个世界,有很多对象(变量) Golang 语言面向对象编程说明 1) Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对 象语言.所以我们说 ...
- Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理
Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理 说明:Java生鲜电商平台中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务 ...
- 前端开发工具HBuilder使用技巧以及快捷键
创建HTML结构: h 8 (敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲h t Enter) 中途换行: 'Ctrl+Enter' 设置charset: m e 6 Enter ...
- 848. Shifting Letters
问题描述: 问题规约为:对每一个数组S,移动(shifts[0] + shitfs[1]+...+shitfs[i] )mod 26位 def shiftingLetters(self, S: str ...
- 第三方库Mantle的简单实用
1. 测试时, 可以使用下面这个网址及代码来测试, 里面有模型,数组,以及字典, 还可以有long long 转NSDate, string 转 int等. NSURL *url = [NSURLU ...
- [日常] 安装windows+deepin双系统
我的测试电脑上安装了三个系统,分别是win7 , ubuntu16.04 ,deepin15.11下面的步骤是安装deepin系统的过程 1.制作启动u盘,直接使用官方工具制作就可以了,我的已经制作好 ...
- 2、mongoDB的基本操作
数据写入和查询: show dbs (查看有哪些数据库) use imooc (使用数据库) db.dropDatabase() 删除数据库 备注:在use的时候如果use一个不存在的表,在mongo ...
- C学习笔记(11)--- 可变参数,浅谈内存管理 【C基础概念系列完结】
1.可变参数(variable arguments): 可变参数允许您定义一个函数,能根据具体的需求接受可变数量的参数. int func(int, ... ) (函数 fun ...
- spark 基础
scala版 ,基本名词概念及 rdd的基本创建及使用 var conf = new SparkConf() var sc: SparkContext = new SparkContext(conf) ...