但只有在没有微软AppStore的情况下。为什么要这样做?
原文地址:
原文作者:
发布时间:2017年12月26日 - 8分钟阅读
仙女座星系。与文章无关。
安卓和IOS在处理应用方面比Windows要好--安装或删除一个应用很直接,而且也更安全。传统的桌面应用需要用现代的替代品来取代。通过通用应用Windows统治了一直以来的废话,在2017年11月之后,UWP应用终于有足够的API来解决SeriousBusiness™应用。然而Windows Store对后台执行的政策限制太多,我们看看如何绕过这个问题。如果你对概述不感兴趣,请向下滚动到 "假设直接 "部分。
传统桌面应用必须死
在过去......我的意思是,今天每个 "正常 "的Windows应用程序都需要它自己的安装程序,它自己的更新程序,它自己的卸载程序和通常的管理员权限来安装。然后它就会把文件放在它喜欢的地方。然后它会在注册表里贴上垃圾,永远不会删除任何东西。目前我有一些程序,决定嵌套在。
\%username%\AppData\Local
Program Files (x86)
ProgramData
C:\
用户基本无法控制应用的卸载效果、运行频率、消耗多少内存或电池。案例--Slack。
为一个短信应用占用300MB和6个进程,应该是一种犯罪。
这个猪舍的垃圾也是一种维护的负担,我这辈子从来没有见过一个卸载程序不会让应用的碎片躺在系统中,然后在你更新或重新安装时造成问题。
通用Windows应用自带单一打包系统,可以干净利落地安装和删除应用。UI性能、触摸控制和字体渲染都得到了大幅提升。该操作系统还让用户掌控应用行为。
从用户的角度来看,Windows 10应用的可控性更强。
尽管有这些优势,但几乎没有人使用这个平台,微软商店也大多没有生机。为什么呢?
微软给Store打了一枪,两次
在Windows Store上为数不多的几款像样的应用中,大部分都是转换的桌面应用。学习一个新的平台并制作一个应用是一件很辛苦的事情,而像社交网络这样的 "轻量级 "应用已经被webapps很好地服务了。
当涉及到在平板电脑和webapps上无法完成的SeriousBusiness™时,桌面应用就会大放异彩--这些工作需要大量的计算能力、无限的网络连接、负载的屏幕空间、TB的磁盘空间,必须连续运行数小时,甚至24小时不间断。问题是基于商店的通用Windows App无法支持SeriousBusiness™。
-
直到最近,UWP开发者可用的API集受到了太多的限制,许多库都不兼容,没有办法接受SSL/TLS连接! 随着2017年11月.Net Standard 2.0的到来,这个问题大多得到了解决,距离Windows 10的发布只有2.5年。
-
Windows Store对开发者施加了许多限制--你不允许做的事情。他们中的大多数都是合理的,但在打击后台应用这些吸电池的害虫时,他们走得太远了。就目前而言,Windows 10可能会决定暂停你的应用程序,只要它最小化或以其他方式处于后台,以释放RAM或节省电池。你可以要求Windows推迟它,但有它没有保证。有后台任务,但它们也会被暂停,即使在台式机上也是如此! 你作为一个开发者,甚至作为一个用户,都无法控制这个过程。这就太白痴了。
为什么暂停是个大问题
有一个API可以选择完全退出暂停,但你的应用程序将被禁止从商店。有了这个单一的决定,大多数有理由在桌面上存在的应用都无法被带到商店中。
- 视频编辑工具通常需要几个小时来处理一个视频。通常这并不妨碍你使用电脑进行浏览/Word和其他轻量级工作。然而如果你使用UWP视频编辑工具并切换到网页浏览器,Windows会暂停视频编辑器。你将不得不像个白痴一样坐在那里盯着进度条看几个小时,或者使用不同的电脑。
- 像Blender3D这样的3D渲染工具可能需要几天或几周的时间来渲染3D电影。
- Torrex等Torrent客户端在下载和播种过程中会被打断。
- 比特币和其他加密货币客户端--我想为商店建立一个加密货币钱包,然后才意识到它们需要不断地与网络通信,一个基于商店的客户端将被渲染得毫无用处。
- Dropbox或OneDrive。商店里的那些不能实时同步你的文件。
- 一个Iot Dashboard应用,比如我现在的Quickbird应用。
- 无数的其他应用,还没有人想象过。
夺回控制权
您可以通过在包清单中添加以下行来移除UWP应用程序的约束。这将使您的应用程序不符合商店分发的资格。
<Package …> …
<Capabilities>
<rescap:Capability Name=”extendedExecutionUnconstrained”/>
</Capabilities>
</Package>
这将允许您的应用程序使用扩展的执行会话与
ExtendedExecutionForegroundReason.Unconstrained。
实现该功能将产生 "正常 "的桌面应用程序行为--应用程序将一直运行,直到用户使用右上角的 "X "终止。您还可以使用此方法创建始终开启的后台任务。请参阅本指南了解更多详情。
在没有Windows Store的情况下分发应用程序
Visual Studio将生成一个Appxbundle,可以使用AppInstaller安装在任何电脑上,AppInstaller可以从Windows Store中获得。然而,应用程序必须使用有效的证书进行签名。在我看来,这是一个很好的决定--获取证书并不困难,而且将开发者的名字放在包上,至少建立了最低限度的责任和安全性。
默认情况下,Windows 10允许侧载
你需要购买一个CodeSigning证书,但没有必要掏钱购买EV版本--我从Leadertelecom.nl买了一个Comodo证书,价格不到100英镑。不过,你可能需要有一个注册公司。
Visual Studio可以被指示签署AppxBundle,但由于一些莫名其妙的原因,它不会给它加时间戳。
时间戳是必不可少的--每个证书都有一个到期日,通常是一两年。如果没有时间戳,证书会根据当前日期进行验证,所以你的申请在一年左右后就会失效。
你可以使用SignTool,通常可以在Windows 10 SDK中找到。
C:Program Files (x86)Windows Kits/10/bin/x64/signtool.exe
有很多指导,但基本过程很简单。
- 确保Package.appxmanifest中的Publisher Display Name与证书上的 "Subject "完全匹配。在我的例子中,两者都是 "Heimdall LTD"。
- 在Release模式下构建应用程序包。当被问到 "你是否在为商店构建包 "时,选择 "No"
- 使用Powershell或Cmd,给Signtool下达正确的命令。签署Appx大约需要40秒。
C:\Program Files (x86)\Windows Kits\10\bin\x64> .\signtool.exe sign /debug /fd sha256 /f “C:\DigitalCertificates\Heimdall_Code_Sign.pfx” /p “*password_here*”
/t http://timestamp.verisign.com/scripts/timstamp.dll C:\Releases\Quickbird_1.8.3.0\Quickbird_1.8.3.0_x86.appxbundle
- 调试是使输出更加直观,这样你就可以看到你在哪里出了问题。对最终结果没有影响
- /fd指定散列算法,必须与创建Appx时使用的算法一致,默认为sha256。
- /f表示你的签名证书的位置。
- /t表示signtool使用的时间戳服务器的位置。如果没有它,你将会得到另一个没有时间戳的无用软件包
- 最后是Appx的位置
Appx将被签署,并准备好被分发。当用户双击它时,他们会看到一个标准的安装屏幕。如果他们在线下载Appx,他们可能会得到 "你想打开这个文件吗 "的对话框。一个更昂贵的EV(扩展验证)证书会让这个警告窗口变成绿色,但也仅此而已。你可以在我的github上得到签名的Appx来测试。
在不相关的机器上安装文件,默认安全设置。机器是俄语的,对不起英语观众:)
现在你自己发布的应用,其实可以跳出沙盒,通过P/Invoke调用原生的C++代码,或者真的可以做任何其他 "正常 "应用所能做的事情。要负责任,他们确实有你的名字
SignTool的正确输出
C:\Program Files (x86)\Windows Kits\10\bin\x64> .\signtool.exe sign /debug /fd sha256 /f “C:\DigitalCertificates\Heimdall_Code_Sign.pfx” /p “*password_here*”
/t http://timestamp.verisign.com/scripts/timstamp.dll C:\Releases\Quickbird_1.8.3.0\Quickbird_1.8.3.0_x86.appxbundle
The following certificates were considered:
Issued to: Heimdall LTD
Issued by: COMODO RSA Code Signing CA
Expires: Wed Oct 10 00:59:59 2018
SHA1 hash: ****************************************
Issued to: COMODO RSA Certification Authority
Issued by: COMODO RSA Certification Authority
Expires: Tue Jan 19 00:59:59 2038
SHA1 hash: ****************************************
Issued to: COMODO RSA Code Signing CA
Issued by: COMODO RSA Certification Authority
Expires: Tue May 09 00:59:59 2028
SHA1 hash: ****************************************
After EKU filter, 3 certs were left.
After expiry filter, 3 certs were left.
After Private Key filter, 1 certs were left.
The following certificate was selected:
Issued to: Heimdall LTD
Issued by: COMODO RSA Code Signing CA
Expires: Wed Oct 10 00:59:59 2018
SHA1 hash: ****************************************
The following additional certificates will be attached:
Issued to: COMODO RSA Code Signing CA
Issued by: COMODO RSA Certification Authority
Expires: Tue May 09 00:59:59 2028
SHA1 hash: ****************************************
Done Adding Additional Store
Successfully signed: C:\Releases\Quickbird_1.8.3.0\Quickbird_1.8.3.0_x86.appxbundle
Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0
在这里发牢骚
这个白痴的 "背景暂停 "决定是我对整个UWP系统最大的不满。不管你怎么转,它都是白痴到令人反感的地步。这个问题已经在UserVoice的顶层两年了,但仍然没有得到解决。Android允许你在后台运行应用。现在Web应用可以在后台运行。如果你不能使用平台的力量,那么为windows开发原生应用有什么意义?
微软提供了API来弥补一些缺陷,就是一个允许有限网络通信的API。这是愚蠢的--大多数开发者不会自己写套接字级别的网络--他们依靠库来完成。即使你写了,这个API也只对那些最多一分钟接收几条消息的应用有意义,比如短信应用什么的。
转换桌面应用在微软商店是允许的,而且不用处理被暂停的问题--难道我们要代替开发这些应用吗?
与其限制你的开发者,不如给用户权力,让他们看到哪些应用会消耗电池寿命,为他们提供适当的工具来控制后台运行的内容。如果有必要的话,对后台进程的数量进行硬性规定。限制它们的CPU/内存/网络流量/什么的。
灵感来源
通过www.DeepL.com/Translator (免费版)翻译