原文: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

Create an app package with the MakeAppx.exe tool - MSIX

如何在国内发布 UWP 应用

WindowsStoreAppUtils

2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用的更多相关文章

  1. Beta冲刺(4/7)——2019.5.25

    所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(4/7)--2019.5.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...

  2. [2019.03.25]Linux中的查找

    TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...

  3. Alpha冲刺(2/10)——2019.4.25

    所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(2/10)--2019.4.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...

  4. 日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09

    作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09     据日本政府提供的数据,日本2018年应届毕业生的“求人倍率”已经达到了1.78倍.换言之,就是100名大学生 ...

  5. 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( ...

  6. [New!!!]欢迎大佬光临本蒟蒻的博客(2019.11.27更新)

    更新于2019.12.22 本蒟蒻在博客园安家啦!!! 本蒟蒻的博客园主页 为更好管理博客,本蒟蒻从今天开始,正式转入博客园. 因为一些原因,我的CSDN博客将彻底不会使用!!!(带来不便,敬请谅解) ...

  7. 2019.11.9 csp-s 考前模拟

    2019.11.9 csp-s 考前模拟 是自闭少女lz /lb(泪奔 T1 我可能(呸,一定是唯一一个把这个题写炸了的人 题外话: 我可能是一个面向数据编程选手 作为一个唯一一个写炸T1的人,成功通 ...

  8. [MP3]MP3固件持续分享(2019.1.25)

    转载自我的博客:https://blog.ljyngup.com/archives/179.html/ 所有的固件到我的博客就可以下载哦 最后更新于2019.2.1 前言 这篇文章会持续更新不同型号的 ...

  9. 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. ...

随机推荐

  1. python基础(6):基本数据类型一(int、bool、str)

    1. 基本数据类型 1. int ==> 整数,主要⽤来进⾏数学运算 2. str ==> 字符串,可以保存少量数据并进⾏相应的操作 3. bool==>判断真假,True,Fals ...

  2. python+java蓝桥杯ACM日常算法题训练(一)10基础题

    目录 1.简单的a+b 2.第一个HelloWorld程序! 3.三个数最大值 4.密码破译 5.母牛的故事 6.7.8.9.10 @(这里写自定义目录标题) 算法题训练网站:http://www.d ...

  3. JAVA笔记 -- this关键字

    this关键字 一. 基本作用 在当前方法内部,获得当前对象的引用.在引用中,调用方法不必使用this.method()这样的形式来说明,因为编译器会自动的添加. 必要情况: 为了将对象本身返回 ja ...

  4. 异步和多线程Thread

    刚接触线程的时候,感觉这个东西好神奇.虽然不是很明白,就感觉它很牛逼. 参考了一些大佬写的文章: https://www.cnblogs.com/yilezhu/p/10555849.html这个大佬 ...

  5. kafka以及消息队列详解

    Kafka 是LinkedIn 开发的一个高性能.分布式的消息系统. 用途:广泛用于日志收集.流式数据处理.在线和离线消息分发等场景. 1. Kafka 将消息流按Topic 组织,保存消息的服务器称 ...

  6. Runtime 类初探

    Runtime类 认识 Runtime类 在每一个JVM进程中都会存在一个Runtime类,这个类的主要功能是取得一些与运行时有关的环境属性或创建进程等操作. 在Runtime类定义的时候,它的构造方 ...

  7. 【转载】更简单的学习Android事件分发

    事件分发是Android中非常重要的机制,是用户与界面交互的基础.这篇文章将通过示例打印出的Log,绘制出事件分发的流程图,让大家更容易的去理解Android的事件分发机制. 一.必要的基础知识 1. ...

  8. ADB常用命令(adb常用命令)

    基本用法 命令语法 adb 命令的基本语法如下: adb [-d|-e|-s <serialNumber>] <command> 如果只有一个设备/模拟器连接时,可以省略掉 [ ...

  9. linux远程桌面连接 VNC Server

    更新源 # sudo apt-get update 安装vnc4server # sudo apt-get install vnc4server 修改vnc远程连接密码 # vncpasswd 编辑v ...

  10. iOS自定义TabBar使用popToRootViewControllerAnimated返回后tabbar重叠

    解决方法 所以方法就是:遵循UINavigationController的代理,用代理方法解决该Bug,代码如下: 实现代理方法: { // 删除系统自带的tabBarButton for (UIVi ...