将您的应用程序从 Developer Preview 迁移到 Consumer Preview

Windows 8 应用程序开发人员博客

有关为 Windows 8 生成 Metro 风格应用程序的见解,来自 Windows 8 工程团队

将您的应用程序从 Developer Preview 迁移到 Consumer Preview

  • Comments 1

大家好,我是 Windows 开发团队的合作伙伴架构师 John Sheehan。

我们非常感谢积极为预览版开发应用程序的各位用户。您的反馈将帮助我们打造一个更加完美的 Windows 8。当然,在预览版上开发意味着您需要针对每个预览版更新自己的应用程序,这就是本博文将向您介绍的内容,即如何将您的项目从 Developer Preview 迁移至 Consumer Preview。我将突出介绍其中的一些更改,但如果您希望获得详细的更改指南,可以从开发中心下载有关如何将应用程序从 //Build 大会时的版本迁移到 Windows 8 Consumer Preview白皮书

当您开始考虑将应用程序迁移至 Consumer Preview 时,我相信您一定很希望了解我们为何要进行这些更改。我个人可以向您保证,我们对于每个更改都进行了认真的考虑。我们根据收到的直接反馈进行了一些更改:简化令人困惑的功能,增加用户需要的功能。其他情况下,我们在完成某项功能并开始使用后,意识到该功能有悖于我们的初衷,因此,我们吸取了经验教训并对此类功能进行了改进。我们会考虑多方面的因素。请放心,我们已经仔细地斟酌过每个决定,这一切都是为了给 Metro 风格的应用程序打造一个完美的平台。

我自己在 Developer Preview 中开发的四子棋应用程序也不得不经历这些迁移过程,因此,我深知迁移工作需要花费一定的精力。但如果按照博客和文档中列出的步骤操作,您的应用程序很快就将完成迁移并正常运行。

还等什么,赶快开始吧!

重新开发

虽然将您的现有项目迁移到 Consumer Preview 这一想法可能很有吸引力,但自 Developer Preview 以来,我们已经进行了大量更改,因此重新开发一个新项目是最理想的选择。例如,在 Visual Studio 中,项目定义文件发生了一系列变化:JavaScript 项目的扩展名改为 .jsproj,而 .csproj/.vbproj 文件中的导入语句也发生了变化。由于这些更改,您的现有项目甚至将无法打开。重新开始新的项目后,您可以将原有项目中的一部分迁移到新项目中。

您可以按照以下步骤来迁移自己的代码。您也可以在从 //Build 大会时的版本迁移到 Windows 8 Consumer Preview 文档中找到这些步骤和更多迁移详细信息。(我还会在本博文中多次提及该文档!)

  1. 在 Visual Studio 中创建新项目,并挑选最接近现有应用程序 UI 的模板。
  2. 如果新的项模板支持您需要的合约及功能(例如,文件选取器合约或搜索合约),请使用它们替换现有代码。
  3. 使用新模板重新构建 UI 的基本元素后,请将原有项目的视觉和音频资产迁移到新项目中。引入项目的额外代码应仅限于作为应用程序核心的自定义业务逻辑。
  4. 最后,开始将(使用新模板构建的)新 UI 与视觉和音频资产及后端逻辑衔接。

按照这些步骤操作,您将自然而然地将大部分更改整合到应用程序的代码中。接下来,我们将讨论当您迁移到新模板时可能对代码产生影响的某些具体更改。

影响所有语言的一般性更改

首先,我希望介绍一下对基础编程模型进行的某些更改,这些更改会对使用所有编程语言的开发人员造成影响。

清单更改

清单是应用程序的 DNA。我们对平台进行的更改经常会对清单的结构产生影响。考虑到针对清单的更改数量,使用随新项目一起创建的新清单,并使用清单编辑器对其进行修改,很有可能比尝试移植现有清单要简单的多。

热启动异步模式

在 Developer Preview 中,所有异步方法都使用了冷启动。当您调用异步方法时,会返回一个异步操作对象。您将在此操作对象上注册完成和进度回调(如果有),然后调用 IAsyncInfo.Start。此模式的问题在于冗余的 Start 调用。作为开发人员,您有理由期望异步操作在最初的方法调用时就开始执行。

为了提供更加直观的异步模式,我们将其更改为了热启动模式。在 Consumer Preview 中,当您调用异步方法时,将在无需调用 Start 的情况下返回一个异步操作对象。该操作会在调用异步方法时暗中启动。由于我们不再需要 Start,因此已将其从 IAsyncInfo 中移除。

