65.9K
CodeProject 正在变化。 阅读更多。
Home

编程 Windows 10 桌面:UWP 焦点(第 13 章)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (6投票s)

2017 年 12 月 14 日

CPOL

11分钟阅读

viewsIcon

19181

downloadIcon

155

开始 UWP 之旅(从 WinForms 过渡)第 13 章:部署、UWA 的侧载 - 到底有多容易/困难?

引言

本章将与我们之前的内容有所不同,因为这次没有代码。这是因为我想在 UWP(通用 Windows 平台)范例下探讨部署问题。

这将是一次快速阅读,让你了解 UWP 部署的实际情况。

将你的应用分发给其他用户到底有多难或多容易?

我真的很希望它会很容易。你将看到我在尝试安装时遇到的挑战。

背景

你可以阅读本章之前的所有章节

编程 Windows 10:UWP 聚焦 (第 1 部分)[^]
编程 Windows 10:UWP 聚焦 (第 2 部分)[^]
编程 Windows 10:UWP 聚焦 (第 3 部分)[^]
编程 Windows 10 桌面:UWP 聚焦 (第 4 部分)[^]
编程 Windows 10 桌面:UWP 聚焦 (第 5 部分)[^]
编程 Windows 10 桌面:UWP 聚焦 (第 6 部分)[^]
编程 Windows 10 桌面:UWP 聚焦 (第 7 部分)[^]
编程 Windows 10 桌面:UWP 聚焦 (第 8 部分)[^]
编程 Windows 10 桌面:UWP 聚焦 (第 9 部分)[^]
编程 Windows 10 桌面:UWP 聚焦 (第 10 部分)[^]
编程 Windows 10 桌面:UWP 聚焦 (第 11 部分)[^]
编程 Windows 10 桌面:UWP 聚焦 (第 12 部分)[^]

纸质版或 Kindle 版亚马逊有售

您也可以在亚马逊上购买本书的前 8 章打印版或 Kindle 版。

编程 Windows 10 Via UWP:学习为桌面编程通用 Windows 应用 (Program Win10)[^]

 

 

 

 

部署

现在我们的应用程序具有一些有用的功能,并且不会在每次启动时崩溃,我们可能希望与他人分享它。

过去,当你创建一个 WinForms 应用程序时,你只需将其构建成一个 .exe 文件,压缩一下就可以分发给别人了。Windows Vista 之后,微软实施了更多的安全措施,让用户更清楚应用程序的安装情况。突然间,应用程序不能写入“程序文件”目录,而是应该安装到“程序文件”目录,并将数据存储在其他位置,如 ProgramData 文件夹。

现在,通过 UWP,微软正在遵循应用商店部署的理念,提供 **Windows 应用商店**,并要求 UWP 应用由认证开发者上传,这样用户只能从经过审查的来源安装应用。

这遵循了行业模式,最早由 *Apple* 的 **App Store** 和 **Google Play** 实施。

然而,这意味着如果一个独立开发者想做一个小程序并送给朋友,现在会变得更加困难,因为需要经过更多的步骤。

获取应用的其它方式

Apple 设备受到严格的管控,如果你想将应用安装到设备上进行测试,没有简单的方法可以将其分发给你的朋友和家人或其他测试人员。你基本上只能通过 App Store 将任何应用安装到你的设备上。如果应用不在 App Store 中,你无法通过连接设备到电脑等方式获取它。

侧载应用

Google 使部署变得容易得多。如果你使用 Android Studio 创建了一个应用程序,你可以生成应用的 APK 文件,并允许用户从网站下载。当目标设备下载 APK 时,它会警告用户这是一个安装包,但会允许用户选择是否安装。

这个过程称为侧载。

微软也允许侧载

幸运的是,微软也允许侧载。这意味着我们应该能够创建一个安装包,然后告知 Windows 10 用户它的位置,然后他们就可以下载并安装它。同样,如果你希望朋友和家人在投入所有精力将其放入 Windows 应用商店之前试用你的应用程序,这会很有用。

要实现这一点,我们必须构建我们的安装包。Visual Studio 将帮助我们完成这项工作。

构建我们的应用安装包。