如果您已经在使用 .then() (JavaScript) 或 await (C#),这些更改将不会对您产生影响。

此外,我们添加了 PPL 任务,以简化 C++ 中的异步编程。我个人建议您参阅从 //Build 大会时的版本迁移到 Windows 8 Consumer Preview 中的教程,并将您的异步代码迁移到 PPL 模式。

Windows 运行时对象的确定性生命周期管理 (IClosable)

Windows 运行时 API 可以为您的应用程序提供对文件句柄或网络套接字等系统资源的访问。这些资源非常有限,而当您的应用程序访问这些资源时,用户或其他应用程序将无法对其进行访问。您的应用程序在使用完成后,需要负责释放这些资源。但在 Developer Preview 中,很难明确地释放这些资源,因此许多应用程序对它们的占用时间都超出了必要的时间。

在 Consumer Preview 中,访问这些系统资源的 Windows 运行时 API 可以控制其生命周期。例如,在 JavaScript 中,这些 WinRT 对象可以调用关闭方法,而在 C# 中,它们会执行 IDisposable 接口。借助可直接通过这些 WinRT API 执行的生命周期管理,当您的应用程序使用完系统资源后,您将能够更加轻松地释放它们。使用这些新的生命周期管理功能可减少应用程序的资源消耗,并确保当您的应用程序不使用文件等系统资源时,用户始终能够访问它们。

简化的 WinRT 线程模型

我们收到的反馈显示,WinRT 底层的 COM 线程模型让大家感到非常困惑,因为该线程模型引入了其他编程环境中不存在的考虑因素。其中的一些问题包括:

  • 对象的生命周期与创建该对象的单元绑定。
  • 自动封送行为违反了最小惊讶原则。
  • 事件回调经常在意料之外的线程上运行。
  • 委派在 C++ / C# 中不一致。

为了修复这些问题,我们更改了 WinRT 对象的线程模型。在较高的层面上,这些更改表现为:

  • 对象的生命周期现在与开放的引用绑定。直到最后的引用消失前,该对象将继续保持有效。
  • 大部分对象为敏捷对象。通过这些对象调用的方法将直接在当前线程中执行。
  • 最常见的事件将原路返回注册该事件的线程。某些情况下,事件回调仍将发生在工作线程中。但这种情况已经非常罕见。
  • 与 Developer Preview 中的 C# 委派相同,C++ 委派现在默认为敏捷。如果您在创建委派时指定 CallbackContext::Same,委派仍可封送回创建时所在的线程。

Windows.ApplicationModel(合约)更改

我们在 Consumer Preview 的合约中引入了许多改进。这些改进的形式包括 API、功能、清单注册和 UI。搜索、共享、设置和文件选取器等合约都通过某种形式获得了改进。例如,我们添加了新的文件选取器合约 FileSavePickerActivatedEventArgs,该合约允许您的应用程序充当另存为目标。这是一项无比强大的功能,您可以借助该功能构建一个文件选取器,允许用户像在本地磁盘上那样,从您的云中打开或将文件保存至云。为了使用这一更改,我们将 Consumer Preview 中的文件选取器合约重命名为 FileOpenPickerActivatedEventArgs

对于在 Visual Studio 中受支持的合约,使用新的项模板来重新创建合约将是整合这些更改最简单的方式。然后,您就可以将支持该合约的现有代码添加到新模板了。

URI 协议方案

很多 API 需要依靠 URI 协议方案来访问应用程序包或应用程序 ApplicationData 语句位置中的内容。这些 API 包括 Metro 风格的应用程序中使用 HTML/CSS/JS 编写的资源标记、实时图块、ResourceLoader API、XAML WebView 控件和文件存储 API。

我们更新了协议名称,以确保他们在所有 Metro 风格应用程序和 Windows 8 集成点中的一致性。我们还重命名了以下协议方案:

Developer Preview 方案

Consumer Preview 方案

ms-wwa://

ms-appx://

ms-wwa-web://

ms-appx-web://

localfolder://

ms-appdata://

此外,XAML 应用程序现在只能使用受支持的协议方案(如,ms-appx://)来访问资源。

HTML/CSS/JS Metro 风格应用程序的重要更改

Consumer Preview 中的几项更改专门针对使用 HTML/CSS/JS 编写的 Metro 风格应用程序。以下是其中一些值得引起注意的更改。

控件更改

为了回应各位的反馈,Developer Preview 中提供的 JavaScript 和 HTML 控件经历了诸多更改。现在,您可以更轻松地将控件加入应用程序,并且衔接内容的方法也变得更加直观。其中一些值得引起注意并需要进行更新的控件包括 ListView、AppBar 和 FlipView。例如,您无法再使用 ArrayDataSource 来填充 ListView。现在,您需要使用 WinJS.Binding.List 来填充 ListView。Binding.List 将有助于更加轻松地处理内存数据中的 ListView。

再次提醒您,从 //Build 大会时的版本迁移到 Windows 8 Consumer Preview 文档中包含完���的控件更改列表。

在顶级文档中导航

以前,您可以在应用程序的顶级文档中,从本地封装的起始页导航至基于 Web 的 URL。这将阻止您的应用程序与任何重要通知发生交互(例如,暂停和恢复),因为这些事件是 Windows 运行时事件,并且出于安全考量,WinRT 对象无法通过 Web 上下文访问。在 Consumer Preview 中,您将无法继续导航至本地上下文以外的任何内容。换言之,内容必须来自您的应用程序包,并通过 ms-appx:// 协议方案引用。

因此,您可以重组自己的应用程序逻辑,以便依靠 IFrame 来加载 Web 内容,从而确保来自本地上下文的单个持续性顶级文档始终存在于内存中。

WinJS 片段加载和页面模型

在 Developer Preview 中,HTML/CSS/JS Metro 风格应用程序中的导航模式需要依靠片段加载 API 来导航至应用程序中不同的页面。此模式非常脆弱,并且强迫您编写大量代码来处理控件初始化和页面状态等问题。

在 Consumer Preview 中,我们在 Windows JavaScript 库 (WinJS) 中引入了一种高层页面控件,以供加载页面中的内容。此外,我们更新了 Visual Studio 模板,以便充分利用这些页面控件。在大多数情况下,页面控件可以绕过片段直接加载 API。这可以帮助您更加轻松地在 HTML 片段中导航。

页面控件在片段加载器的基础上构建。它们可提供一个以已呈现片段为后台的实际对象,一个存储状态并处理片段父元素的位置。有一个以片段为后台 WinJS 控件(附属于父 DOM 元素),可为其提供明确定义的生命周期。您也可以将仲裁方法或状态添加至此控件对象。

在出现未处理异常时终止应用程序

JavaScript 对于未处理异常非常宽容,它会终止执行包含该异常的函数,但其余部分会继续以一种不易察觉的方式执行。发生这种情况时,应用程序将进入一种无法预测的状态。这意味着您的应用程序依赖的数据可能不再有效,或者 UI 将在故障状态中结束。在 Web 浏览器中,这种情况影响不大,因为用户可以刷新该页面。但是,对于 Metro 风格的应用程序,用户必须能够连续数周运行您的应用程序,甚至无需关闭或重新打开该应用程序。

因此,现在未处理的 JavaScript 异常将在事件日志中记录一条错误消息,并终止该应用程序。

重要的 XAML Metro 风格应用程序更改

如果您已经开发过 XAML Metro 风格应用程序,您将在 Consumer Preview 中注意到针对自己所使用编程语言的一些更改。

C++ 数据绑定支持

在 Consumer Preview 中,我们针对 C++ 开发人员进行了大幅更改,显著简化了 XAML UI 和自定义 C++ 类之间的数据绑定。当您通过 Windows.UI.Xaml.Data.Bindable 属性在您的类中使用注释时,您的类将对绑定引擎可见,并且您将不再需要在此类中实施接口。这将显著减少您需要实施的代码量。

导航 API

如果您的 XAML Metro 风格应用程序使用了导航 API(例如,Windows.UI.Xaml.Controls.Frame.NavigateWindows.UI.Xaml.Navigation.NavigationEventArgs.Type),您将需要进行一些快速更改。这些 API 现在接受类型对象作为目标,而不是代表该类的字符串名称。请参阅从 //Build 大会时的版本迁移到 Windows 8 Consumer Preview 文档,以获取受影响 API 的完整列表。

AppBar

我们对 Windows.UI.Xaml.Controls.ApplicationBar 功能进行了大量更改,以便使其更加贴合 Metro 风格应用程序的用户体验。这些更改也将显著减少您为了贴合 Metro 风格体验所需实施的代码量。

其中的一大更改是您可以使用新的 Windows.UI.Xaml.Controls.Page.TopAppBar 和 BottomAppBar 属性在应用程序中放置 AppBar。我们建议您使用这些新的属性,而不是在您的应用程序布局中直接放置 AppBar。我们添加、重命名或移除了其他几个 AppBar 属性。

语义缩放

语义缩放是 Windows 8 平台中使用的术语,指用户可以对内容进行放大或缩小,同时更改其上下文的情境。例如,当您放大一组照片时,照片可能会从缩略图变为带有名称、日期等信息的大号完整预览图。Developer Preview 中的 JumpViewer 控件可以实现语义缩放。我们已将其重命名为 SemanticZoom 控件。新名称更好地反映了当您在应用程序中实施这些控件之一时所提供的用户体验。

后续步骤

除了我们在本博文中介绍的更改,Windows 运行时和 Windows JavaScript 库中的许多 API 都发生了变化。例如,Windows 运行时中的 Networking、Media、System、UI、Storage、Devices、ApplicationModel、Globalization、Graphics 和 Data 命名空间都发生了变化。虽然这些更改大多微不足道,但您也需要在迁移代码时多加小心,以便确保您在应用程序中进行了所有必要的更改。本博文意在为您提供一个入门的途径,其中只涵盖了我们对开发平台所进行更改的一小部分。我已在本博文中多次向您推荐查看开发中心的从 //Build 大会时的版本迁移到 Windows 8 Consumer Preview 这一文档,以获取有关如何将应用程序迁移至 Consumer Preview 的详细信息。

我们期待着您发表的评论。如果您希望就具体问题获得详细指导,建议您在开发人员论坛上发布这些问题,我们将在那里为您提供解答。

-- Windows 开发团队合作伙伴架构师 John Sheehan

  • Loading...
Leave a Comment
  • Please add 8 and 2 and type the answer here:
  • Post