确保你在 Visual Studio 中加载了最新版本(在第 12 章中完成的 `DailyJournal_v028`),并且已经测试了构建,确保它能正常运行。

右键单击 `解决方案资源管理器` 中的 **DailyJournal** 项目,会出现一个菜单。


向下滚动菜单到 **[Store]** 菜单项(包含一个右箭头,表示会弹出另一个菜单)。

将鼠标悬停在 **[Store]** 菜单项上时,会出现子菜单。

点击 **[Create App Packages…]** 菜单项(包含一个省略号,表示会弹出对话框)。

 

单选按钮很可能默认是 **[Yes]**,但我们想要选择 **[No]**,因为我们只想创建一个可以侧载的包。

选择 **[No]** 后,点击 **[Next]** 按钮继续该过程。

 

 

这个对话框有很多内容。

首先,它告诉你将创建安装包的路径。

接下来是版本信息。我们还没有在 `Package.appxmanifest` 中进行任何工作,所以它默认是 1.0.0.0。但是,请注意 **[Automatically increment]** 复选框默认是选中的。Visual Studio 试图帮助你跟踪每次构建包的情况,以免版本混淆。

生成应用包

应用包包含用户运行你的应用程序在其特定系统上所需的所有依赖项。微软设计的这些应用包,如果你的应用程序支持多种语言和多种操作系统版本(Win8.1、Win10 等),用户将只需要下载他们所需的相应依赖项。

选择架构和解决方案配置

最后,我们需要选择应用包将安装的硬件类型(架构)。我目前有一个警告,告诉我无法同时定位 x86 和 ARM。不知道为什么,我的 Visual Studio 总是认为我正在为 ARM 设备构建。

我终于设置好了,所有的警告都消失了。

 

将你的设置修改为匹配,以便我们继续。

PDB 符号文件

最后一个复选框是 “[Include full PDB symbol files, if any, to enable crash analytics for the app.]” (包含完整的 PDB 符号文件(如果有),以启用应用的崩溃分析)。

PDB 文件是 Program DataBase 文件,用于跟踪我们解决方案的源代码,以便在发生错误时,我们可以获得关于错误发生位置的更详细信息。你可以保留此选项勾选。

点击 **[Create]** 按钮来创建我们的包。

在我的系统上,当我点击 **[Create]** 按钮时,对话框就消失了,我无法判断是否有什么操作在进行。

我的输出窗口看起来像下面这样,这似乎表明正在进行构建。

 

最后,我看到 **Output** 窗口更新到了 x64。但是,我没有看到其他行出现在 Output 窗口中。可能是因为它更新得太快了。

我的观点是,即使看起来没有什么发生,很可能是有事情在发生的。

 

 

终于,经过一段时间(取决于你的系统速度),我看到一个对话框弹出。

 


 

我注意到我的 Output 窗口也更新了一些状态信息。


 

我点击了 **[Package Creation Completed]** 对话框上的第一个链接,它代表了 **Output** 位置,然后文件资源管理器打开并导航到该位置。

 

 

如果你查看该目录,你会找到 `.appxbundle` 文件。

我曾以为双击 bundle* 文件就可以开始安装过程,但这并不简单。太遗憾了。

*** 实际上,等等,因为在本章的后面,我在另一台机器上确实成功了。似乎那台机器缺少一个允许 .appxbundle 点击安装的组件。


 

该文件夹中还有另一个文件:`Add-AppDevPackage.ps1` (PowerShell 文件)。

我*右键单击*了它,当出现上下文菜单时,我有一个菜单选项 **[Run with PowerShell]**。


 

 

PowerShell 弹出一个新窗口并开始运行脚本,然后我看到一个警告出现。

 


我输入了 **Y** 并按了 **<ENTER>**,脚本继续执行。

我再次按 **<ENTER>** 继续。

Windows 显示 UAC(用户账户控制)对话框,我点击 **[Yes]** 按钮。

 

PowerShell 开始安装证书,然后再次警告我。

 

 

我输入 **Y** 并再次按 **<ENTER>**。

 

 

因此,包安装确实失败了。但是,这是因为它警告我该应用已安装,并且不想覆盖该应用。

这仅仅是因为我在开发应用程序的同一台机器上运行了它。

当我最后一次按 **<ENTER>** 时,PowerShell 窗口关闭了。

回到 Visual Studio,我从未关闭 Package Creation Completed 窗口,所以我现在点击 [Close] 来表示我已完成。此时我不想 **[Launch Windows App Certification Kit]**,因为我不是部署到 Windows 应用商店。

再试一次

我决定更改版本并重新构建包,看看它是否会更新应用程序。我也在想安装是否会覆盖我在应用程序中保存的当前数据。

我在 **解决方案资源管理器** 中*双击*了 `Package.appxmanifest` 文件,然后切换到 **Packaging** 部分。

我将 Minor 版本从 0 更改为 1,这样版本将是 1.1.0,然后保存了项目。

我确保我__没有构建__应用程序,因为我认为这可能会部署应用程序而不是允许我安装它。它仍然可能不允许我安装,但我还是试一试。

 

在那之后,我回到了原处,重新启动了打包过程。

那没有奏效。它给出了同样的错误。它只是根据其包名称知道该包已安装:`116d1010-a1e4-452a-a1d2-c84aea07af6d`

我很有毅力

我仍然不想放弃,所以我

  1. 打开了 Windows 10 **Settings** 对话框。

  2. 选择了 **System** 图标。

  3. 选择了 **Apps & Features**。


 

 

 

 

我在系统中找到了已安装的 DailyJournal。嘿,图标不错。 :)

我将先保存我的数据,然后卸载应用程序,以便测试安装。

点击应用程序列表中的 DailyJournal 项,它将显示你的选择。

 

 

点击 **[Uninstall]** 按钮。

一个警告对话框弹出。显然,它也会删除应用程序的数据。

 

当应用程序卸载时,你会看到以下内容(除非你的电脑速度非常快)。

 


又一次尝试

阅读了微软关于侧载的官方文档后:https://docs.microsoft.com/en-us/windows/uwp/packaging/packaging-uwp-apps

我决定再次尝试。

我回到了我的 Win10 机器上,再次双击了我 1.0.0.0 版本的 appxbundle 文件。

这次,正如我最初希望的那样,弹出了以下对话框。

 

首先有趣的是,它显示 **[Access your Internet connection]** (访问你的 Internet 连接) 的功能已设置。这很奇怪,至少有两个原因:

  1. DailyJournal 中没有任何代码可以访问 Internet

  2. 我没有添加该功能。但是,它可能是由原始项目模板设置的。我稍后会检查。

我保留了 **[Launch when ready]** (准备好时启动) 复选框,然后点击了 Install 按钮。

接下来我看到一个对话框,显示安装失败。

你必须滚动查看那个奇怪的小文本框才能看到完整的原因。

“Either you need a new certificate installed for this app package, or you need a new app package with trusted certificates. Your system administrator or the app developer can help. A certificate chain processed, but terminated in a root certificate which isn't trusted (0x800B0109)” (“要么你需要为此应用包安装新证书,要么你需要一个带有受信任证书的新应用包。你的系统管理员或应用开发者可以提供帮助。处理了一个证书链,但终止于一个不受信任的根证书 (0x800B0109)”)

我真的很庆幸他们给了我十六进制错误代码。我喜欢那些东西。 :)

再次尝试 PowerShell

我决定再次尝试运行 PowerShell 脚本。

这次它成功了,因为我提供了管理员凭据。

我再次按 **<ENTER>**,PowerShell 窗口关闭了,但应用程序从未启动,也没有发生任何事情。

哥们,我的应用在哪?

如果你打开开始菜单,你应该能看到新安装的应用程序。

如果你没有看到它,你应该可以打开 Windows **Start** 菜单,然后输入“daily”,Windows 内置搜索应该能找到它。


 

在那之后,我决定应该再次尝试双击 appxbundle 文件,看看在证书似乎已安装之后是否会起作用。

但是,我必须再次卸载应用程序才能尝试。

它奏效了,最终从 `appxbundle` 文件安装成功。

 


 

访问你的 Internet 连接

看起来 Visual Studio 项目模板确实默认设置了 Internet 连接功能。

 

本次就到这里。

下次我们将开始探讨各个 XAML 控件,如 TreeView、TextBox 等。

历史

2017-12-14:文章首次发布

© . All rights reserved.