<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Windows 8 应用程序开发人员博客</title><link>http://blogs.msdn.com/b/windowsappdev_cn/</link><description>有关为 Windows 8 生成 Metro 风格应用程序的见解，来自 Windows 8 工程团队</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>介绍一种新的 Windows 开发人员中心体验 </title><link>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/05/16/windows-dev-center.aspx</link><pubDate>Thu, 16 May 2013 16:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10419368</guid><dc:creator>Windows 8 Team</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/windowsappdev_cn/rsscomments.aspx?WeblogPostID=10419368</wfw:commentRss><comments>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/05/16/windows-dev-center.aspx#comments</comments><description>&lt;div class="PostContent"&gt;
&lt;p&gt;自 2011 年 10 月推出 &lt;a href="http://msdn.microsoft.com/zh-cn/windows/default.aspx" target="_blank"&gt;Windows 开发人员中心&lt;/a&gt;以来，我们已经与全球范围内的众多开发人员和设计人员紧密协作，让他们了解我们如何为应用构建者提供出色的指导、激发其创作灵感并提供示例。通过网站数以百万计的访客以及用户的反馈，我们评测了工作的成效如何以及哪些功能和体验还可以继续改进。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0172.windows_5F00_dev_5F00_center_5F00_1EC86298.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="Windows 开发人员中心" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0184.windows_5F00_dev_5F00_center_5F00_thumb_5F00_1DEFFCAE.png" alt="Windows 开发人员中心" width="600" height="338" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;最近更新&lt;/h2&gt;
&lt;p&gt;Windows 团队致力于构建一个充满生机和活力的应用生态系统。有三种方式可以展示应用生态系统的好坏：设计出色的应用、良好的经济收益以及广泛的传播机会。新的开发人员中心为应用构建者、设计人员以及企业提供他们在开发出色的应用以及与 Windows 构建业务关系时所需的资源。&lt;/p&gt;
&lt;p&gt;为了支持这些目标，开发人员中心涉及以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;导航模式已经变化，您可以查找到您在应用开发生命周期过程中所需的所有相关内容&lt;/li&gt;
&lt;li&gt;网站设计突出显示了优先级较高的任务、应用场景和新内容&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;除了提供开发人员需要的内容、示例和下载内容外，设计人员和企业访问资源比以前更为方便。&lt;/p&gt;
&lt;p&gt;取决于您正在构建的内容，可以导航到以下四个区域之一：&lt;a href="http://msdn.microsoft.com/zh-cn/windows/apps/br229512" target="_blank"&gt;Windows 应用商店应用&lt;/a&gt;、&lt;a href="http://msdn.microsoft.com/zh-cn/ie/" target="_blank"&gt;Internet Explorer&lt;/a&gt;、&lt;a href="http://msdn.microsoft.com/zh-cn/windows/desktop" target="_blank"&gt;Windows 桌面&lt;/a&gt;和 &lt;a href="http://msdn.microsoft.com/zh-cn/windows/hardware" target="_blank"&gt;硬件&lt;/a&gt;。上述每个区域都提供了一种解决上面所涉及问题的新体验。在本篇博文中，我们将详细地了解对 Windows 应用商店应用所做的具体更改。&lt;/p&gt;
&lt;h2&gt;内容适合您的职务角色&lt;/h2&gt;
&lt;p&gt;如果找不到想要的内容，网站信息量再大对您而言也是没用的。开发人员中心中有数以万计的主题信息，内容的条理性以及可发现性至关重要。对于 Windows 应用商店应用开发，这意味着要更加紧密关注职务角色和应用场景，从将您着手所需的一切内容放置于一个位置到更好地支持设计人员和企业。以下是一些特色功能介绍。&lt;/p&gt;
&lt;h3&gt;开发人员&lt;/h3&gt;
&lt;p&gt;我们已经对构建出色的 Windows 应用商店应用所需的内容进行了精简。当访问 &lt;a href="http://msdn.microsoft.com/zh-cn/windows/apps/" target="_blank"&gt;Windows 应用商店应用主页&lt;/a&gt;时，将会看到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;位于显著位置的&amp;ldquo;主要任务和内容&amp;rdquo;可以帮助您跳转到自己所需的内容。您所在区域的&amp;ldquo;本地活动&amp;rdquo;以及最近添加到网站的最新资源会以突出形式显示。&lt;/li&gt;
&lt;li&gt;&amp;ldquo;下载&amp;rdquo;可以帮助您进一步深入了解代码、着手行动所需的一切资源以及有关如何将应用放置到 Windows 应用商店的详细指导。&lt;/li&gt;
&lt;li&gt;重要的代码示例会突出显示，您在关注开发生命周期的同时可以更方便地浏览帮助指南。&lt;/li&gt;
&lt;li&gt;网站内的&amp;ldquo;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br211360.aspx" target="_blank"&gt;One Dev Minute&lt;/a&gt;&amp;rdquo;视频，令您可以快速地浏览如何向应用中添加功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;设计人员&lt;/h3&gt;
&lt;p&gt;我们重新打造了网站的&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh779072.aspx" target="_blank"&gt;设计部分&lt;/a&gt;，令其更易于使用，同时更加全面。用户可以更方便地查找有用的下载内容和可重复使用的设计资产，设计灵感和案例研究为您提供在 Windows 上获得独一无二的体验所需工具。有了这个触摸友好并且易于使用的页面设计，您构建出色应用所需的一切内容都可以手到擒来。&lt;/p&gt;
&lt;h3&gt;业务&lt;/h3&gt;
&lt;p&gt;Windows 应用商店带来的商机巨大，其经济模式比竞争平台的更为出色，灵活性令您可以打造自己的业务。网站新的&lt;a href="http://go.microsoft.com/fwlink/?LinkID=285998" target="_blank"&gt;市场部分&lt;/a&gt;可以为您推销自己的应用、评估遥测数据以及通过应用认证提供更多提示和技巧。我们已经了解到如何更容易地通过认证的很多内容，我们对相关内容进行了改进以帮助您加快这个过程。&lt;/p&gt;
&lt;p&gt;当然，您也可能担任多项职务角色，我们认为新网站的结构同样也可以提供良好的支持。不论是业余爱好者还是创新型公司乃至大型企业软件开发商，新的网站的结构都可以帮助您利用 Windows 实现您的创新灵感以及业务愿景。&lt;/p&gt;
&lt;h2&gt;未来前景更为广阔，我们期待您的加入&lt;/h2&gt;
&lt;p&gt;现在距离 &lt;a href="http://www.buildwindows.com"&gt;BUILD 2013&lt;/a&gt; 还有一个多月的时间，我们还有很多内容需要分享和发布。我们正在不断努力工作，准备更多新的内容在这个年度盛会上与大家分享。除了阅读这篇博文外，您还可以在 Twitter 上关注 &lt;a href="https://twitter.com/#!/windevs" target="_blank"&gt;@windevs&lt;/a&gt; 或者订阅 &lt;a href="http://www.windowsstore.com/newsletter-signup" target="_blank"&gt;Windows 应用商店新闻稿&lt;/a&gt;保持对我们的关注。&lt;/p&gt;
&lt;p&gt;我们推出更多的内容来帮助您设计、开发和营销您的 Windows 应用商店应用，希望不断改进您的开发人员中心体验！为了让您更方便地反馈您的想法，我们在每个页面的底部提供了两种新的反馈选择。请提供反馈 &amp;ndash; 我们愿意倾听您的意见并始终努力解决您遇到的困惑和问题。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Windows 开发人员中心内容发布经理 Keith Boyd&lt;/p&gt;
&lt;!-- Title: “介绍一种新的 Windows 开发人员中心体验” Tags: “开发人员中心, 开发者信息, 应用构建, Windows 应用商店应用, 构建, Windows 开发人员中心” --&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10419368" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_945E28758467FA5E_/">应用构建</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+_945E28754655975E945E2875_/">Windows 应用商店应用</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+_005FD153BA4E58542D4EC35F_/">Windows 开发人员中心</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_8467FA5E_/">构建</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_005FD153BA4E58542D4EC35F_/">开发人员中心</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_005FD1530580E14F6F60_/">开发者信息</category></item><item><title>共享到您的目标应用 </title><link>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/05/15/sharing-to-target-app.aspx</link><pubDate>Wed, 15 May 2013 16:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10418953</guid><dc:creator>Windows 8 Team</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/windowsappdev_cn/rsscomments.aspx?WeblogPostID=10418953</wfw:commentRss><comments>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/05/15/sharing-to-target-app.aspx#comments</comments><description>&lt;div class="PostContent"&gt;
&lt;p&gt;在博文&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/12/20/10379931.aspx" target="_blank"&gt;从您的应用共享内容&lt;/a&gt;中，我们介绍了将&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/07/17/metro-from-the-crowd.aspx" target="_blank"&gt;与好友聚餐&lt;/a&gt;示例应用中的内容共享到多个目标应用，从而允许用户实现丰富的端到端应用场景的概念。Windows 8 中的应用提供了您的客户会希望与好友或其他应用&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465251.aspx" target="_blank"&gt;共享&lt;/a&gt;的有趣内容。引人注目、设计精良的共享目标将使您的应用对于客户的社交和连接体验变得至关重要。&lt;/p&gt;
&lt;p&gt;在本篇博文中，我们来看一下如何对您的应用使用&amp;ldquo;共享目标&amp;rdquo;合约，尤其是&amp;ldquo;与好友聚餐&amp;rdquo;等应用。使用此合约，您的应用可以从其他应用接收内容&lt;em&gt;&lt;/em&gt;，并使用这些内容来改进其质量。我们希望帮助您将您的应用变得出类拔萃！&lt;/p&gt;
&lt;p&gt;目标应用使用&amp;ldquo;共享目标&amp;rdquo;&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/03/30/windows-8-activating-contracts.aspx" target="_blank"&gt;合约&lt;/a&gt;构建，并且专为快速、轻松的共享体验而设计。并非 Windows 中的每个应用都将成为共享目标，但如果您的应用可以发布、转换、存储或通过某种方式为从其他应用接收的内容增加价值，则创建共享目标将为您带来许多好处。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;您的应用将始终显示于目标应用列表中。它可与共享您需要的数据的其他应用即时关联并建立连接。&lt;/li&gt;
&lt;li&gt;&amp;ldquo;共享&amp;rdquo;合约创建了您的应用和任何目标应用之间的连接，而无需对两个应用进行一对一的集成。&lt;/li&gt;
&lt;li&gt;由于&amp;ldquo;共享&amp;rdquo;超级按钮始终存在于操作系统中并可供使用，它可以使您的目标应用存在于操作系统中，从而拓宽了您的应用的范围。这样可以引导更多的客户使用您的应用！&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;接收共享内容&lt;/h2&gt;
&lt;p&gt;让我们一起来看几个示例，其中显示了如何通过共享目标应用提供引人入胜的使用体验。&lt;/p&gt;
&lt;p&gt;您可能已对 Windows 8 中的邮件和人脉应用非常熟悉。邮件应用创建了接收并与一个或多个好友共享内容的轻松个人共享目标体验。人脉应用允许您与社交网络上更广泛的受众共享内容。除社交共享外，您还可以进一步使用应用到应用共享。SkyDrive 等生产效率应用可以从 Windows 中的任何位置接收文件，并将它们存储到云；笔记应用可以接收文本、链接和各种其他格式的数据，并对这些数据进行归档以供日后参考。发挥创意的空间十分巨大。&lt;/p&gt;
&lt;p&gt;请看以下两张照片，其中展示了将 Photos 应用中的照片共享到 PuzzleTouch（一款将照片转变为视觉拼图的游戏）的共享流程。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8637.puzzletouch1_5F00_6E4332DA.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="源应用位于左侧；可接收照片的已筛选目标应用列表位于右侧的共享窗格中。" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1307.puzzletouch1_5F00_thumb_5F00_2681A9F3.png" alt="源应用位于左侧；可接收照片的已筛选目标应用列表位于右侧的共享窗格中。" width="700" height="394" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;图 1：源应用位于左侧；可接收照片的已筛选目标应用列表位于右侧的共享窗格中。 &lt;br /&gt;PuzzleTouch 是可从 Photos 应用接收照片的共享目标之一。&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/6661.puzzletouch2_5F00_463083BB.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="目标应用预览可让用户在右侧选择他们要构建的拼图类型" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/2474.puzzletouch2_5F00_thumb_5F00_65DF5D83.png" alt="目标应用预览可让用户在右侧选择他们要构建的拼图类型" width="700" height="394" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;图 2：目标应用预览可让用户在右侧选择他们&lt;br /&gt;要构建的拼图类型。当用户切换回该应用时，拼图将准备就绪。&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;什么是共享目标应用？&lt;/h2&gt;
&lt;p&gt;Windows 中的端到端体验由两部分组成。首先，必须具有在 Windows 中能够以不同格式来提供内容的源应用。其次，还必须具有注册为能够识别特定格式并作为共享内容的目标的共享目标应用。使用&amp;ldquo;共享&amp;rdquo;合约，源应用和共享目标应用可以进行相互通信。&lt;/p&gt;
&lt;p&gt;当考虑您的应用的共享体验时，应想到共享目标应用是在托管共享窗口中呈现的。请确保设计了这种体验，从而您的用户可以快速预览内容并在此视图中确认共享。以下示例显示了邮件共享目标应用视图，其允许用户从浏览器与他/她的邮件联系人之一快速共享链接。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8561.Share_2D00_Target_2D00_Image_5F00_3ED44139.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="共享目标图像" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/6011.Share_2D00_Target_2D00_Image_5F00_thumb_5F00_4FD86F1C.png" alt="共享目标图像" width="700" height="435" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;图 3：使用邮件目标应用来从 Photos 应用共享链接&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;&amp;ldquo;与好友聚餐&amp;rdquo;的应用场景&lt;/h2&gt;
&lt;p&gt;现在，我们来考虑一下&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/07/17/metro-from-the-crowd.aspx" target="_blank"&gt;与好友聚餐&lt;/a&gt;应用是如何创建引人入胜的共享目标应用体验的。如果您对&amp;ldquo;与好友聚餐&amp;rdquo;应用非常熟悉，将会了解到用户可在该应用中采取的两个主操作 &amp;ndash; 创建计划&lt;em&gt;&lt;/em&gt;和&lt;em&gt;&lt;/em&gt;向其备选列表添加餐馆。当然，还有编写评审、发表评论和查看好友的备选列表等操作，但这些操作在主应用程序的上下文中才有意义。对于这两个突出的核心应用场景，让我们来进行一次快速的健全性检查，以查看是否这些应用场景可通过&amp;ldquo;与好友聚餐&amp;rdquo;目标应用有效地完成。&lt;/p&gt;
&lt;h3&gt;创建今晚的计划&lt;/h3&gt;
&lt;p&gt;尽管这是主应用程序的核心应用场景，但并不是共享目标体验的最佳应用场景。以下是详细原因：共享目标体验应具有轻松快捷的特点。创建计划是一项更为复杂的任务 &amp;ndash; 用户要了解好友希望尝试的其他餐馆，比较他们的备选列表中的一些餐馆并回顾评分等。由于计划涉及利用在主应用程序视图中以最佳方式呈现的详细信息，因此将这些内容压缩到共享目标应用将会缺乏吸引力。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;添加到备选列表&lt;/h3&gt;
&lt;p&gt;作为共享目标中的简短指令任务，这一应用场景的效果确实非常不错。该应用体验中的一些亮点包括：&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户会在其他应用中遇到餐馆，无论是旅行计划应用、包含建议的地方城市应用、美食博客还是其他应用。&amp;ldquo;与好友聚餐&amp;rdquo;应用是个出色的目标，它可以将餐馆整合到&amp;ldquo;我的备选列表&amp;rdquo;区域。&lt;/li&gt;
&lt;li&gt;应用的目标应用视图旨在帮助用户在不同应用的上下文中快速进行操作。因此，向备选列表中添加餐馆是在共享目标中显示餐馆的极佳选择。&lt;/li&gt;
&lt;li&gt;当然，用户也可以通过切换应用、重复搜索来查找餐馆，然后将餐馆添加到他们的备选列表中，而快速点击&amp;ldquo;共享&amp;rdquo;要轻松的多。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;ldquo;与好友聚餐&amp;rdquo;备选列表似乎是我们希望设计和构建的出色的共享目标应用体验。以下是我们想像中的端到端应用场景：&lt;/p&gt;
&lt;p&gt;当浏览显示本地移动餐车的应用时，我找到了听起来非常有趣的移动餐车建议。我希望将该移动餐车从该应用添加到&amp;ldquo;与好友聚餐&amp;rdquo;应用中的我的备选列表以供今后制定计划时参考。&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/7658.contoso_5F00_truck_5F00_6C263411.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="浏览显示本地移动餐车并建议用户感兴趣的地方的应用" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3022.contoso_5F00_truck_5F00_thumb_5F00_4B9EF45F.png" alt="浏览显示本地移动餐车并建议用户感兴趣的地方的应用" width="700" height="394" border="0" /&gt;&lt;/a&gt;图 4：浏览显示本地移动餐车并建议用户感兴趣的地方的应用&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;此图显示了我们要使用的共享目标应用视图：&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3835.contoso_5F00_truck2_5F00_565C4BB4.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="共享目标应用视图" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8637.contoso_5F00_truck2_5F00_thumb_5F00_760B257C.png" alt="共享目标应用视图" width="700" height="394" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;图 5：共享目标应用视图&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;通过在共享目标应用中完成共享操作，用户可在&amp;ldquo;与好友聚餐&amp;rdquo;应用中呈现餐馆，而无需在其当前的沉浸式应用体验中切换上下文。&lt;/p&gt;
&lt;h2&gt;实施共享目标&lt;/h2&gt;
&lt;p&gt;现在您已了解了一些关于在何时实施共享目标的示例，接下来我们来看看如何实施共享目标。首先，要决定您的应用可以接收哪些格式的数据。&lt;/p&gt;
&lt;h3&gt;您应该支持哪些数据格式？&lt;/h3&gt;
&lt;p&gt;通过&amp;ldquo;共享&amp;rdquo;，您可以支持文本、URI、HTML、位图和文件等标准数据格式，也可以支持诸如 &lt;a href="http://schema.org" target="_blank"&gt;http://schema.org&lt;/a&gt; 中列出的自定义数据格式。Windows 按照其支持的数据格式来筛选目标应用，以在&amp;ldquo;共享&amp;rdquo;窗格中显示已筛选的目标应用的列表。您的应用应支持对于应用体验至关重要的数据格式。例如，如果您的应用是关于查看照片的，则支持文本格式未必有用。如果您声明支持多种数据格式，请决定哪种格式可帮助您的以最佳方式呈现共享数据，以便您可以从数据包中首先选择这种格式。&lt;/p&gt;
&lt;p&gt;由于&amp;ldquo;与好友聚餐&amp;rdquo;应用实施了可让用户与应用共享餐馆的共享目标体验，我们将使用 &lt;a href="http://schema.org" target="_blank"&gt;http://schema.org&lt;/a&gt; 中列出的&lt;a href="http://schema.org/Restaurant" target="_blank"&gt;餐馆&lt;/a&gt;数据格式。&amp;ldquo;与好友聚餐&amp;rdquo;可以注册&amp;ldquo;共享目标&amp;rdquo;合约以接收这种数据格式。然后，使用接收到的包中的数据，该应用可在其目标应用视图中构建引人注目的体验，用户可以将餐馆添加到他们的备选列表。&lt;/p&gt;
&lt;p&gt;一些源应用可能专门共享&lt;a href="http://schema.org/Restaurant" target="_blank"&gt;餐馆&lt;/a&gt;数据格式，而其他源应用可能会使用 &lt;a href="http://schema.org/" target="_blank"&gt;schema.org&lt;/a&gt; 中列出的&lt;a href="http://schema.org/Place" target="_blank"&gt;地点&lt;/a&gt;、&lt;a href="http://schema.org/LocalBusiness" target="_blank"&gt;LocalBusiness&lt;/a&gt; 和 &lt;a href="http://schema.org/FoodEstablishment" target="_blank"&gt;FoodEstablishment&lt;/a&gt; 等其他数据格式呈现类似的内容。因此，&amp;ldquo;与好友聚餐&amp;rdquo;应用可支持接收&amp;ldquo;共享&amp;rdquo;合约中的多种数据格式，以满足众多源应用的需求。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;与好友聚餐&amp;rdquo;应用支持应用程序清单的共享目标声明中的以下格式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="http://schema.org/Restaurant" target="_blank"&gt;餐馆&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="http://schema.org/Place" target="_blank"&gt;地点&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="http://schema.org/LocalBusiness" target="_blank"&gt;LocalBusiness&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="http://schema.org/FoodEstablishment" target="_blank"&gt;FoodEstablishment&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;为简洁起见，我们重点关注&lt;a href="http://schema.org/Restaurant" target="_blank"&gt;餐馆&lt;/a&gt;数据类型，但这些概念也适用于其他数据类型。&lt;/p&gt;
&lt;h3&gt;您应该关注哪些数据格式和应用场景？&lt;/h3&gt;
&lt;p&gt;&amp;ldquo;与好友聚餐&amp;rdquo;应用将仅在接收到的餐馆信息与该应用已知的餐馆信息相符时支持将餐馆添加到用户的备选列表。这样做是为了有意避免在应用中出现多个版本的餐馆。&lt;/p&gt;
&lt;p&gt;我们不支持标准数据类型，因为大多数从源应用共享的文本、文件、照片、URI 或 HTML 将不会映射到餐馆或当地企业。例如，如果&amp;ldquo;与好友聚餐&amp;rdquo;应用支持接收文本，则它将在笔记源应用的目标应用列表中显示。在此情况下，&amp;ldquo;与好友聚餐&amp;rdquo;将需要提供错误消息，告知用户该应用无法与他们的源应用配合使用的原因。总而言之，数据格式是连接为目标应用提供内容的源应用的纽带。如果数据格式不同，共享的内容将变得毫无价值。&lt;/p&gt;
&lt;p&gt;请确保考虑有助于识别您所关注的内容的所有数据格式，同时还要注意到会影响您的共享体验的数据格式。&lt;/p&gt;
&lt;h3&gt;支持&amp;ldquo;共享目标&amp;rdquo;合约&lt;/h3&gt;
&lt;p&gt;要支持数据格式，请在 Visual Studio 清单设计工具中对它们进行声明。以下是用户选择您的应用作为共享操作目标的情形：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过源应用在共享目标窗口中启动应用的新实例。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.applicationmodel.activation.sharetargetactivatedeventargs.aspx" target="_blank"&gt;共享目标激活&lt;/a&gt;事件触发，您的应用最终接收到 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br205977.aspx" target="_blank"&gt;ShareOperation&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; 对象。&lt;/li&gt;
&lt;li&gt;您的应用可以检索用户从该对象共享的数据。&lt;/li&gt;
&lt;li&gt;您可以使用此数据呈现目标应用视图，并完成用户的共享。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;有关如何创建该体验的更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465255.aspx" target="_blank"&gt;接收共享内容&lt;/a&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465255.aspx"&gt;&lt;span style="text-decoration: underline;"&gt;快速入门&lt;/span&gt;&lt;/a&gt;指南。&lt;/p&gt;
&lt;p&gt;另外，Visual Studio 还支持共享目标模板。右键单击您的项目，选择&amp;ldquo;添加项目&amp;rdquo;&lt;strong&gt;&lt;/strong&gt;、&amp;ldquo;添加新项目&amp;rdquo;&lt;strong&gt;&lt;/strong&gt;并单击列表中的&amp;ldquo;共享目标&amp;rdquo;合约&lt;strong&gt;&lt;/strong&gt;，然后添加支持该合约的代码。&lt;a href="http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782" target="_blank"&gt;共享目标代码示例&lt;/a&gt;展示了如何接收共享内容。&lt;/p&gt;
&lt;h2&gt;设计量身定制的目标应用视图&lt;/h2&gt;
&lt;p&gt;当用户从&amp;ldquo;共享&amp;rdquo;窗格中的应用列表选择目标应用时，Windows 将在该应用的共享目标视图中启动该应用。目标应用视图是托管在&amp;ldquo;共享&amp;rdquo;窗格中的特殊视图，与应用的主视图有所不同。&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/03/30/windows-8-activating-contracts.aspx" target="_blank"&gt;在您的应用程序中激活 Windows 8 合约&lt;/a&gt;提供了关于托管视图和处理这些视图的激活的更多信息。该目标应用视图旨在帮助完成用户启动的共享操作。在该视图中，用户应能够快速预览他们的内容、执行简单的操作和确认他们的共享内容。&lt;/p&gt;
&lt;p&gt;在查看&amp;ldquo;与好友聚餐&amp;rdquo;的目标应用设计之前，让我们一起来考虑一个您可能已了解的目标应用。下图并排显示了邮件应用的目标应用视图和 Windows 8 中的应用的完整视图。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1307.target_2D00_app_5F00_4AC68E75.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="将 Photos 应用中的内容共享到右侧的邮件目标应用" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0724.target_2D00_app_5F00_thumb_5F00_5583E5CA.png" alt="将 Photos 应用中的内容共享到右侧的邮件目标应用" width="700" height="438" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;图 6：将 Photos 应用中的内容共享到右侧的邮件目标应用&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1385.mail_5F00_154DCC50.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="在邮件应用的主应用视图中撰写新邮件" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/2055.mail_5F00_thumb_5F00_510D6503.png" alt="在邮件应用的主应用视图中撰写新邮件" width="700" height="438" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;图 7：在邮件应用的主应用视图中撰写新邮件&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;请注意邮件应用的共享目标应用视图与其完整应用视图相比更为简单。它为用户要以缩略图以及相关文本和 HTML 格式共享的内容提供了简洁和最小化的预览。另外，它还提供了一个用于添加收件人的 [To]（收件人）&lt;strong&gt;&lt;/strong&gt;行、一个快速撰写消息的输入区域，以及通过 [Send]（发送）按钮&lt;strong&gt;&lt;/strong&gt;确认发送的简便方法。&lt;/p&gt;
&lt;p&gt;尽管该视图更为简单，但该应用的目标应用视图作为邮件应用的虚拟形象可以明确识别，这增强了用户对共享内容的目标的信心。&lt;/p&gt;
&lt;h2&gt;&amp;ldquo;与好友聚餐&amp;rdquo;应用作为共享目标应用&lt;/h2&gt;
&lt;p&gt;现在您已对目标应用视图的设计有了大致的了解，接下来让我们来讨论一下&amp;ldquo;与好友聚餐&amp;rdquo;应用如何创建帮助用户向&amp;ldquo;我的备选列表&amp;rdquo;添加餐馆的目标应用。&lt;/p&gt;
&lt;p&gt;当&amp;ldquo;与好友聚餐&amp;rdquo;应用接收到包含源应用中的&lt;a href="http://schema.org/Restaurant"&gt;餐馆&lt;/a&gt;的数据包时，其可以使用&lt;a href="http://schema.org/Restaurant"&gt;餐馆&lt;/a&gt;数据格式的详细信息来识别其现有数据库中的哪个餐馆与接收到的数据包匹配。然后，该应用可以在目标应用视图中显示该餐馆的预览。这增强了用户对共享内容的完整性的信心。&lt;/p&gt;
&lt;p&gt;此图显示了&amp;ldquo;与好友聚餐&amp;rdquo;应用的目标应用视图 &amp;ndash;&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3857.contoso_5F00_truck3_5F00_0305058E.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="&amp;ldquo;与好友聚餐&amp;rdquo;应用的目标应用视图" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5584.contoso_5F00_truck3_5F00_thumb_5F00_1B94A2DE.png" alt="&amp;ldquo;与好友聚餐&amp;rdquo;应用的目标应用视图" width="700" height="394" border="0" /&gt;&lt;/a&gt;图 8：&amp;ldquo;与好友聚餐&amp;rdquo;应用的目标应用视图&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;如您所见，&amp;ldquo;与好友聚餐&amp;rdquo;应用的这一视图非常简洁，并且专为共享目标应用而量身定制 - 显示用户希望共享的餐馆的预览，以及一个用来明确主应用中共享内容的目标的简单可操作按钮 [Add to Wishlist]（添加到备选列表）&lt;strong&gt;&lt;/strong&gt;。当用户点击或单击该按钮时，其将确认共享操作。通过在此处要求点击或单击，我们可以帮助避免意外共享并建立用户对整个共享体验的信心。&lt;/p&gt;
&lt;p&gt;如果应用找到了与数据包内容中的信息匹配的多个餐馆，&amp;ldquo;与好友聚餐&amp;rdquo;应用将使用共享目标应用视图来显示选项并让用户选择要共享的餐馆。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5582.contoso_5F00_truck4_5F00_70500BD6.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="目标应用视图显示选项以供用户选择要共享的项目" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/6175.contoso_5F00_truck4_5F00_thumb_5F00_6FE3D8E1.png" alt="目标应用视图显示选项以供用户选择要共享的项目" width="700" height="394" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;图 9：目标应用视图显示选项以供用户选择要共享的项目&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;如果应用无法根据接收到的数据包准确地识别餐馆或一组有效的选项，请使用目标应用视图来传递该消息。&lt;/p&gt;
&lt;h2&gt;创建 QuickLink&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.quicklink.aspx" target="_blank"&gt;QuickLink&lt;/a&gt; 是共享 API 的一项设置，它允许用户将内容快速共享到您的目标应用中的熟悉的目标。作为您的目标视图的自定义链接，QuickLink 提供了一些特定的操作。当 Windows 筛选用户可用的目标应用列表时，QuickLink 列表显示于&amp;ldquo;共享&amp;rdquo;窗格的顶部，作为可用目标列表。这些熟悉的目标或用户操作可能包含通过目标应用经常共享的地点或人员。例如，邮件应用返回以前向其发送过邮件的联系人的 QuickLink。同样，您也可以将 QuickLink 添加到您经常与目标应用共享的文件夹、组、笔记本和播放列表中。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5001.quicklink_5F00_2FADBF67.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="&amp;ldquo;共享&amp;rdquo;窗格显示邮件目标应用提供的以前使用目标应用向其发送过邮件的联系人的 QuickLink" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1374.quicklink_5F00_thumb_5F00_334BDA44.png" alt="&amp;ldquo;共享&amp;rdquo;窗格显示邮件目标应用提供的联系人的 QuickLink" width="700" height="438" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;图 10：&amp;ldquo;共享&amp;rdquo;窗格显示邮件目标应用提供的以前使用目标应用 &lt;br /&gt;向其发送过邮件的联系人的 QuickLink&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;该目标应用可通过调用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br205977.aspx" target="_blank"&gt;ShareOperation&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; 对象的 &lt;strong&gt;&lt;/strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.shareoperation.reportcompleted.aspx" target="_blank"&gt;ReportCompleted&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt; 方法来提供 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.quicklink.aspx" target="_blank"&gt;QuickLink&lt;/a&gt;。QuickLink 必须包含标题、图标和 ID。当用户点击&amp;ldquo;共享&amp;rdquo;超级按钮时，会显示标题（如&amp;ldquo;给母亲的电子邮件&amp;rdquo;）和图标。ID 是您的应用用于访问自定义信息（例如，电子邮件地址、文件夹位置等）的标识符。要了解关于此工具的更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh758299.aspx" target="_blank"&gt;如何创建 QuickLink&lt;/a&gt;。&amp;nbsp;&lt;/p&gt;
&lt;p&gt;注意：QuickLink 在应用支持目标应用的多个操作时非常有用。由于&amp;ldquo;与好友聚餐&amp;rdquo;应用仅支持共享目标中的单个操作，即&amp;ldquo;添加到备选列表&amp;rdquo;&lt;strong&gt;&lt;/strong&gt;，该应用未实施 QuickLink。&lt;/p&gt;
&lt;h2&gt;扩展共享和错误报告&lt;/h2&gt;
&lt;p&gt;有时源应用可以共享大量的数据，例如照片、视频或文件，这使数据传输时间变得更长。这些类型的共享操作称为&amp;ldquo;扩展共享&amp;rdquo;&lt;em&gt;&lt;/em&gt;，您的目标应用可能需要更多的时间来接收和处理数据。&lt;/p&gt;
&lt;p&gt;由于共享是快速而流畅的过程，目标应用视图是主应用中的轻型托管视图，用户可能需要点击目标应用视图以返回到他们的主应用。因此，在共享开始之后，目标应用不应依赖于或期望与目标应用视图的用户交互。目标应用可以依赖于使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br205977.aspx" target="_blank"&gt;ShareOperation&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; 对象及其方法来让 Windows 知道应用正在处理数据。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.shareoperation.reportstarted.aspx" target="_blank"&gt;reportStarted&lt;/a&gt;&lt;/strong&gt; &amp;ndash; 调用此方法来让 Windows 知道您的应用已开始在源应用的 DataPackage 对象中检索数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.shareoperation.reportdataretrieved.aspx" target="_blank"&gt;reportDataRetrieved&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&amp;ndash; 调用此方法来让 Windows 知道您的应用已完成检索包中的数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.shareoperation.reportcompleted.aspx" target="_blank"&gt;reportCompleted&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt; &amp;ndash; &lt;/span&gt;&lt;/strong&gt;调用此方法来让 Windows 知道您的应用已完成共享操作。&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当您的应用处理扩展共享的数据时，请在目标应用视图中为用户提供进度 UI。这样可以通知用户他们的请求正在处理，并在用户返回到您的应用并检查共享操作的进度时增强他们的信心。要了解关于 Windows 8 中的进度控件的更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465487.aspx" target="_blank"&gt;快速入门：添加进度控件&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0702.progress_2D00_bar_5F00_52FAB40C.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="进度栏" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3438.progress_2D00_bar_5F00_thumb_5F00_40B1ED4A.png" alt="进度栏" width="700" height="438" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;图 11：邮件目标应用在完成扩展共享（例如发送超大附件）时显示进度环&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;如果在数据传输期间出现问题，您的目标应用必须终止共享操作，您可以调用 &lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;reportError&lt;/span&gt;&lt;/strong&gt; 来向 Windows 发送错误消息。当用户在&amp;ldquo;共享&amp;rdquo;窗格中查看共享状态时，他们将看到该消息。在您报告错误之后，您的应用将关闭并且共享将终止。用户需要重新启动来与您的应用共享内容。&lt;/p&gt;
&lt;p&gt;在&amp;ldquo;与好友聚餐&amp;rdquo;共享目标示例中，如果该应用无法识别其数据库中的某个餐馆，而该餐馆与通过&lt;a href="http://schema.org/Restaurant" target="_blank"&gt;餐馆&lt;/a&gt;数据格式从源应用共享的餐馆相匹配，则该应用将报告错误。&lt;/p&gt;
&lt;h2&gt;让我们回顾一下本博文的内容！&lt;/h2&gt;
&lt;p&gt;应用到应用共享提供了共享目标应用的绝好机会。通过允许您的应用接收共享内容，您的用户甚至可以在进行其他活动时从您的应用获得价值。我们希望您对设计原则，以及您可以用来创建出色的共享目标的数据类型、类和属性有了更加深刻的理解。我们将对了解您的应用如何传输共享内容并创建更广泛、更丰富的最终用户体验而感到激动不已。&lt;/p&gt;
&lt;p&gt;如果您要了解关于共享的更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh464923.aspx" target="_blank"&gt;共享和交换数据&lt;/a&gt;和&lt;a href="http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782" target="_blank"&gt;共享内容目标应用示例&lt;/a&gt;来获得入门知识！&lt;/p&gt;
&lt;p&gt;Ishita Kapur&lt;/p&gt;
&lt;p&gt;项目经理&lt;/p&gt;
&lt;p&gt;Windows 用户体验&lt;/p&gt;
&lt;!-- Title: “共享到您的目标应用” Tags: “共享应用, 目标应用, 共享内容, 共享目标, 共享目标应用” --&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10418953" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_7151AB4E945E2875_/">共享应用</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_7151AB4EEE760768_/">共享目标</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_7151AB4EEE760768945E2875_/">共享目标应用</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_EE760768945E2875_/">目标应用</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_7151AB4E8551B95B_/">共享内容</category></item><item><title>使用 NFC 开发前沿应用</title><link>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/04/24/nfc.aspx</link><pubDate>Wed, 24 Apr 2013 22:37:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10413815</guid><dc:creator>Windows 8 Team</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/windowsappdev_cn/rsscomments.aspx?WeblogPostID=10413815</wfw:commentRss><comments>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/04/24/nfc.aspx#comments</comments><description>&lt;div class="PostContent"&gt; &lt;p&gt;近场通信 (NFC) 是一种新兴的短距离无线通信技术。在 2 厘米的精确范围内，人们可以通过物理方式点击连接设备来发送/接收内容。通过点击可以快速选择人或物。这种信息交流方式不仅速度快，而且易于理解。操作方法一目了然，无需阅读任何手册。&lt;/p&gt;  &lt;p&gt;例如，假设您与好友正在共同欣赏一些照片，并且她想要您的照片；使用 NFC，您只需对着她的 PC 点击您的设备就可以发送照片。是否觉得过于简单了？也许是，不过此项技术的初衷就是为了简单地在设备之间共享内容。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1732.NFC_2D00_image_5F00_04E645BB.png"&gt;&lt;img title="&amp;#39;此图显示 Nokia 360 音箱与 Windows Phone 共享蓝牙配对信息" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="&amp;#39;此图显示 Nokia 360 音箱与 Windows Phone 共享蓝牙配对信息" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3566.NFC_2D00_image_5F00_thumb_5F00_38420917.png" width="400" height="348" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;图 1：此图显示 Nokia 360 音箱   &lt;br /&gt;与 Windows Phone 共享蓝牙配对信息&lt;/p&gt;  &lt;p&gt;与蓝牙或 Wi-Fi 类似，NFC 是由 &lt;a href="http://www.nfc-forum.org/home/" target="_blank"&gt;NFC 论坛&lt;/a&gt;&lt;u&gt;&lt;/u&gt; (NFC Forum) 定义的一种标准无线传输协议。&lt;u&gt;&lt;/u&gt;您的 PC 需要 NFC 无线通信装置。许多 Windows 8 PC 中直接集成了 NFC 无线通信装置。如果您的 PC 未集成 NFC，可以购买 NFC 收发器，并将其插入您的 PC。&lt;/p&gt;  &lt;p&gt;NFC 提供了一些非常酷的功能。人们可以点击并发送照片，在餐馆点击菜谱并订餐，甚至可以通过点击与蓝牙设备配对。这些场景彼此有很大不同，但一个共同点是通过“点击”启动体验。NFC 可用于各种设备，如 PC、电话、音箱、耳机、无线显示器等，这使得将设备连接在一起成为一种真正直观的体验。此外，NFC 还使用 RFID 标签；它们是真正便宜、轻巧的无源天线，可容纳大量的数据，并可以粘贴在几乎任何物体上，最常用于海报。例如，购买电影票如同点击电影海报一样简单！这就是 NFC 标签。我们将通过点击 NFC 标签这样一个基本示例来演示 NFC API 的一些关键概念。&lt;/p&gt;  &lt;p&gt;但是，首先我们仔细看一下点击设备进行连接意味着什么。&lt;/p&gt;  &lt;h2&gt;定义“点击”&lt;/h2&gt;  &lt;p&gt;无论是点击将蓝牙鼠标配对还是点击共享照片，重要的是用户需要以相同的方式点击设备进行连接。尽管点击是一个很好理解的概念，但对着另一设备点击您的 PC 对于大多数人而言还是一个新概念。下面是有关点击的一些指导原则，以便让用户知道：&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="center"&gt;&lt;b&gt;在何处点击设备进行连接&lt;/b&gt; – 通过使用触摸标记（也称为“轻触并执行”视觉标记）指示 NFC 天线的位置。根据 PC 型号的不同，您需要点击 PC 的不同部分。���如，在平板电脑上需要点击背面，但在多功能一体机上则需要点击正面。下面是该标记在所有启用 NFC 的 Windows 8 PC 上的图标：        &lt;br /&gt;&lt;/div&gt;     &lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0830.NFC_2D00_logo_5F00_66E85720.png"&gt;&lt;img title="“轻触并执行”视觉标记" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="“轻触并执行”视觉标记" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5611.NFC_2D00_logo_5F00_thumb_5F00_3FAE0DEB.png" width="200" height="147" /&gt;&lt;/a&gt;      &lt;p align="center"&gt;图 2：“轻触并执行”视觉标记&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;&lt;b&gt;设备正在相互通信&lt;/b&gt; - 在点击过程中，用户相信正在执行某些操作；即使他们看不到数据正在传输。因此，当设备在感应范围内并且正在相互通信时，Windows 将播放声音。&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Windows 会自动执行这些操作，因此您无需为它们操心。有关这些用户体验要素的更多信息，请参阅 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/hardware/hh770524.aspx" target="_blank"&gt;Windows 8 近场邻近感应实施规范&lt;/a&gt;&lt;u&gt;&lt;/u&gt;。&lt;u&gt;&lt;/u&gt;了解上述内容之后，让我们看一些使用 NFC 可以体验的超酷场景。&lt;/p&gt;  &lt;h2&gt;何时使用 NFC&lt;/h2&gt;  &lt;p&gt;当用户需要在您的应用中选择人或物时使用 NFC。NFC 为您提供了一种直观的选择方式；它通常比手动搜索速度要快（而且更酷！）。点击是一种启动体验的触发操作；根据应用的不同，得到的体验也不同，范围从接收照片到启动播放列表，不一而足。点击之后发生的操作实际上由您的应用决定。因此，为简单起见，我们将此系列体验归类为“轻触并执行”体验。&lt;/p&gt;  &lt;p&gt;下面是一些使用 NFC 在应用中选择内容的示例。您可以点击并…&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;u&gt;从海报获取信息&lt;/u&gt;：&lt;a href="http://www.nfc-forum.org/news/pr/view?item_key=2c0cb92de7d47bbbe7c99f13912b3307fc03c1c6" target="_blank"&gt;NFC 标签&lt;/a&gt;是轻巧、便宜的 RFID 标签；它们的成本介于 0.15 - 1.00 美元之间（价格因印刷成本而异）。它们相当于二维条码，但使用起来更方便、速度更快。点击标签比拍摄条码（需要将相机调到正确角度）感觉更舒服。制造商越来越多地将标签嵌入在人流密集的地方（如机场、地铁站和公交车站）张贴的海报中。它们可以保存 48 B – 4 KB 的数据。您可以对标签编程，以启动您的应用并打开特定的页面。&lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;u&gt;交换联系信息&lt;/u&gt;：只需点击设备进行连接即可交换联系信息，而不必再向您的好友拼读联系信息，也不必担心对方出现任何拼写错误。与以上类似，您可以通过编程方式将自己的信息写入 NFC 名片/标签；也可以通过应用直接交换信息。&lt;/li&gt;    &lt;li&gt;&lt;u&gt;播放您喜爱的音乐电台&lt;/u&gt;：无论您是在外工作、开车出游还是在家休息 – 使用 NFC 标签即可启动广播电台。您甚至可以在不同的标签上以编程方式写入不同的音乐电台；例如，一个标签用于健身房，一个用于休闲，一个用于睡眠。&lt;/li&gt;    &lt;li&gt;&lt;u&gt;在繁忙的餐厅订餐&lt;/u&gt;：在受欢迎的餐厅就餐时，仅为了订餐就可能需要花很长时间等待。而使用这种标签，只需在您的餐桌上点击标签就可以预订您的菜品。&lt;/li&gt;    &lt;li&gt;&lt;u&gt;与好友玩多人游戏：&lt;/u&gt;通过点击设备进行连接，您可以轻松连接多人游戏，与好友玩战舰、国际象棋或拼字游戏等。点击之后，此连接将持续保持，支持更大范围和更高吞吐量的带外传输（如蓝牙或 Wi-Fi Direct）。&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;到目前为止，我们对何时使用 NFC 有了相当不错的想法；现在对于娱乐内容而言 – 构建一个使用我们的 Windows 8 邻近感应 (NFC) API 的应用。&lt;/p&gt;  &lt;h2&gt;如何实施 NFC&lt;/h2&gt;  &lt;p&gt;您可以看到，使用 NFC，最终用户可以更加轻松地处理许多日常任务。我们以设置闹铃为例进行说明。我敢肯定，每个人都有多次这样的经历，他们将闹铃错设成早晨的其他时间。夜深人困时，您只想着尽快入睡，思维并非总是处于最活跃状态。使用 NFC 就轻松多了，您只需点击一个预设的标签，再确认一下，然后就可以安然入睡了。因此，为了帮助用户完成这个日常任务，让我们假设您编写了一个基本的闹铃应用，用户可以使用一个 NFC 标签设置闹铃。这分为两种情况&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;u&gt;&lt;b&gt;&lt;/b&gt;在标签上设置闹铃&lt;/u&gt;：NFC 标签可以重用，因此该应用应有一种方法供用户对闹铃编程。例如，用户可能希望编写不同的闹铃程序 – 一个用于工作日，另一个用于周末。这称为将数据发布到标签。&lt;/li&gt;    &lt;li&gt;&lt;u&gt;&lt;b&gt;&lt;/b&gt;从标签设置闹铃&lt;/u&gt;：在用户点击标签之后，该应用将启动以确认设置闹铃。这意味着可以使用上下文或参数启动该应用。&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;NFC API 支持使用多种方式达到同一目的，不过，我将介绍实现此场景的最简单的方法。&lt;/p&gt;  &lt;p&gt;下面我们了解在 NFC 标签上设置闹铃的过程：&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Mario 启动闹铃应用，并设置时间，假设为早晨 7:00。这是一个普通闹铃，与 NFC 尚无任何关系。&lt;/li&gt;    &lt;li&gt;Mario 选择一个选项“在 NFC 标签上设置闹铃”。这时，该应用将调用 NFC API 将信息发布到 NFC 无线通信装置，具体是一个应用标识字符串和 07:00。NFC 标签使用一个称为 NDEF（NFC 定义交换格式）的标准化消息格式。您的应用&lt;b&gt;&lt;/b&gt;无需担心是否可以将数据格式化为 NDEF 消息；Windows 会为您完成此任务！现在，用户可以点击 NFC 标签。&lt;/li&gt;    &lt;li&gt;Mario 对着 PC 点击该标签，应用确认正在对该标签编程。在点击标签之后，务必让用户知道您的应用已成功对标签编程。我们刚才谈到，点击您的 PC 对大多数人来说是一个新概念，因此通过确认可让用户相信他们刚才的操作已经奏效。该应用通过注册消息传输处理程序，知道该消息已成功传输。&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;NFC API 位于 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.proximity.aspx" target="_blank"&gt;Windows.Networking.Proximity&lt;/a&gt; 命名空间中。它们在第 2 步中使用 – 在用户选择选项“在 NFC 标签上设置闹铃”之后。首先，该应用初始化邻近感应对象。邻近感应对象用于检测是否有标签（或设备）处于感应范围以内/以外。接下来，我们将添加 DeviceArrival 事件处理程序。该处理程序识别何时点击了标签，这意味着我们可以开始向标签写入信息。让用户知道您正在向标签写入很有必要，以便他们此时不会将其移出感应范围。您可以使用相同事件来识别何时点击了任何邻近感应设备。&lt;/p&gt;  &lt;p&gt;下面的代码片段显示了如何初始化和添加 DeviceArrival 事件处理程序。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;div&gt;     &lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; proximityDevice;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; initializeProximityDevice() {&lt;br /&gt;    proximityDevice = Windows.Networking.Proximity.ProximityDevice.getDefault();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (proximityDevice) {&lt;br /&gt;        proximityDevice.addEventListener(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;devicearrived&amp;quot;&lt;/span&gt;, proximityDeviceArrived);&lt;br /&gt;       &lt;br /&gt;}&lt;br /&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt; {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// No NFC radio on the PC, display an error message&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; proximityDeviceArrived(device) {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// Let the user know we’re ‘Writing to Tag’&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;div&gt;
  &lt;br /&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; InitializeProximityDevice()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;Windows.Networking.Proximity.ProximityDevice proximityDevice;&lt;br /&gt;    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (proximityDevice != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;) {&lt;br /&gt;        proximityDevice.DeviceArrived += ProximityDeviceArrived;&lt;br /&gt;    &lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// No NFC radio on the PC, display an error message&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; ProximityDeviceArrived(Windows.Networking.Proximity.ProximityDevice device)&lt;br /&gt;{&lt;br /&gt;            &lt;span style="color: rgb(0, 128, 0);"&gt;// Let the user know we’re ‘Writing to Tag’&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;
  &lt;br /&gt;接下来，我们向该标签发布信息。该应用发布两项内容：一个应用标识字符串，其中包含一个应用 ID 和应用平台，以及启动参数。对于 Windows 8，应用 ID 是 &amp;lt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.applicationmodel.packageid.familyname.aspx" target="_blank"&gt;package family name&lt;/a&gt;&amp;gt;!&amp;lt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br211415.aspx" target="_blank"&gt;app Id&lt;/a&gt;&amp;gt;，应用平台是“Windows”。您必须从应用软件包清单中应用程序元素的 ID 属性中复制应用 ID 值。启动参数是“07:00”– 该闹铃由用户设置。我们将其称为“消息”。&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;如果该应用跨平台运行，可以通过 Windows 发布备选应用 ID 和应用平台；这意味着您可以在支持 NFC 的不同设备（如 Windows Phone 8）上点击相同的标签！您可以在 MSDN 上找到有关&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.proximity.peerfinder.alternateidentities.aspx" target="_blank"&gt;备选 ID&lt;/a&gt; 的更多信息。&lt;/p&gt;

&lt;p&gt;该应用使用名为 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh701134.aspx" target="_blank"&gt;publishBinaryMessage&lt;/a&gt; 的方法将数据发布到标签。此方法采用三个参数 – messageType、message 和一个 messageTransmittedHandler 函数。我们将 messageType 设置为“LaunchApp:WriteTag”，这可让 Windows 知道您的应用希望向 NFC 标签写入信息。message 就是我们刚才定义的消息（应用识别的字符串和启动参数）；我们需要在缓冲区中将此消息存储为二进制消息。messageTransmittedHandler 函数注册回调。这可让您的应用知道消息已成功写入标签。我们使用此方法告诉用户两个信息：我们已将消息成功写入标签，标签不再需要位于感应范围内。&lt;/p&gt;

&lt;p&gt;消息将持续发布，直到我们调用 StopPublishingMessage 函数或者释放 ProximityDevice 对象之后才结束。在本例中，我们将使用 stop 函数。PublishBinaryMessage 返回一个发布 ID；我们将使用这一发布 ID 停止向 NFC 无线通信装置发布消息。&lt;/p&gt;

&lt;p&gt;下面的代码片段显示了如何向 NFC 标签写入数据：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div&gt;
    &lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; proximityDevice;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; getAlarmTime(){&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;// Grab time set by the user, call this variable ‘Alarm’&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; Alarm;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; publishLaunchApp() {&lt;br /&gt;    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (proximityDevice) {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// The format of the app launch string is: &amp;quot;&amp;lt;args&amp;gt;\tWindows\t&amp;lt;AppName&amp;gt;&amp;quot;.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// The string is tab or null delimited.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// The &amp;lt;args&amp;gt; string can be an empty string (&amp;quot;&amp;quot;).&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; launchArgs = getAlarmTime();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// The format of the AppName is: PackageFamilyName!PRAID.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; praid = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;AlarmApp&amp;quot;&lt;/span&gt;; &lt;span style="color: rgb(0, 128, 0);"&gt;// The Application Id value from your package.appxmanifest.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; appName = Windows.ApplicationModel.Package.current.id.familyName + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;!&amp;quot;&lt;/span&gt; + praid;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; launchAppMessage = launchArgs + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;\tWindows\t&amp;quot;&lt;/span&gt; + appName;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; dataWriter = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Windows.Storage.Streams.DataWriter();&lt;br /&gt;        dataWriter.unicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.utf16LE;&lt;br /&gt;        dataWriter.writeString(launchAppMessage);&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; launchAppPubId =&lt;br /&gt;             proximityDevice.publishBinaryMessage(&lt;br /&gt;                 &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;LaunchApp:WriteTag&amp;quot;&lt;/span&gt;, &lt;br /&gt;                 dataWriter.detachBuffer(), &lt;br /&gt;                 proximityWriteTagLaunchAppMessageTransmitCallback);&lt;br /&gt;        &lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (launchAppPubId != -1) {&lt;br /&gt;            &lt;span style="color: rgb(0, 128, 0);"&gt;// Stop publishing the message on NFC radio&lt;/span&gt;&lt;br /&gt;        proximityDevice.stopPublishingMessage(launchAppPubId);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; proximityWriteTagLaunchAppMessageTransmitCallback() {&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;// Inform the user that: the message has been successfully written to a tag &amp;amp; the tag no longer needs to be in range&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;div&gt;
  &lt;br /&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;Windows.Networking.Proximity.ProximityDevice proximityDevice;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; GetAlarmTime(){&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;// Grab time set by the user, call this variable ‘Alarm’&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; Alarm;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; PublishLaunchApp()&lt;br /&gt;{&lt;br /&gt;    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (proximityDevice != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// The format of the app launch string is: &amp;quot;&amp;lt;args&amp;gt;\tWindows\t&amp;lt;AppName&amp;gt;&amp;quot;.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// The string is tab or null delimited.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// The &amp;lt;args&amp;gt; string can be an empty string (&amp;quot;&amp;quot;).&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; launchArgs = getAlarmTime();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// The format of the AppName is: PackageFamilyName!PRAID.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; praid = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;MyAppId&amp;quot;&lt;/span&gt;; &lt;span style="color: rgb(0, 128, 0);"&gt;// The Application Id value from your package.appxmanifest.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; appName = Windows.ApplicationModel.Package.Current.Id.FamilyName + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;!&amp;quot;&lt;/span&gt; + praid;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; launchAppMessage = launchArgs + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;\tWindows\t&amp;quot;&lt;/span&gt; + appName;&lt;br /&gt;&lt;br /&gt;        var dataWriter = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Windows.Storage.Streams.DataWriter();&lt;br /&gt;        dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;&lt;br /&gt;        dataWriter.WriteString(launchAppMessage);&lt;br /&gt;        var launchAppPubId =&lt;br /&gt;        proximityDevice.PublishBinaryMessage(&lt;br /&gt;            &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;LaunchApp:WriteTag&amp;quot;&lt;/span&gt;, dataWriter.DetachBuffer(), &lt;br /&gt;            proximityWriteTagLaunchAppMessageTransmitCallback);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (launchAppPubId!= -1)&lt;br /&gt;    {&lt;br /&gt;        proximityDevice.StopPublishingMessage(launchAppPubId);&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;// Stop publishing the message on NFC radio&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; proximityWriteTagLaunchAppMessageTransmitCallback(&lt;br /&gt;    Windows.Networking.Proximity.ProximityDevice sender,&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;long&lt;/span&gt; messageId)&lt;br /&gt;{&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// Inform the user that: the message has been successfully written to a tag &amp;amp; the tag no longer needs to be in range&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;br /&gt;就是这样！现在您已经知道如何从 Windows 应用商店应用向 NFC 标签写入信息。非常简单；因此，我们转到下一个场景 - &lt;b&gt;&lt;/b&gt;从标签设置闹铃。我们来看一下从 NFC 标签读取闹铃的过程：

&lt;ol&gt;
  &lt;li&gt;Mario 正在阅读他的主屏幕内容/写电子邮件/玩游戏/使用 Windows，他意识到需要为周一早上设置一个闹铃。他拿起“工作日闹铃”标签，然后对着自己的 PC 点击该标签。他获得一个 toast，邀请他启动您的闹铃应用。Windows 将照顾一切，直到这一刻为止；您的应用无需执行任何操作。&lt;/li&gt;

  &lt;li&gt;Mario 接受邀请，您的应用启动到“确认闹铃？”屏幕，时间为早晨 7:00。在 Mario 接受 toast 之后，Windows 在激活过程中将启动参数（与上述参数一样）传递到您的应用。这称为外部启动，这与将您的应用启动到特定页是一样的。&lt;/li&gt;

  &lt;li&gt;Mario 设置闹铃。这是一个普通闹铃，与 NFC 无关。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;从 NFC 标签获取启动参数非常容易。应用需要处理来自 NFC 标签的外部启动。外部启动与将您的应用启动到特定页同义。我们的启动参数指定一个早晨 7:00 的闹铃，您的应用使用它来显示一个建议的闹铃。此外，如果 PC 上未安装您的应用，Windows 将邀请 Mario 从 Windows 应用商店安装该应用 – 安装过程完全自动！&lt;/p&gt;

&lt;p&gt;以下代码片段显示了如何实现上下文启动。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div&gt;
    &lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;app.onactivated = &lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (args) {&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (args.detail.kind === activation.ActivationKind.launch) {&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (args.detail.arguments == &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Windows.Networking.Proximity.PeerFinder:StreamSocket&amp;quot;&lt;/span&gt;) {&lt;br /&gt;            &lt;span style="color: rgb(0, 128, 0);"&gt;//do nothing here.&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt; {&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;// Use args.detail.arguments to parse out ’07.00’ string, and display to the user&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        args.setPromise(WinJS.UI.processAll());&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;div&gt;
  &lt;br /&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;async &lt;span style="color: rgb(0, 0, 255);"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;override&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; OnLaunched(LaunchActivatedEventArgs args)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (args.Arguments == &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Windows.Networking.Proximity.PeerFinder:StreamSocket&amp;quot;&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                _isLaunchedByTap = &lt;span style="color: rgb(0, 0, 255);"&gt;true&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;// Use args.Arguments to parse out ’07.00’ string, and display to the user&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;            Window.Current.Activate();&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;
  &lt;br /&gt;这就是您的应用为支持读写 NFC 标签所需的全部操作；对于前沿场景而言相当简单。为了能够良好运行，在结束之前，让我们探讨一下错误处理问题。&lt;/p&gt;

&lt;h2&gt;错误处理&lt;/h2&gt;

&lt;p&gt;您的应用可能会遇到许多常见的错误。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;点击的标签不是 NDEF 格式。Windows 8 不支持将标签自动重新格式化为 NDEF，因此您需要下载并安装 NDEF 格式化程序。&lt;/li&gt;

  &lt;li&gt;点击的标签为只读模式。一些 NFC 标签可能被锁定为只读模式（类似于旧式 &lt;a href="http://zh.wikipedia.org/wiki/VHS" target="_blank"&gt;VHS 录像带&lt;/a&gt;）。&lt;/li&gt;

  &lt;li&gt;点击的标签容量太小，无法容纳所有数据。&lt;/li&gt;

  &lt;li&gt;用户的 PC 没有 NFC。我在开头已经提到，NFC 是一种新兴的技术；普通采用仍需时日。要检查 PC 是否支持邻近感应，请使用 ProximityDevice.getDefault() 方法；如果未安装 NFC 无线通信装置，该方法将返回 NULL。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;就这么有趣、直观！&lt;/h2&gt;

&lt;p&gt;NFC 终于到来了，它已经为主流消费者做好了准备 – Windows 有相应的生态体系和设计精良的端到端用户体验。该技术具有很大的潜力，可让应用和设备获得令人难以置信的交互式体验。就这么有趣、直观。&lt;/p&gt;

&lt;p&gt;NFC 是一个广阔的领域，因此，请继续关注有关其他超酷 Windows 8 NFC 开发人员体验的更多博文。&lt;/p&gt;

&lt;p&gt;有关 NFC 和邻近感应的更多信息，请参阅下面的资源。&lt;/p&gt;

&lt;h2&gt;资源&lt;/h2&gt;

&lt;div align="center"&gt;
  &lt;table class="b8table" cellspacing="0" cellpadding="3" width="298" align="center" border="0"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td valign="top" width="197"&gt;
          &lt;p&gt;&lt;strong&gt;链接&lt;/strong&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="99"&gt;
          &lt;p&gt;&lt;strong&gt;类型&lt;/strong&gt;&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="197"&gt;
          &lt;p align="left"&gt;&lt;u&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465215.aspx" target="_blank"&gt;邻近感应体验使用指南&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="99"&gt;
          &lt;p&gt;文档&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="197"&gt;
          &lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br241250.aspx" target="_blank"&gt;邻近感应 API&lt;/a&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="99"&gt;
          &lt;p&gt;文档&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="197"&gt;
          &lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh967765.aspx" target="_blank"&gt;测试邻近感应应用并排除故障&lt;/a&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="99"&gt;
          &lt;p&gt;文档&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="197"&gt;
          &lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465223.aspx" target="_blank"&gt;发布和订阅（详细说明）&lt;/a&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="99"&gt;
          &lt;p&gt;文档&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="197"&gt;
          &lt;p align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Proximity-Sample-88129731" target="_blank"&gt;邻近感应应用示例&lt;/a&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="99"&gt;
          &lt;p&gt;示例&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="197"&gt;
          &lt;p align="left"&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/zh-cn/category/windowsapps" target="_blank"&gt;遇到有关邻近感应的问题？请在这里询问&lt;/a&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="99"&gt;
          &lt;p&gt;论坛&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;谢谢！&lt;/p&gt;

&lt;p&gt;Priya Dandawate
  &lt;br /&gt;设备和网络项目经理&lt;/p&gt;

&lt;p&gt;投稿者：Max Morris、Marzena Makuta、Mike Loholt、Jake Sabulsky 和 Vishal Mhatre&lt;/p&gt;

&lt;!-- Title: “使用 NFC 开发前沿应用” Tags: “共享, NFC, 近场通信, 共享文件, 蓝牙配对, 共享数据” --&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10413815" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_7151AB4E8765F64E_/">共享文件</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_DD8459724D91F95B_/">蓝牙配对</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_7151AB4E_/">共享</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/NFC/">NFC</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_D18F3A571A90E14F_/">近场通信</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_7151AB4E70656E63_/">共享数据</category></item><item><title>创建连接的 Windows 应用商店应用 </title><link>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/04/17/windows-creating-connected-store-apps.aspx</link><pubDate>Wed, 17 Apr 2013 20:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10412039</guid><dc:creator>Windows 8 Team</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/windowsappdev_cn/rsscomments.aspx?WeblogPostID=10412039</wfw:commentRss><comments>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/04/17/windows-creating-connected-store-apps.aspx#comments</comments><description>&lt;div class="postcontent"&gt;
&lt;p&gt;当前，人们身边与网络连接的设备的数量不断增加。最新的冰箱和洗衣机甚至都能与 Internet 和家庭网络连接。因此，最终用户期待自己的应用也能实现网络连接也就不足为奇。这些&amp;ldquo;连接的应用&amp;rdquo;将使用来自 Web 的最新内容（社交媒体、数字媒体、博客以及其他类型的内容）。开发连接的应用已经实现了常态化，但是处理诸如网络连接断开、按流量计费的网络成本，或性能问题等常见问题仍让开发人员觉得力不从心。Windows 8 让编写连接的应用变得空前简单。&lt;/p&gt;
&lt;p&gt;在本篇博文中，我们将介绍一些有用的提示，这些提示有助于用户在使用您的 Windows 应用商店应用时获得快速而流畅、轻松、连接的体验：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为您的应用场景选择正确的 API&lt;/li&gt;
&lt;li&gt;选择正确的网络功能&lt;/li&gt;
&lt;li&gt;为按流量计费的网络调整应用行为&lt;/li&gt;
&lt;li&gt;应对网络状态变化&lt;/li&gt;
&lt;li&gt;缓存内容以提高流畅性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们来详细看看各条提示。&lt;/p&gt;
&lt;h2&gt;选择正确的 API&lt;/h2&gt;
&lt;p&gt;如果您打算建造一座房屋，那么您需要适当的工具。您需要锤子来钉钉子，需要拉锯来切割板子，还需要螺丝刀来拧紧螺丝钉。同样的，您在开发连接的 Windows 应用商店应用时也需要使用适当的网络连接 API。Windows 8 提供了大量网络连接 API，这些 API 可让您的应用通过 Internet 或专用网络与其他计算机和设备通信。因此，您的首个步骤是确定您的应用需要怎样的网络连接功能。&lt;/p&gt;
&lt;p&gt;最常见的网络连接应用场景是访问网站来检索或存储信息。使用网站来存储用户信息和游戏分数的游戏便是一个简单的例子。而更为复杂的示例可能是连接到一个基于 REST 的 Web 服务，并使用 Web 服务提供的库来访问或存储信息的应用。Windows 8 拥有多个与 Web 服务和网站连接的 API。借助这些 API，您的应用可访问支持 REST 或向 Web 服务器发送基本 HTTP 协议命令（如 GET 和 POST）的 Web 服务。对于 Web 访问，您所需要的 API 将取决于您开发应用所使用的语言：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh453379.aspx" target="_blank"&gt;XMLHTTPRequest&lt;/a&gt; 和 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br229787.aspx" target="_blank"&gt;WinJS.xhr&lt;/a&gt; - 使用 JavaScript 和 HTML 编写的应用。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.net.http.httpclient.aspx" target="_blank"&gt;HttpClient&lt;/a&gt; - 使用 C# 或 Visual Basic .NET 和 XAML 编写的应用。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh831163.aspx" target="_blank"&gt;XML HTTP Request 2&lt;/a&gt; (IXHR2) - 使用 C++ 和 XAML 编写的应用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下代码显示了如何执行一个基本请求，并响应基于 REST 的 Web 服务。在这一情形中，Web 服务将在 Web 服务器上执行一个 ASP.NET 脚本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; makeXHRCall() {&lt;br /&gt;    WinJS.xhr({ uri: &lt;span style="color: #006080;"&gt;"http://www.microsoft.com/en-us/default.aspx&amp;rdquo; }).done(&lt;br /&gt; function onComplete(result) {&lt;br /&gt; print(result.responseText);&lt;br /&gt; },&lt;br /&gt; function onError(err) {&lt;br /&gt; print("&lt;/span&gt;Error: " + err.responseText);&lt;br /&gt;        });&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; async &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; MakeHttpCall()&lt;br /&gt;{&lt;br /&gt;    HttpClient httpClient = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HttpClient();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; response = await httpClient.GetStringAsync(&lt;span style="color: #006080;"&gt;"http://www.microsoft.com/en-us/default.aspx"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (Exception) {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;// Handle exception.&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;欲了解有关 &lt;strong&gt;WinJS.xhr&lt;/strong&gt; 的更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh761502.aspx" target="_blank"&gt;连接到 Web 服务（使用 JavaScript 和 HTML 编写的 Windows 应用商店应用）&lt;/a&gt;。欲了解有关 &lt;strong&gt;HttpClient&lt;/strong&gt; 的更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh781239.aspx" target="_blank"&gt;快速入门：使用 HttpClient 连接（使用 C#/VB/C++ 和 XAML 编写的 Windows 应用商店应用）&lt;/a&gt;和 &lt;a href="http://code.msdn.microsoft.com/windowsapps/HttpClient-sample-55700664" target="_blank"&gt;HttpClient 示例&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;另一常见的网络连接应用场景是下载和上载文件，此时传输过程将持续一段时间。需要从 Web 服务上载或下载照片或相册的相机或照片库应用就是一个例子。这些内容的传输将持续较长时间，因此让用户等待传输完成将毫无意义。&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.backgroundtransfer.aspx" target="_blank"&gt;Windows.Networking.BackgroundTransfer&lt;/a&gt; API 具有文件下载和上载的功能，即使是在应用不再运行时，上载和下载仍可继续。应用将在其处于前端运行、且具有焦点内容时开始传输进程，即使其不再运行，Windows 8 随后也将在后台继续传输进程。&lt;/p&gt;
&lt;p&gt;另一更为特殊的应用场景是访问联合内容。&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.web.syndication.aspx" target="_blank"&gt;Windows.Web.Syndication&lt;/a&gt; API 可检索 RSS 中的源或 Atom 格式。此外，&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.web.atompub.aspx" target="_blank"&gt;Windows.Web.AtomPub&lt;/a&gt; API 可让应用以多种 AtomPub 格式发布数据。&lt;/p&gt;
&lt;p&gt;对于特定、高级别的网络连接协议无法通过 API 可用的应用场景，Windows 运行时还将支持 TCP 和 UDP 套接字（以及多播）。&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.sockets.aspx" target="_blank"&gt;Windows.Networking.Sockets&lt;/a&gt; API 将提供一个 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.sockets.streamsocket.aspx" target="_blank"&gt;StreamSocket&lt;/a&gt; (TCP) 和 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.sockets.datagramsocket.aspx" target="_blank"&gt;DatagramSocket&lt;/a&gt; (UDP)，从而可让您实施其他较高层的协议。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;Windows 8 中引入了一个名为 WebSocket&lt;em&gt;&lt;/em&gt; 的新型套接字。欲了解有关 WebSockets 及何时使用它们的更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh761442.aspx" target="_blank"&gt;与 WebSockets 连接&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;以下表格提供了更完整的受支持的网络连接功能列表，并提供了额外信息的链接。&lt;/p&gt;
&lt;div align="center"&gt;&amp;nbsp;
&lt;table class="b8table" border="0" cellspacing="0" cellpadding="3" align="center"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="217"&gt;
&lt;p align="center"&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="221"&gt;
&lt;p align="center"&gt;&lt;strong&gt;功能&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="145"&gt;
&lt;p align="center"&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="217"&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.web.syndication.aspx" target="_blank"&gt;Windows.Web.Syndication&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.web.atompub.aspx" target="_blank"&gt;Windows.Web.AtomPub&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="221"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;在 RSS 或跨多个版本的 Atom 格式中检索源。这些 API 可简化对诸如 OData 等较新格式实施支持的过程。Windows 运行时还将支持 Atom 发布协议，启用 Atom 集合的发布。 &lt;br /&gt;欲了解更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh452973.aspx/" target="_blank"&gt;访问和管理联合内容&lt;/a&gt;。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="145"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Syndication-sample-07ef6b0d" target="_blank"&gt;联合示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/AtomPub-sample-c1fcdc8e" target="_blank"&gt;AtomPub 示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;RSS 阅读器&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="217"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.backgroundtransfer.aspx" target="_blank"&gt;Windows.Networking.BackgroundTransfer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="221"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;进行不间断、成本感知和可恢复的内容下载和上载，即使是在调用应用并未位于后台的时候，仍可继续。此 API 可支持使用 HTTP、HTTPS 和 FTP 协议传输内容。 &lt;br /&gt;欲了解更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh452979.aspx" target="_blank"&gt;在后台传输数据&lt;/a&gt;。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="145"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Background-Transfer-Sample-d7833f61" target="_blank"&gt;后台传输示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;SkyDrive&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Xbox 视频&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="217"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh453379.aspx" target="_blank"&gt;XMLHTTPRequest&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt; (JavaScript&lt;/strong&gt;&lt;strong&gt;) &lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br229787.aspx" target="_blank"&gt;WinJS.xhr&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;(JavaScript)&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.net.http.httpclient.aspx" target="_blank"&gt;HttpClient&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;(C#)&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh831163.aspx"&gt;XML HTTP Request 2&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt; (IXHR2)&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;(C++)&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="221"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;与基于 REST 的 Web 服务和其他基于 HTTP 的协议交互。 &lt;br /&gt;欲了解更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh761502.aspx" target="_blank"&gt;连接到 Web 服务&lt;/a&gt;。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="145"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/XHR-handling-navigation-50d03a7a" target="_blank"&gt;XHR、处理导航错误和 URL 架构示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/HttpClient-sample-55700664" target="_blank"&gt;HttpClient 示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Bing 地图&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="217"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.proximity.aspx" target="_blank"&gt;Windows.Networking.Proximity&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="221"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;检测邻近的两台设备，之后应用将使用套接字 API 触发二者之间的网络通信。 &lt;br /&gt;欲了解更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465229.aspx" target="_blank"&gt;支持邻近感应和点击&lt;/a&gt;。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="145"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Proximity-Sample-88129731" target="_blank"&gt;邻近感应示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;游戏&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;协作式应用&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="217"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/library/windows/apps/BR207928" target="_blank"&gt;Windows.Storage.Pickers&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="221"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;与远程文件共享通信。 &lt;br /&gt;欲了解更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh464959.aspx" target="_blank"&gt;访问数据和文件&lt;/a&gt;。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="145"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/File-picker-sample-9f294cba" target="_blank"&gt;文件选取器示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Xbox 音乐&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;照片&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="217"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.sockets.aspx" target="_blank"&gt;Windows.Networking.Sockets&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="221"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;连接到使用上述 API 不支持的协议（如 SMTP、MAPI 或 telnet）的服务，或连接到其他同一本地网络的另一设备。还可用于需要类套接字语义（异步、双向）来通过 Web（包括 HTTP）连接到新服务的应用。 &lt;br /&gt;欲了解更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh452977.aspx" target="_blank"&gt;与套接字连接&lt;/a&gt;。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="145"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/StreamSocket-Sample-8c573931" target="_blank"&gt;StreamSocket 示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/DatagramSocket-sample-76a7d82b" target="_blank"&gt;DatagramSocket 示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Connecting-with-WebSockets-643b10ab" target="_blank"&gt;与 WebSockets 示例连接&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/site/search?query=controlchanneltrigger&amp;amp;f%5B0%5D.Value=controlchanneltrigger&amp;amp;f%5B0%5D.Type=SearchText&amp;amp;ac=3" target="_blank"&gt;ControlChannelTrigger 示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Lync、协作式白板或股票选择程序&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="217"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/library/windows/apps/BR241587" target="_blank"&gt;Windows.Storage.ApplicationData&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="221"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;Windows 8 实际上将在不同用户设备之间传输特定的应用数据。应用数据漫游对于应用大有益处，用户可不止使用一台设备，如工作使用的 PC 和在家里使用的平板电脑，并在多台设备上安装应用。 &lt;br /&gt;欲了解更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465094.aspx" target="_blank"&gt;漫游应用数据的指导原则&lt;/a&gt;。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="145"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://go.microsoft.com/fwlink/p/?linkid=231478" target="_blank"&gt;应用数据示例&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2&gt;选择正确的网络功能&lt;/h2&gt;
&lt;p&gt;网络隔离是 Windows 8 使用的应用安全模型中的一部分。Windows 将主动发现网络边界，并强制执行网络访问限制，以进行网络隔离。当您适当地部署了它们之后，这些功能将有助于保护您的用户和应用免遭恶意攻击。&lt;/p&gt;
&lt;p&gt;应用必须声明网络隔离功能，以定义网络访问的范围。如果没有声明这些功能，那么您的应用将无法访问网络资源。请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/Hh770532.aspx" target="_blank"&gt;如何使用网络功能&lt;/a&gt;来了解有关 Windows 如何为应用强制执行网络隔离的更多信息。&lt;/p&gt;
&lt;p&gt;请注意，您无法将网络连接作为 Windows 应用商店应用和同一设备中桌面应用之间的进程间通信机制。因此，您无法使用 Windows 应用商店应用中的 IP 环回地址。出于开发目的，存在有限的例外可允许用户在 Visual Studio 调试程序中操作时使用 IP 环回地址。欲了解更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/Hh780593.aspx" target="_blank"&gt;如何启用环回和排除网络隔离的故障&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;网络访问请求包含两个类型：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;客户端启动的出站请求&lt;/strong&gt;：您的应用可作为客户端，并通过向远程计算机（通常是一台服务器）发送一个初始网络请求来启动网络访问。应用将向服务器发送一个或多个请求，而服务器将返回一个或多个响应。例如，所有从 Web 客户端应用向 Web 服务器的流量就将是这种类型。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主动提供的入站请求&lt;/strong&gt;：您的应用将作为一台网络服务器，并侦听来自远程计算机的入站网络请求。远程计算机将通过向您的应用发送一个初始请求（其中您的应用将作为一台服务器），进而启动网络访问。远程计算机将向您的应用发送一个或多个请求，您的应用将向远程计算机返回一个或多个响应。例如，作为一台媒体服务器的应用就将是该类型。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;请遵循最低特权的原则，并仅添加您的应用需要的功能。您的应用可能仅需客户端启动的出站请求，或者可能需要接收主动提供的入站请求。某些应用在通过网络进行身份验证时，可能还需要访问用户凭据和证书。&lt;/p&gt;
&lt;p&gt;以下表格详细描述了网络隔离功能及连接的应用通常需要的其他相关功能。头三项功能是连接的应用将使用的主要网络隔离功能。事实上，您的应用必须启用这头三项功能中的至少一项。而表格中的其他条目是某些连接的应用经常需要的其他功能。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div align="center"&gt;
&lt;table class="b8table" style="width: 612px;" border="0" cellspacing="0" cellpadding="3" align="center"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="146"&gt;
&lt;p&gt;&lt;strong&gt;网络功能&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="273"&gt;
&lt;p&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="191"&gt;
&lt;p&gt;&lt;strong&gt;示例应用&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="146"&gt;
&lt;p align="left"&gt;Internet（客户端）&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="273"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;提供对 Internet 以及机场和咖啡厅等公共场所的网络的出站访问。需要访问 Internet 的大多数应用都应声明这一功能。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="191"&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;RSS 阅读器&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;社交网络&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;游戏&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="146"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;Internet（客户端和服务器）&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="273"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;提供对 Internet 以及机场和咖啡厅等公共场所的网络的入站和出站访问。对关键端口的入站访问将始终受阻。该功能是 Internet（客户端）功能的一个超集；因此没有必要声明二者。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="191"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;P2P 应用&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;使用多播来发现玩家的多玩家游戏&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="146"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;专用网络（客户端和服务器）&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="273"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;在用户信任的私人位置提供入站和出站网络访问。这些通常是家庭或工作网络。对关键端口的入站访问将始终受阻。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="191"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;访问网络连接存储 (NAS) 内容的应用&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;业务线应用&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;通过在专用（家庭或工作）网络中使用多播来发现玩家的多玩家游戏&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="146"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;临近感应&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="273"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;需要与设备进行近场邻近通信。允许应用访问网络来连接到附近设备，需要用户同意发送或接受邀请。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="191"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;邻近用户的多玩家游戏&lt;em&gt;&lt;/em&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="146"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;企业身份验证&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="273"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;提供连接到需要域凭据的企业 Intranet 资源的功能。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="191"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;业务线应用&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="146"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;共享用户证书&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="273"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;提供访问软件和硬件证书（如智能卡证书）来验证用户身份的功能。当相关的 API 在运行时被调用时，用户必须采取措施（如插入卡片或选择证书）。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="191"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;虚拟专用网络应用&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;业务线应用&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;使用此检查列表来确保您的应用中已配置网络隔离：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确定您的应用所需的网络访问方向；客户端启动的出站请求，主动提供的入站请求，抑或二者。&lt;/li&gt;
&lt;li&gt;确定您的应用将通信的网络资源的类型：家庭网络或工作网络中的受信任资源，Internet 中的资源，抑或二者。&lt;/li&gt;
&lt;li&gt;在应用部件清单 (manifest) 中配置最低所需网络隔离功能。您可使用 Microsoft Visual Studio 2012 中的&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br230259.aspx" target="_blank"&gt;应用程序清单设计器&lt;/a&gt;来进行这一操作，或&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br211477.aspx" target="_blank"&gt;手动添加这些功能&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;使用用于故障排除的网络隔离工具来部署和运行您的应用，进而测试您的应用。欲了解更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/Hh780593.aspx" target="_blank"&gt;如何启用环回和排除网络隔离的故障&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下屏幕显示了如何使用 Microsoft Visual Studio 2012 中的&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br230259.aspx" target="_blank"&gt;应用程序清单设计器&lt;/a&gt;来启用网络功能。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/7268.app_2D00_manifest_2D00_design_5F00_47107BBF.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="在 Visual Studio 2012 中选择您应用的 package.appxmanifest 内的网络功能" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/7752.app_2D00_manifest_2D00_design_5F00_thumb_5F00_5EC7B325.png" alt="在 Visual Studio 2012 中选择您应用的 package.appxmanifest 内的网络功能" width="600" height="318" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;在 Visual Studio 2012 中选择您应用的 package.appxmanifest 内的网络功能&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;为按流量计费的网络调整应用行为&lt;/h2&gt;
&lt;p&gt;想想您上次接近每月数据限额或出国旅行的情形。在这些情形中，我通常将非常小心的使用设备和应用，以避免不必要的网络费用。&lt;/p&gt;
&lt;p&gt;Windows 8 通过让应用监控可用网络资源，并在按流量计费的网络中进行相应的操作，进而解决了用户的这一问题。为了增强用户对您的应用的信心，您可让应用在连接可能产生成本的时候告知用户，并调整应用行为以避免或减少费用。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.aspx" target="_blank"&gt;Windows.Networking.Connectivity&lt;/a&gt; API 提供了网络连接的类型和成本的信息。这可让您的应用确定何时正常使用网络资源，何时保守使用网络资源，抑或何时先询问用户再使用网络资源。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectionprofile.aspx" target="_blank"&gt;ConnectionProfile&lt;/a&gt; 代表了一个网络连接。您的应用可使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectionprofile.aspx" target="_blank"&gt;ConnectionProfile&lt;/a&gt; 的 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.aspx" target="_blank"&gt;ConnectionCost&lt;/a&gt; 来确定是否调整其行为。&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank"&gt;NetworkCostType&lt;/a&gt; 属性可显示网络连接的类型。总共包含四种可能的值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unrestricted&lt;/strong&gt; - 网络连接使用不受限制。此类网络连接无使用费和容量限制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixed&lt;/strong&gt; - 在特定限值以下此类网络连接的使用将不受限制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variable&lt;/strong&gt; - 此类网络连接的使用将以每字节为基础计费。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unknown&lt;/strong&gt; - 此类网络连接的成本信息不可知。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.aspx" target="_blank"&gt;ConnectionCost&lt;/a&gt; 的数个其他布尔属性仍可提供更多信息。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.roaming.aspx" target="_blank"&gt;Roaming&lt;/a&gt; - 该连接面向家庭提供程序以外的网络。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.approachingdatalimit.aspx" target="_blank"&gt;ApproachingDataLimit&lt;/a&gt; - 该连接接近数据计划指定的使用允许时间。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.overdatalimit.aspx" target="_blank"&gt;OverDataLimit&lt;/a&gt; - 该连接已经超过了数据计划指定的使用允许时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;让您的应用响应这些属性指示的条件。当连接为 &lt;strong&gt;Roaming&lt;/strong&gt; 时，与网络使用相关的数据成本将非常高。当 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank"&gt;NetworkCostType&lt;/a&gt; 为 &lt;strong&gt;Variable&lt;/strong&gt; 时，网络将是一个按流量计费的网络，用户将根据其在网络中发送或接收的数据量付费。当 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank"&gt;NetworkCostType&lt;/a&gt; 为 &lt;strong&gt;Fixed&lt;/strong&gt; 时，如果用户已经超过或接近数据极限时，则将产生问题。&lt;/p&gt;
&lt;p&gt;借助这些信息，应用可遵循这些指导原则来确定如何最佳使用网络资源。&lt;/p&gt;
&lt;div align="center"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;table class="b8table" border="0" cellspacing="0" cellpadding="3" align="center"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="97"&gt;
&lt;p&gt;&lt;strong&gt;行为&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="150"&gt;
&lt;p&gt;&lt;strong&gt;连接断开&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="168"&gt;
&lt;p&gt;&lt;strong&gt;应用指导原则&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="175"&gt;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="97"&gt;
&lt;p align="left"&gt;正常&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="150"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank"&gt;NetworkCostType&lt;/a&gt; 为 &lt;strong&gt;Unrestricted&lt;/strong&gt; 或 &lt;strong&gt;Unknown&lt;/strong&gt;，而 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.aspx" target="_blank"&gt;ConnectionCost&lt;/a&gt; 不是 &lt;strong&gt;Roaming&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="168"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;应用将不会实施限制。应用认为连接成本&amp;ldquo;不受限制&amp;rdquo;，而且不受使用费和容量的限制。&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="175"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;媒体播放机应用可播放整个高清电影。&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;应用可在不受任何限制或发出提示的情况下下载大型文件。&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="97"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;保守&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="150"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank"&gt;NetworkCostType&lt;/a&gt; 为 &lt;strong&gt;Fixed&lt;/strong&gt; 或 &lt;strong&gt;Variable&lt;/strong&gt;，而 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.aspx" target="_blank"&gt;ConnectionCost&lt;/a&gt; 不是 &lt;strong&gt;Roaming&lt;/strong&gt; 或 &lt;strong&gt;OverDataLimit&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="168"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;应用将实施限制来优化网络使用，进而处理按流量计费网络中的操作。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="175"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;媒体播放机应用能以较低的分辨率播放电影。&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;应用可延迟非关键下载。&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="97"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;选择加入&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="150"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.aspx" target="_blank"&gt;ConnectionCost&lt;/a&gt; 是 &lt;strong&gt;Roaming&lt;/strong&gt; 或 &lt;strong&gt;OverDataLimit&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="168"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;应用将处理网络访问成本远高于计划成本的特殊情况。&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="175"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;应用提示用户访问网络。&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;应用挂起所有后台数据网络活动。&lt;em&gt;&lt;/em&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;该代码示例检查了连接成本，并返回恰当应用行为的建议。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; CostGuidance = { Normal: 0, Conservative: 1, OptIn: 2 };&lt;br /&gt;&lt;span style="color: #008000;"&gt;// GetCostGuidance returns an object with a Cost (with value of CostGuidance), &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;// CostName (a string) and Reason, which says why the cost is what it is.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; GetCostGuidance() &lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; connectionCost = Windows.Networking.Connectivity.NetworkInformation.getInternetConnectionProfile().getConnectionCost();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; networkCostConstants = Windows.Networking.Connectivity.NetworkCostType;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; Retval = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Object();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (connectionCost.roaming || connectionCost.overDataLimit)&lt;br /&gt;    {&lt;br /&gt;        Retval.Cost = CostGuidance.OptIn;&lt;br /&gt;        Retval.CostName = &lt;span style="color: #006080;"&gt;"OptIn"&lt;/span&gt;;&lt;br /&gt;        Retval.Reason = connectionCost.roaming&lt;br /&gt;            ? &lt;span style="color: #006080;"&gt;"Connection is roaming; using the connection may result in additional charge."&lt;/span&gt;&lt;br /&gt;            : &lt;span style="color: #006080;"&gt;"Connection has exceeded the usage cap limit."&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (connectionCost.networkCostType == networkCostConstants.&lt;span style="color: #0000ff;"&gt;fixed&lt;/span&gt;&lt;br /&gt;        || connectionCost.networkCostType == networkCostConstants.variable)&lt;br /&gt;    {&lt;br /&gt;        Retval.Cost = CostGuidance.conservative;&lt;br /&gt;        Retval.CostName = &lt;span style="color: #006080;"&gt;"Conservative"&lt;/span&gt;;&lt;br /&gt;        Retval.Reason = connectionCost.networkCostType == NetworkCostType.&lt;span style="color: #0000ff;"&gt;fixed&lt;/span&gt;&lt;br /&gt;            ? &lt;span style="color: #006080;"&gt;"Connection has limited allowed usage."&lt;/span&gt;&lt;br /&gt;            : &lt;span style="color: #006080;"&gt;"Connection is charged based on usage. "&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        Retval.Cost = CostGuidance.Normal;&lt;br /&gt;        Retval.CostName = &lt;span style="color: #006080;"&gt;"Normal"&lt;/span&gt;;&lt;br /&gt;        Retval.Reason = connectionCost.networkCostType == networkCostConstants.unknown&lt;br /&gt;            ? &lt;span style="color: #006080;"&gt;"Connection is unknown."&lt;/span&gt;&lt;br /&gt;            : &lt;span style="color: #006080;"&gt;"Connection cost is unrestricted."&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Retval;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;enum&lt;/span&gt; NetworkCost { Normal, Conservative, OptIn };&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; CostGuidance&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; CostGuidance()&lt;br /&gt;    {&lt;br /&gt;        var connectionCost = NetworkInformation.GetInternetConnectionProfile().GetConnectionCost();&lt;br /&gt;        Init(connectionCost);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; NetworkCost Cost { get; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; set; }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; String Reason { get; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Init(ConnectionCost connectionCost)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (connectionCost == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (connectionCost.Roaming || connectionCost.OverDataLimit)&lt;br /&gt;        {&lt;br /&gt;            Cost = NetworkCost.OptIn;&lt;br /&gt;            Reason = connectionCost.Roaming&lt;br /&gt;                ? &lt;span style="color: #006080;"&gt;"Connection is roaming; using the connection may result in additional charge."&lt;/span&gt;&lt;br /&gt;                : &lt;span style="color: #006080;"&gt;"Connection has exceeded the usage cap limit."&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (connectionCost.NetworkCostType == NetworkCostType.Fixed&lt;br /&gt;            || connectionCost.NetworkCostType == NetworkCostType.Variable)&lt;br /&gt;        {&lt;br /&gt;            Cost = NetworkCost.Conservative;&lt;br /&gt;            Reason = connectionCost.NetworkCostType == NetworkCostType.Fixed&lt;br /&gt;                ? &lt;span style="color: #006080;"&gt;"Connection has limited allowed usage."&lt;/span&gt;&lt;br /&gt;                : &lt;span style="color: #006080;"&gt;"Connection is charged based on usage. "&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            Cost = NetworkCost.Normal;&lt;br /&gt;            Reason = connectionCost.NetworkCostType == NetworkCostType.Unknown&lt;br /&gt;                ? &lt;span style="color: #006080;"&gt;"Connection is unknown."&lt;/span&gt;&lt;br /&gt;                : &lt;span style="color: #006080;"&gt;"Connection cost is unrestricted."&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;请使用&lt;a href="http://code.msdn.microsoft.com/windowsapps/Network-Information-Sample-63aaa201" target="_blank"&gt;网络信息示例&lt;/a&gt;来了解有关如何为按流量计费的网络调整应用行为的更多信息。&lt;/p&gt;
&lt;p&gt;用户也可运行&amp;ldquo;任务管理器&amp;rdquo;来查看每个应用消耗的网络数据量。此屏幕截图显示了一个示例。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5618.task_2D00_manager_5F00_6C99F920.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="&amp;ldquo;任务管理器&amp;rdquo;中的&amp;ldquo;应用历史记录&amp;rdquo;选项卡可让用户按应用查看 CPU 和网络消耗情况" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3554.task_2D00_manager_5F00_thumb_5F00_4C7EEC63.png" alt="&amp;ldquo;任务管理器&amp;rdquo;中的&amp;ldquo;应用历史记录&amp;rdquo;选项卡可让用户按应用查看 CPU 和网络消耗情况" width="600" height="545" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;&amp;ldquo;任务管理器&amp;rdquo;中的&amp;ldquo;应用历史记录&amp;rdquo;选项卡可让用户按应用查看 CPU 和网络消耗情况&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;应对网络状态变化&lt;/h2&gt;
&lt;p&gt;在任何移动设备应用场景中，用户都可随意连接网络。移动 3G 或 4G 宽带网络可覆盖用户的家中或车库，只要 Wi-Fi 仍然可用。类似地，Wi-Fi 也可在用户离开家中时进行覆盖。当然有时候网络也不可用。由于 Wi-Fi 和移动宽带网络覆盖面不断扩张，这样的网络变化可能经常出现。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.networkinformation.networkstatuschanged" target="_blank"&gt;NetworkStatusChanged&lt;/a&gt; 表明&amp;ldquo;可用成本&amp;rdquo;或&amp;ldquo;连接选项&amp;rdquo;可能发生变化。&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;为了应对网络状态的变化，并在状态变化时为用户提供一个无缝的体验，请让您的连接应用遵循这些应用场景指导原则。&lt;/p&gt;
&lt;h3&gt;错误导致的连接断开&lt;/h3&gt;
&lt;p&gt;在大多数情况下，您只需重试网络操作即可重新建立连接。如果失败，则等待 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.networkinformation.networkstatuschanged" target="_blank"&gt;NetworkStatusChanged&lt;/a&gt; 事件。我们建议为应用设置不断增加的重试间隔回退，从 50 毫秒的间隔开始，如果连接仍然失败，则成倍提高此回退间隔。&lt;/p&gt;
&lt;h3&gt;网络断开&lt;/h3&gt;
&lt;p&gt;请告知用户连接已断开，然后注册并等待 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.networkinformation.networkstatuschanged" target="_blank"&gt;NetworkStatusChanged&lt;/a&gt; 事件。&lt;/p&gt;
&lt;h3&gt;新网络可用性&lt;/h3&gt;
&lt;p&gt;有些情况中设备可能与多个网络连接。例如，用户可能连接了移动宽带，在到家之前使用 Windows 8 消息应用与好友聊天，也可能连接到了不受限制的网络。Windows 8 中的默认策略是首选不受限制的网络，而非流量计费的网络，首选较快的网络，而非较慢的网络。然而，应用确立的现有连接并不会自动切换到新的网络。由于只有应用才能做出是否切换到新网络的最佳决策，因此必须应用必须参与网络选择确定过程。&lt;/p&gt;
&lt;p&gt;例如，如果一个视频流接近结束，那么切换到新网络可能毫无意义。然而，如果当前网络正在删除数据包，或者网络速度过慢，抑或该流需要额外的时间才能完成，那么切换到新网络可能是最佳方案。&lt;/p&gt;
&lt;p&gt;如果您确定可为您的应用使用情形切换网络，那么请在检测新网络时遵循这些指导原则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;检查现有网络和新网络的网络成本。如果切换到新网络有意义，那么请根据我刚刚提到的指导原则尝试建立新的网络连接，并重试网络操作。Windows 将在网络可用的情况下，自动选择不受限制的网络，而非按流量计费的网络，以及选择较快的网络，而非较慢的网络。&lt;/li&gt;
&lt;li&gt;如果新网络连接成功建立，那么请在您的应用中使用新的网络连接，并在连接已经存在的情况下，在原来网络中取消原始网络操作。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;网络成本的变化&lt;/h3&gt;
&lt;p&gt;当 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank"&gt;NetworkCostType&lt;/a&gt; 为 &lt;strong&gt;Fixed&lt;/strong&gt;，且使用量接近数据极限或超过数据极限时，网络成本将发生变化。如果 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank"&gt;NetworkCostType&lt;/a&gt; 成为 &lt;strong&gt;Variable&lt;/strong&gt;，或如果 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.connectioncost.roaming.aspx" target="_blank"&gt;Roaming&lt;/a&gt; 变为&amp;ldquo;true&amp;rdquo;时，网络成本也可能发生变化。在这些情况中，请根据此前提示中的指导原则调整应用行为。&lt;/p&gt;
&lt;p&gt;这些代码示例将使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.networkinformation.networkstatuschanged" target="_blank"&gt;NetworkStatusChanged&lt;/a&gt; 事件来在网络状态发生多次变化时为用户提供一个无缝的应用体验。两个示例均使用了一个名为 registeredNetworkStatusNotification&lt;em&gt;&lt;/em&gt; 的全局布尔变量，且其值最初均设为&amp;ldquo;false&amp;rdquo;。&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"&gt;&lt;span style="color: #008000;"&gt;// Register for NetworkStatusChanged notifications, and display new &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;// Internet ConnectionProfile info upon network status change.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; registerForNetworkStatusChange() {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;// Register for network status change notifications.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!registeredNetworkStatusNotification) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; networkInfo.addEventListener(&lt;span style="color: #006080;"&gt;"networkstatuschanged"&lt;/span&gt;, onNetworkStatusChange);&lt;br /&gt;            registeredNetworkStatusNotification = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (e) {&lt;br /&gt;        print(&lt;span style="color: #006080;"&gt;"An unexpected exception occurred: "&lt;/span&gt; + e.name + &lt;span style="color: #006080;"&gt;": "&lt;/span&gt; + e.message);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;// Event handler for NetworkStatusChanged event&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; onNetworkStatusChange(sender) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;// Get the ConnectionProfile that is currently used to connect &lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;// to the Internet.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; internetProfile = networkInfo.getInternetConnectionProfile();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (internetProfile === &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) {&lt;br /&gt;            print(&lt;span style="color: #006080;"&gt;"Not connected to Internet\n\r"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;            internetProfileInfo += getConnectionProfileInfo(internetProfile) + &lt;span style="color: #006080;"&gt;"\n\r"&lt;/span&gt;;&lt;br /&gt;            print(internetProfileInfo);&lt;br /&gt;        }&lt;br /&gt;        internetProfileInfo = &lt;span style="color: #006080;"&gt;""&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (e) {&lt;br /&gt;        print(&lt;span style="color: #006080;"&gt;"An unexpected exception occurred: "&lt;/span&gt; + e.name + &lt;span style="color: #006080;"&gt;": "&lt;/span&gt; + e.message);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"&gt;&lt;span style="color: #008000;"&gt;// Register for NetworkStatusChanged notifications, and display new &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;// Internet ConnectionProfile info upon network status change.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; NetworkStatusChange()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;// Register for network status change notifications.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        var networkStatusCallback = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; NetworkStatusChangedEventHandler(OnNetworkStatusChange);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!registeredNetworkStatusNotification)&lt;br /&gt;        {&lt;br /&gt;            NetworkInformation.NetworkStatusChanged += networkStatusCallback;&lt;br /&gt;            registeredNetworkStatusNotification = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;    {&lt;br /&gt;        rootPage.NotifyUser(&lt;span style="color: #006080;"&gt;"Unexpected exception occurred: "&lt;/span&gt; + ex.ToString(), NotifyType.ErrorMessage);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;// Event handler for NetworkStatusChanged event&lt;/span&gt;&lt;br /&gt;async &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnNetworkStatusChange(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; sender)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;// Get the ConnectionProfile that is currently used to connect &lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;// to the Internet &lt;/span&gt;&lt;br /&gt;        ConnectionProfile InternetConnectionProfile = NetworkInformation.GetInternetConnectionProfile();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (InternetConnectionProfile == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            await _cd.RunAsync(CoreDispatcherPriority.Normal, () =&amp;gt;&lt;br /&gt;            {&lt;br /&gt;                rootPage.NotifyUser(&lt;span style="color: #006080;"&gt;"Not connected to Internet\n"&lt;/span&gt;, NotifyType.StatusMessage);&lt;br /&gt;            });&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            connectionProfileInfo = GetConnectionProfile(InternetConnectionProfile);&lt;br /&gt;            await _cd.RunAsync(CoreDispatcherPriority.Normal, () =&amp;gt;&lt;br /&gt;            {&lt;br /&gt;                rootPage.NotifyUser(connectionProfileInfo, NotifyType.StatusMessage);&lt;br /&gt;            });&lt;br /&gt;        }&lt;br /&gt;        internetProfileInfo = &lt;span style="color: #006080;"&gt;""&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;    {&lt;br /&gt;        rootPage.NotifyUser(&lt;span style="color: #006080;"&gt;"Unexpected exception occurred: "&lt;/span&gt; + ex.ToString(), NotifyType.ErrorMessage);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;欲了解有关 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.connectivity.networkinformation.networkstatuschanged" target="_blank"&gt;NetworkStatusChanged&lt;/a&gt; 事件的更多信息，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh700376.aspx" target="_blank"&gt;快速入门：管理连接事件和可用性变更&lt;/a&gt;以及&lt;a href="http://code.msdn.microsoft.com/windowsapps/Network-Information-Sample-63aaa201" target="_blank"&gt;网络信息示例&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;缓存内容以提高流畅性&lt;/h2&gt;
&lt;p&gt;将内容缓存到磁盘可让您的应用快速、流畅地运行。例如，一个 RSS 源阅读器应用可立即显示从此前会话缓存到磁盘中的源。当最新源可用时，应用将更新其内容。缓存可确保用户在启动应用时立即读取内容，同时应用也可获得新内容。&lt;/p&gt;
&lt;p&gt;Windows 8 在 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.storage.aspx" target="_blank"&gt;Windows.Storage&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; 命名空间中提供了一个 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.storage.applicationdata.aspx" target="_blank"&gt;ApplicationData&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; 类。该类提供了对应用数据存储的访问权限。此数据存储包含设备本地的文件和设置、可在多台设备间漫游的文件和设置，抑或是临时文件和设置。&lt;/p&gt;
&lt;p&gt;文件是存储大型数据集、数据库或常见文件格式数据的理想介质。文件可存放于漫游、本地或临时文件夹中。以下内容解释了其含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;漫游文件将在用户使用连接的帐户登录的多台计算机和设备间同步。系统并不会立即漫游文件，而是将权衡数个因素后再确定何时发送数据。请确保数据漫游的使用量低于配额（您可通过 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.storage.applicationdata.roamingstoragequota.aspx" target="_blank"&gt;RoamingStorageQuota&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; 属性查看配额）；如果使用量超过配额，则数据漫游将被挂起。系统可在应用向文件写入数据时漫游文件，因此当系统不再需要应用的文件对象时，请务必关闭它们。&lt;/li&gt;
&lt;li&gt;本地文件将不会在多台计算机间同步。它们将保留于被原始写入的计算机上。&lt;/li&gt;
&lt;li&gt;临时文件有可能在系统不使用时被删除。系统将在确定何时及是否删除临时文件时考虑诸如可用磁盘容量和文件年限等因素。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些代码示例可将内容缓存到磁盘中。缓存服务器响应可让您的应用在终止或重新启动后立即向用户显示内容。为简单起见，这些示例并没有向您显示如何向应用数据存储写入设置，以及如何响应漫游数据。&lt;a href="http://code.msdn.microsoft.com/windowsapps/ApplicationData-sample-fb043eb2" target="_blank"&gt;应用数据示例&lt;/a&gt;将介绍这些详细内容。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; roamingFolder = Windows.Storage.ApplicationData.current.roamingFolder;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; filename = &lt;span style="color: #006080;"&gt;"serverResponse.txt"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; cacheResponse(strResponse) {&lt;br /&gt;    roamingFolder.createFileAsync(filename, Windows.Storage.CreationCollisionOption.replaceExisting)&lt;br /&gt;        .done(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (file) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Windows.Storage.FileIO.writeTextAsync(file, strResponse);&lt;br /&gt;        });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; getCachedResponse() {&lt;br /&gt;    roamingFolder.getFileAsync(filename)&lt;br /&gt;        .then(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (file) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Windows.Storage.FileIO.readTextAsync(file);&lt;br /&gt;        }).done(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (response) {&lt;br /&gt;            print(response);&lt;br /&gt;        }, &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; () {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;// getFileAsync or readTextAsync failed. &lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;// No cached response.&lt;/span&gt;&lt;br /&gt;        });&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"&gt;MainPage rootPage = MainPage.Current;&lt;br /&gt;StorageFolder roamingFolder = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; filename = &lt;span style="color: #006080;"&gt;"serverResponse.txt"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;async &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; cacheResponse(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; strResponse)&lt;br /&gt;{&lt;br /&gt;    StorageFile file = await roamingFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);&lt;br /&gt;    await FileIO.WriteTextAsync(file, strResponse);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;async &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; getCachedResponse()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        StorageFile file = await roamingFolder.GetFileAsync(filename);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; response = await FileIO.ReadTextAsync(file);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (Exception)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;// getFileAsync or readTextAsync failed.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;// No cached response.&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;欲了解有关应用数据存储的更多信息，请参阅&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/07/25/roaming.aspx" target="_blank"&gt;漫游您的应用数据&lt;/a&gt;博文，并试用&lt;a href="http://code.msdn.microsoft.com/windowsapps/ApplicationData-sample-fb043eb2" target="_blank"&gt;应用数据示例&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;为了给您的用户提供一个卓越、轻松、连接的应用使用体验，请在规划 Windows 应用商店应用时遵循本文中介绍的指导原则。这些提示能够简化您的开发过程，同时确保用户体验的流畅性，并提高用户对您的应用的满意度。&lt;/p&gt;
&lt;p&gt;- Windows 二级项目经理 Suhail Khalid&lt;/p&gt;
&lt;p&gt;投稿者：Steven Baker 和 Peter Smith&lt;/p&gt;
&lt;!-- Title: “创建连接的 Windows 应用商店应用” Tags: “Windows 应用商店应用, HttpClient, 连接的应用, XMLHTTPRequest, IXHR2, XML HTTP Request 2, WinJS.xhr” --&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10412039" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+_945E28754655975E945E2875_/">Windows 应用商店应用</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/HttpClient/">HttpClient</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/XMLHTTPRequest/">XMLHTTPRequest</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/IXHR2/">IXHR2</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/XML+HTTP+Request+2/">XML HTTP Request 2</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_DE8FA5638476945E2875_/">连接的应用</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/WinJS-xhr/">WinJS.xhr</category></item><item><title>立即注册参加 //build/ 2013 大会！</title><link>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/04/08/build-2013.aspx</link><pubDate>Mon, 08 Apr 2013 21:27:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10409475</guid><dc:creator>Windows 8 Team</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/windowsappdev_cn/rsscomments.aspx?WeblogPostID=10409475</wfw:commentRss><comments>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/04/08/build-2013.aspx#comments</comments><description>&lt;div class="PostContent"&gt;&lt;p&gt;上周，Steve Guggenheimer &lt;a href="http://blogs.technet.com/b/microsoft_blog/archive/2013/03/26/announcing-build-2013.aspx" target="_blank"&gt;宣布&lt;/a&gt;了 //build/ 2013 大会召开的消息。该大会将于 2013 年 6 月 26 日至 28 日在旧金山莫斯康展览中心举行。//build/ 大会是大家深入了解 Windows 应用商店应用开发的绝好机会。该大会将为您提供优秀的演示文稿、演示和信息研讨会等内容。我们工程团队的许多成员将亲临旧金山，为您主持这些演示并回答您的问题。这是您了解有关 Windows 应用商店应用开发的最新、最有价值信息的绝好机会。&lt;/p&gt;  &lt;p&gt;即日起（4 月 2 日，星期二）开放注册。&lt;sup&gt;&lt;/sup&gt;请访问 &lt;a href="http://www.buildwindows.com" target="_blank"&gt;www.buildwindows.com&lt;/a&gt; 了解有关大会和注册的详细信息。&lt;/p&gt;  &lt;p&gt;热切期待您的光临！&lt;/p&gt; &lt;!-- Title: “立即注册参加 //build/ 2013 大会！” Tags: “build” --&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10409475" width="1" height="1"&gt;</description></item><item><title>jQuery version 2.0 中对 Windows 应用商店应用的支持</title><link>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/04/04/jquery-version-2-0-windows.aspx</link><pubDate>Thu, 04 Apr 2013 18:36:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10407660</guid><dc:creator>Windows 8 Team</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/windowsappdev_cn/rsscomments.aspx?WeblogPostID=10407660</wfw:commentRss><comments>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/04/04/jquery-version-2-0-windows.aspx#comments</comments><description>&lt;div class="PostContent"&gt; &lt;p&gt;如果您已经完成一些 Web 开发项目，那么您可能已经使用过开源 JavaScript 框架 jQuery。如果您尝试过使用 jQuery 构建 Windows 应用商店应用，则可能会遇到过与 JavaScript 运行时或动态内容相关的错误。在即将发布的 2.0 版中，jQuery 团队已经解决了这些问题。jQuery 2.0 测试版现在支持使用 HTML5/JS 开发 Windows 应用商店应用。作为 Web 开发者，您可以利用现有技术和资产为 Windows 8 构建卓越的应用。您可以&lt;a href="http://jquery.com/download/" target="_blank"&gt;立即试用最新的 jQuery 2.0 内部测试版&lt;/a&gt;。&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;“jQuery 团队对能够使用 jQuery 2.0 的新环境感到非常兴奋。HTML 和 JavaScript 开发者希望利用他们的 jQuery 知识在任何工作地点优化他们的开发流程。jQuery 2.0 为他们提供了在 Windows 8 应用商店应用这样的环境中实现此愿望的能力。”&lt;i&gt;&lt;/i&gt; - &lt;a href="https://twitter.com/davemethvin" target="_blank"&gt;Dave Methvin&lt;/a&gt;，jQuery Foundation 总裁&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;h2&gt;Windows 应用商店应用：一个面向 JavaScript 代码的不同环境&lt;/h2&gt;  &lt;p&gt;您可能想知道 jQuery 以前为何“无法使用”。所有 Windows 应用商店应用，无论使用 HTML/JS���C# 还是 C++ 编写，都可以本机访问 Windows 运行时，因此创建了一个新的安全模型，以帮助您的应用在新平台上安全运行。此外，还对一些常见的 Web API 进行了修改，以更有意义的方式适应新的本机环境。这些差异可能会导致预期在浏览器中运行的代码出现问题。大多数问题都与动态内容有关 – 您可能会遇到“HTML1701:Unable to add dynamic content…”（HTML1701：无法添加动态内容...）或“0x800c001c - JavaScript runtime error:Unable to add dynamic content...”（0x800c001c - JavaScript 运行时错误：无法添加动态内容...）异常。&lt;/p&gt;  &lt;p&gt;有关本模块的更多信息，请阅读&lt;a href="http://blogs.msdn.com/b/b8_cn/archive/2012/05/25/metro-trustworthy.aspx" target="_blank"&gt;提供可靠和值得信赖的应用&lt;/a&gt;（英文）博文。您可以在 Windows 开发者中心了解 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465380.aspx" target="_blank"&gt;Windows 应用商店应用与 Web 浏览器环境之间的差异&lt;/a&gt;（英文）。&lt;/p&gt;  &lt;h2&gt;更新 jQuery 支持新模型&lt;/h2&gt;  &lt;p&gt;像您一样，许多人都知道 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 是一个在 Web 上运行的非常受欢迎的 JavaScript 框架，它通过一个可以在许多浏览器中运行的易用 API 简化了 HTML 文档遍历和操作、事件处理和 Ajax 等任务。&lt;/p&gt;  &lt;p&gt;为了能够在您的 Windows 应用商店应用中使用 jQuery 的所有这些功能，&lt;a href="http://appendto.com/" target="_blank"&gt;appendTo&lt;/a&gt; 的 jQuery 专家与 jQuery 社区协作更新了 jQuery，以便支持新的 Windows 8 应用模型。我们的 Microsoft Open Technologies 工程师亲自提供技术支持，以确保所有更改都能够充分利用该平台。&lt;/p&gt;  &lt;p&gt;在 jQuery 中添加 Windows 应用商店应用支持涉及初始测试、移植单元测试和评估 jQuery 依赖关系，如处于 jQuery 核心的 Sizzle 选择器引擎。appendTo 确定 jQuery 支持逻辑中的几个区域以及整个 Sizzle 中用于定位文档元素的稀疏项需要重新编写，以符合 Windows 应用商店应用安全模型的指导原则。&lt;/p&gt;  &lt;p&gt;appendTo 将代码直接提交到集成此支持的 jQuery Core 项目，因此，现在将 jQuery 添加到您的应用之后即可立即获得所有这些功能。此外，在 Windows 应用商店应用中使用 jQuery 时，您可能希望演练一些替代模式。您可以在 &lt;a href="http://aka.ms/learnjQueryOnWinRT" target="_blank"&gt;net.tuts+ 网站&lt;/a&gt;（英文）中了解有关这些模式的更多信息。有关在更新版本中所作更改的更多详情，请阅读 &lt;a href="http://aka.ms/appendTojQueryOnWinRT" target="_blank"&gt;appendTo 的博客文章&lt;/a&gt;（英文）。&lt;/p&gt;  &lt;h2&gt;轻松编码！&lt;/h2&gt;  &lt;p&gt;如果您是 HTML5 和 JavaScript 开发者，则可以使用所学知识与现有 JavaScript 代码和库构建 Windows 8 应用。对于您的 jQuery 代码，请升级到 &lt;a href="http://jquery.com/download/" target="_blank"&gt;jQuery 2.0&lt;/a&gt; 测试版，并遵循由 appendTo 共享的&lt;a href="http://aka.ms/learnjQueryOnWinRT" target="_blank"&gt;新模式&lt;/a&gt;（英文）。若未使用 jQuery，则可以将这些相同的模式和技术应用于自己的代码和库，以确保它们与 Windows 8 完全兼容。&lt;/p&gt;  &lt;p&gt;如果您希望了解在 Windows 平台上使用 Web 开发技能的更多新机会，请阅读 &lt;a href="http://aka.ms/jQueryOnWinRT" target="_blank"&gt;MS Open Tech 博客文章&lt;/a&gt;（英文）。&lt;/p&gt;  &lt;p&gt;--Olivier Bloch，MS Open Tech 高级技术专员&lt;/p&gt; &lt;!-- Title: “jQuery version 2.0 中对 Windows 应用商店应用的支持” Tags: “JavaScript,Windows 应用商店应用,jQuery” --&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10407660" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/JavaScript/">JavaScript</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+_945E28754655975E945E2875_/">Windows 应用商店应用</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/jQuery/">jQuery</category></item><item><title>开发 Windows 应用商店游戏 </title><link>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/03/29/windows-developing-store-games.aspx</link><pubDate>Fri, 29 Mar 2013 22:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10406413</guid><dc:creator>Windows 8 Team</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/windowsappdev_cn/rsscomments.aspx?WeblogPostID=10406413</wfw:commentRss><comments>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/03/29/windows-developing-store-games.aspx#comments</comments><description>&lt;div class="PostContent"&gt;
&lt;p&gt;Windows 8 通过创新的设备外形、全新的芯片体系结构、激动人心的商务模式和巨大的商机，改变了 PC 的格局。PC 游戏一直以来都是人们尽享计算机乐趣的主要方式。现在，游戏比以往任何时候都更好地例证了这种新的设备格局的价值。多亏有了 Windows 应用商店，人们可以更轻松地获得游戏，玩游戏，安全地与好友分享和更新游戏。因此，游戏能够占据如此大的下载量，创造大量收益并推动用户积极使用新平台，也就不足为奇了。随着 &lt;a href="http://gdconf.com/" target="_blank"&gt;GDC&lt;/a&gt; 大会开幕在即，更多游戏开发人员迫切地想要了解 Windows 8 带来的机会。&lt;/p&gt;
&lt;p&gt;那么您如何创建出色的 Windows 应用商店游戏呢？Windows 提供了哪些功能让您的游戏更富创造力、更有创新意义、更具盈利能力并且更容易开发？您可以使用哪些工具、技术和服务？生态体系中提供了哪些服务？在针对 Windows 8 进行开发时，&lt;a href="http://www.windowsstore.com/partner-stories" target="_blank"&gt;开发人员分享&lt;/a&gt;了哪些其他重大发现？本文将回答有关这些主题的问题，并阐明您如何开发令人惊叹的 Windows 应用商店游戏。&lt;/p&gt;
&lt;h2&gt;Windows 8 游戏设计和开发注意事项&lt;/h2&gt;
&lt;p&gt;Windows 8 是专门为了让用户享受娱乐体验而设计和打造的。Windows 8 用户体验 (UX) 指南鼓励使用全屏图像以及快速流畅的交互，而不是使用边框或额外的窗口装饰。设计指南建议应用程序应该将重点放在邀请用户参与的体验上，并通过沉浸式体验提供可指导用户操作的交互。主要游戏控件应易于访问，辅助控件应隐藏在应用栏或设置面板中，直到需要时才出现。这非常适合常规应用程序，但这些原则对游戏有何影响？毕竟，游戏开发人员提供快速流畅的全屏、沉浸式体验已经有很长时间了。尽管如此，几个基本问题还是几乎立即显现出来：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;游戏机制如何从功能强大的台式机扩展到笔记本电脑和平板电脑？&lt;/li&gt;
&lt;li&gt;要面向哪些最重要的设备外形？&lt;/li&gt;
&lt;li&gt;是否可同时为游戏启用触控功能、游戏控制器和键盘/鼠标？&lt;/li&gt;
&lt;li&gt;最重要的屏幕尺寸、纵横比和分辨率有哪些？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;长期以来，游戏开发人员一直在使用各种技术向 PC 社区提供有趣的游戏。随着时间的推移，Windows 上的 API 已有了重大发展。随着 Windows 8 的推出，一个新的开发平台也浮出水面。&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br211377" target="_blank"&gt;Windows 运行时 API&lt;/a&gt; 汇聚了过去 API 中的最佳技术，并在性能、安全性、开发一致性和服务方面进行了重大改进。Windows 应用商店带来了一种发现和分发游戏以及向游戏提供服务的新方式。这些新的 API 可为面向新开发模型的游戏开发人员提供重大价值。在开始开发 Windows 应用商店游戏时，您可能会提出一些问题，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用于游戏开发的最佳 Windows 运行时 API 有哪些？&lt;/li&gt;
&lt;li&gt;开发模型如何映射到不同的游戏类型？&lt;/li&gt;
&lt;li&gt;我如何从其他平台转换我的代码？&lt;/li&gt;
&lt;li&gt;我如何更新在较旧版本 Windows 中编写的代码？&lt;/li&gt;
&lt;li&gt;我的游戏资产中哪些（如果有）需要更新？&lt;/li&gt;
&lt;li&gt;是否有任何资源可帮助我降低开发成本？&lt;/li&gt;
&lt;li&gt;DirectX SDK 在哪里？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;游戏新思路&lt;/h2&gt;
&lt;p&gt;每个游戏都始于创意。创意的来源可能迥异。有时，它是在您散步或洗澡时不经意间突然浮现在脑海中的。有时，它是您的团队经过密切协作、反复斟酌才得出的。一旦有了创意，您就需要决定游戏的类型。您可能需要一个与众不同的新游戏。或者您想要移植您的现有游戏。它可能是一个射击游戏、智力测验或赛车游戏 &amp;ndash; 无论是哪种类型的游戏，Windows 应用商店中都有它的一席之地。//build/ 2012 大会上提供的&lt;a href="http://channel9.msdn.com/Events/Build/2012/3-111" target="_blank"&gt;游戏案例研究&lt;/a&gt;或许可以让您灵感迸发。如果您拥有 Windows 应用商店开发人员帐户，则可以浏览游戏的子类别以获得灵感，并查看不同的游戏类别在不同地区的表现如何。&lt;/p&gt;
&lt;h2&gt;游戏设计指南&lt;/h2&gt;
&lt;p&gt;一旦决定要构建的游戏的种类，以后在前端做出设计决策时就可以节省大量开发时间。&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh868271.aspx" target="_blank"&gt;Windows 8 游戏类别设计指南&lt;/a&gt;提供了有关如何以最佳方式吸引玩家并使他们与磁贴和通知交互的建议。另外，还提供了有关应使用哪种整体布局以及应将主要和辅助控件放置在何处的建议。&lt;/p&gt;
&lt;p&gt;您可以找到有关交互方式以及如何在游戏中融入触控功能、传感器和合约的建议。应尽早做出有关游戏机制和控件的决策以确定开发范围。同时，Windows 运行时平台使您能够比以往更方便地使用相同的代码来支持触控、手写笔（墨迹）和鼠标，因此，您不必为不同的设备外形设计专门的机制。因为每台 Windows PC 上都有一个位置来插入游戏控制器，所以不要错过这个机会，确保您的游戏中也包含该控制机制。&lt;/p&gt;
&lt;p&gt;计划如何以及以何种速度向玩家介绍游戏交互和机制。太慢，他们可能会失去兴趣；太快，他们可能会感到沮丧。或许最重要的是，决定采用哪种盈利模式和商业平台。Windows 应用商店允许您&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/jj193599.aspx" target="_blank"&gt;选择业务模式&lt;/a&gt;。它支持免费应用、基于广告的应用、应用内购买以及可下载内容。Windows 应用商店游戏可以利用内置的基于时间或基于功能的试用版本。或者，您可以使用第三方商业提供商或推出您自己的业务模式。无论采用哪种方式，都必须考虑这些问题，因为它们会对游戏在盈利或热门程度方面的成功产生重大影响。&lt;/p&gt;
&lt;p&gt;与所有 Windows 应用商店应用一样，游戏必须支持不同的激活、视图和挂起状态。设计指南提供了一些帮助，以考虑如何以及何时暂停游戏，如何以及何时挂起游戏的状态，以及如何处理全屏、贴靠和填充的视图状态。决定您的游戏如何支持横向和纵向显示。在调整游戏资产的分辨率以符合不同屏幕尺寸（或其中某些部分）时，考虑命中目标和其他屏幕上的控件的尺寸。另外，别忘了将屏幕纵横比、分辨率和 DPI 设置考虑在内。这将确保游戏的内容可在任何屏幕尺寸和缩放比例下正确呈现。&lt;/p&gt;
&lt;p&gt;最后，请记得考虑有助于增加游戏的可访问性和社交功能的其他几件事。高对比度模式和额外音频队列有助于提高可见性或播放能力，因此鼓励处于光照不太理想的条件下的玩家或视力受损的玩家采用。此外，利用平台内置的&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/Hh465283"&gt;联机标识&lt;/a&gt;（身份验证）、数据&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh700362.aspx"&gt;漫游&lt;/a&gt;和&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/Hh871373(v=win.10).aspx"&gt;共享&lt;/a&gt;到其他应用功能，可以通过社交活动（例如，比较游戏结果和跨不同的 PC 玩游戏）提高用户参与度。&lt;/p&gt;
&lt;h2&gt;游戏开发指南&lt;/h2&gt;
&lt;p&gt;DirectX 被认为是 Windows 游戏开发平台的核心。不过，我们还开发了许多其他组件并将其转换到 Windows 8 SDK 中，以便提供该平台为了支持多样化的 Windows 游戏生态系统所需的所有功能。我们提供了一致且全面的开发方法。我们还融入了从其他游戏开发平台中学到的最佳做法。但归根结底，我们强调并遵循了两个关键体系结构目标。性能和能耗是每个体系结构决策的核心，如&lt;a href="http://blogs.msdn.com/b/b8_cn/archive/2012/07/31/windows-8-graphics.aspx" target="_blank"&gt;硬件加速一切：Windows 8 图形&lt;/a&gt;博文中所述。在 Windows 8 上开发游戏充满挑战，因为整个平台都是为了提供快速而流畅的娱乐体验而设计的。&lt;/p&gt;
&lt;h3&gt;C++ 配 DirectX 是首选的游戏开发语言&lt;/h3&gt;
&lt;p&gt;Windows 运行时提供了一组丰富的 API 并简化了 Windows 事件处理，这些 API 以一种方便、一致的方式公开所有新设备和传感器。只有一个 Windows SDK，因此开发 Windows 应用商店游戏所需的每个 API 均可在 Microsoft Visual Studio 2012 中获得。为了实现最高保真度和最具沉浸感的体验，您需要&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465149.aspx" target="_blank"&gt;使用 Windows 8 DirectX API 构建 3D 游戏&lt;/a&gt;。这是用于开发的最简单的 DirectX 版本，并且它支持范围广泛的图形功能级别，从 DirectX 9.1 到 DirectX 11.1 中提供的所有最新硬件功能，均涵盖在内，从而允许您对游戏进行量身打造，使其适合从基于 ARM 的高能效、便携式 Windows 8 平板电脑到超频多 GPU 游戏装备的所有 PC。&lt;/p&gt;
&lt;p&gt;如果您熟悉某种特定开发语言，则可以在 Windows 8 中利用大量现有技能和经验。根据您要开发的游戏类型和您的偏好，可以采用多种技术组合来开发 Windows 应用商店游戏。不会强迫或限制您使用一种语法或模型。托管代码开发人员可以使用 XAML 构建出色、流畅的 2D 游戏，来利用 Windows 应用商店平台的优势和功能。如果您是一名 Web 开发人员，则可以利用现有 Web 及 Web 游戏开发技能来创建可通过 Windows 应用商店获得收益的游戏。对于 3D 交互式游戏，建议您将 C++ 与 DirectX 和 XAML（可选）结合使用，本文其余内容将重点介绍这一点。&lt;/p&gt;
&lt;h3&gt;游戏开发组件&lt;/h3&gt;
&lt;p&gt;Windows 8 提供的内置游戏技术随操作系统的每个版本一起发布并驻留在每台 PC 上，因此您不必担心它的分发问题，也不必管理多个版本。无需查找、下载和安装其他组件。&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8206.awesome_5F00_game2_5F00_51B74335.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="Windows 8 游戏开发组件和库" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3010.awesome_5F00_game2_5F00_thumb_5F00_37E30D06.png" alt="Windows 8 游戏开发组件和库" width="600" height="230" border="0" /&gt;&lt;/a&gt;图 1：&lt;em&gt;&lt;/em&gt;Windows 8 游戏开发组件和库&lt;/p&gt;
&lt;p&gt;从图形、音频和输入到文件 I/O、调度、数学运算和网络，每个组件都可通过您选择的开发语言进行访问。较低级别组件可提供更大灵活性、更好的资源管理和性能，但可能需要更多代码来全面控制处理过程及其需要的数据流。使用 C++，您可以直接接触到 Windows 8 平台的 GPU、CPU 和低级别服务，从而可以编写高性能代码。通过新的 C++/CX 语言扩展，语法方面可以实现 C# 的简单性。可通过引用计数实现透明的对象管理，而且不存在可能会损害游戏流畅性能的运行时层、垃圾回收或实时编译行为。&lt;/p&gt;
&lt;p&gt;对于 3D 和 2D 图形、媒体、图像和许多其他游戏组件，Windows 8 DirectX 技术提供了一组全面的 API、组件和库供您使用。请查看 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/jj554502.aspx" target="_blank"&gt;DirectX 游戏开发入门&lt;/a&gt;以获得全面概述。新的 Windows 8 图形堆栈集成程度更高，使 Direct2D、Direct3D、DirectVideo 和 DirectCompute 组件更容易一起使用，并且需要比以往更少的重复资源。我们还通过 XInput 库添加了对 Xbox 控制器的内置支持。有关详情，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh452799.aspx" target="_blank"&gt;在 DirectX 游戏中使用输入和控件&lt;/a&gt;。&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh452794.aspx" target="_blank"&gt;在 DirectX 游戏中使用音频&lt;/a&gt;部分介绍了 XAudio2 中用于音频和声音混合的改进 API，&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/ee415571.aspx" target="_blank"&gt;DirectXMath 编程指南&lt;/a&gt;中介绍了简化的数学函数和类型。&lt;/p&gt;
&lt;p&gt;DirectX/C++ 开发方法一个最大的优势是，在创建 Windows 应用商店游戏（和 Windows 桌面游戏）、Windows Phone 游戏和 Xbox 360 游戏时，您可以重用大量代码。DirectX API 与所有 Microsoft 游戏平台都密切相关。开发出色 Windows 游戏所需的一切均可在运行时、Windows SDK 和 Visual Studio 2012 中找到。有关旧版 DirectX SDK 的信息，请参阅 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/desktop/ee663275.aspx" target="_blank"&gt;DirectX SDK 在哪里？&lt;/a&gt;Windows 8 中还提供了其他几个开发模型。支持 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh825871.aspx" target="_blank"&gt;DirectX 与 XAML 互操作性&lt;/a&gt;的混合模型可提供最佳的控制和性能，以及 WinRT UI 工具包的便利性。&lt;/p&gt;
&lt;h3&gt;开发工具&lt;/h3&gt;
&lt;p&gt;我们提供了一组出色的工具来满足 Windows 应用商店游戏开发人员的需求。Visual Studio 2012 包括一个 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br229582.aspx" target="_blank"&gt;DirectX Windows 应用商店应用模板&lt;/a&gt;，该模板可为您开发 Direct3D 提供一个良好的开端。&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465033.aspx" target="_blank"&gt;模板代码&lt;/a&gt;提供基本视图提供程序基础结构和窗口支持，以及对所有必需的标题和组件的引用。还有一些值得探索的模板，这些模板将确保无论您选择哪种游戏开发模型，均遵循最佳做法。&lt;/p&gt;
&lt;p&gt;此外，为了改善游戏的开发、调试和分析，我们已向 Visual Studio 2012 中添加了一些新功能。对 Visual Studio 2012 &lt;a href="http://msdn.microsoft.com/zh-cn/library/bb386063(v=vs.110).aspx#BKMK_GraphicsTools" target="_blank"&gt;图形工具&lt;/a&gt;进行了投资，以确保无缝集成图形应用程序开发。再也无需离开熟悉的 IDE 接口，即可处理 3D 模型，查看纹理和图像，或者创建、编辑和编译 HLSL 着色器。通过集成图形 API 捕获和播放功能（以前称为 Windows PIX），现在可以更加直观地在 Visual Studio 2012 中&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh315751.aspx" target="_blank"&gt;调试图形密集型 DirectX 应用程序&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;示例和教程&lt;/h3&gt;
&lt;p&gt;这些示例提供了范围广泛的源代码示例，以帮助您快速开始游戏开发。每个示例重点介绍一种特定技术或技巧。这些教程和示例是以循序渐进的方式开发的。它们以符合逻辑的顺序编排，从最少的代码和最简单的方法开始，以帮助您入门。每个额外示例都向前一个示例添加一两个额外概念，直到整个游戏创建完毕。&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh994935.aspx" target="_blank"&gt;为 Windows 应用商店应用编写代码（DirectX 和 C++）&lt;/a&gt;介绍了为 Windows 应用商店应用编写 DirectX 和 C++ 代码需要了解的一些内容。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Direct3D-Tutorial-Sample-08667fb0" target="_blank"&gt;Direct3D 教程&lt;/a&gt;：该五步骤教程演示了如何使用交换链初始化 Direct3D，绘制到表面并在表面上显示更新。此示例显示的&amp;ldquo;旋转立方体&amp;rdquo;将由其他 Direct3D 示例进行扩展，因此如果您尚不熟悉 Direct3D API，该示例是一个很好的起点。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Simple-Direct3D-Touch-f98db97e" target="_blank"&gt;DirectX 触控示例&lt;/a&gt;：该示例演示了向 D3DTutorial 中的旋转立方体添加的非常少的触控支持。具体而言，它显示了如何将您的 Direct3D 动画更新连接到 Windows 运行时提供的触控事件。有关收缩以缩放导航的信息，请参见凹凸贴图示例。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Direct3D-sprite-sample-97ae6262" target="_blank"&gt;Direct3D 子画面示例&lt;/a&gt;：该示例提供了子画面批处理行为的 Direct3D 实现，与 XNA SpriteBatch API 类似。子画面是可以在 3D 场景中独立变换和管理的 2D 位图，通常用于 2D 游戏或用于表示 3D 游戏中运算成本高昂的对象或远距离对象。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Direct3D-Resource-Loading-25406148" target="_blank"&gt;资源加载示例&lt;/a&gt;：该示例演示了加载资源和资产（如着色器、纹理和网格）的方法。（请注意，每种内容类型在项目中都有关联的构建规则。您可以添加自己的内容处理器应用程序并构建自己的规则以调用这些应用程序。）&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Direct3D-bump-mapping-619d8d23" target="_blank"&gt;Direct3D 凹凸贴图示例&lt;/a&gt;：该示例演示了使用普通贴图和逐像素光照的凹凸贴图。该示例提供了使用普通贴图和颜色纹理的对象的表面阴影光照代码。它还实现了一个不带手势识别器的非常基本的收缩以缩放控件。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Direct3D-Post-Processing-3fd1edb8" target="_blank"&gt;Direct3D 后处理示例&lt;/a&gt;：该示例演示了在采用 Direct3D 的 Windows 应用商店 C++ 应用中，使用缩图式中间缓冲区对简单的旋转立方体场景进行后处理的过程。它演示了根据硬件的功能级别使用两种不同着色器的情况。可以对中间渲染目标进行修改以渲染到更小的表面来提高性能，然后扩展至设备的最终原始分辨率以实现高品质。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Basic-Audio-Sample-9a5bb0b7" target="_blank"&gt;AUDIO2 音频文件播放示例&lt;/a&gt;：该示例应用演示了如何将用于实现低延迟交互式声效的 XAudio2 API 融入您的 DirectX 游戏中以实现更好的听觉体验。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Simple-XInput-Controller-77c4b8e5" target="_blank"&gt;XINPUT 游戏控制器示例&lt;/a&gt;：&lt;strong&gt;&lt;/strong&gt;该示例演示了如何向您的 DirectX 游戏中添加 Xbox 控制器支持。它从 Xbox 游戏控制器读取输入并显示有关模拟驾驶杆移动和按钮按压的数据。它演示了如何从连接的控制器获取输入状态，并使用 Direct2D 和 DirectWrite 绘制到显示屏。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Direct3D-111-Simple-Stereo-9b2b61aa" target="_blank"&gt;Direct3D 立体 3D 示例&lt;/a&gt;：Windows 8 支持立体 3D 作为一项核心操作系统功能。该应用程序显示了如何将立体 3D 融入您的 DirectX 游戏。它还演示了如何响应 Direct3D 中的系统立体声变化。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Licensing-API-Sample-19712f1a" target="_blank"&gt;试用和应用内购买&lt;/a&gt;对游戏的成功至关重要，因此该示例演示了如何使用 Windows 应用商店提供的许可 API 来确定游戏或通过应用内购买启用的功能的许可状态。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面是将单个技巧组合到完整游戏中的端到端示例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Metro-style-DirectX-7c64aa8d" target="_blank"&gt;DirectX 简单的 3D 射击游戏&lt;/a&gt;：这些端到端示例应用和&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh780567.aspx" target="_blank"&gt;全面的代码演练&lt;/a&gt;演示了如何在一个简单的第一人称射击场游戏中融入各种控制类型和 DirectX 技术。如果您对各个技术示例的基础知识很熟悉，那么这是查看 Windows 应用商店 Direct3D 游戏所有组件的实际运用的好地方。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Metro-style-DirectX-18f98448" target="_blank"&gt;XAML DirectX 简单的 3D 射击游戏&lt;/a&gt;：该示例演示了一个简单的第一人称 3D 游戏的基本端到端实现，该游戏使用 C++ 编写，并使用了 DirectX（Direct3D 11.1、Direct2D、XInput 和 XAudio2）和 XAML。Direct3D 用于呈现 3D 内容，XAML 用于显示提醒和游戏状态消息。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/DirectX-Marble-Maze-Game-e4806345" target="_blank"&gt;DirectX Marble Maze 游戏示例&lt;/a&gt;：这个端到端游戏应用是一个简单的迷宫游戏，玩家需要使用倾斜控件将弹球从迷宫的开头滚动到迷宫末端。它演示了如何将所有游戏组件融入单个应用程序中。我们还以&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br230257(v=VS.85).aspx" target="_blank"&gt;完整代码演练&lt;/a&gt;的形式提供了一些有关此应用的丰富指南。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;游戏开发技巧&lt;/h3&gt;
&lt;p&gt;与游戏开发密切相关的多个开发模式、最佳做法和技巧均值得一提：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh994923.aspx" target="_blank"&gt;为不同的 Direct3D 功能级别开发&lt;/a&gt;可帮助您了解如何跨许多具有不同的图形性能级别的设备进行优化。这将使您利用 DirectX 和 C++ 为 Windows 构建的 Windows 应用商店游戏能够吸引更广泛的受众。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh994919.aspx" target="_blank"&gt;异步编程&lt;/a&gt;可确保您的游戏利用多个内核和超线程 CPU。为了获得最高性能和延长电池使用寿命，您的游戏的图形、音频、逻辑、文件 I/O 和网络可以全部并行化。&lt;/li&gt;
&lt;li&gt;对 Windows 应用商店游戏&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh465290" target="_blank"&gt;使用线程池并行化&lt;/a&gt;而不是传统的线程处理 API（如 CreateThread）。如本篇&lt;a href="http://blogs.msdn.com/b/shawnhar/archive/2012/03/12/createthread-for-windows-8-metro.aspx" target="_blank"&gt;博文&lt;/a&gt;所述，任务模型对渲染和确保响应迅速的 UI 尤其重要。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/jj262112.aspx" target="_blank"&gt;支持屏幕方向&lt;/a&gt;介绍了 DirectX 应用程序的内容和输入的屏幕旋转及 DPI 缩放。这有助于确保您的游戏在各种屏幕分辨率下均运行良好。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh452773.aspx" target="_blank"&gt;向游戏添加鼠标移动/观看控件&lt;/a&gt;解释了一种传统的类似鼠标的导航技术，该技术已经过调整，可向 Windows 应用商店开发模型添加触控功能。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh994925.aspx" target="_blank"&gt;开发鼠标控件&lt;/a&gt;讨论了相对鼠标控件的实现，这些控件不使用系统光标，并且返回相对屏幕坐标而不是绝对值。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh452788.aspx" target="_blank"&gt;游戏发布要求&lt;/a&gt;为 Windows 8 游戏开发人员提供通用游戏发布方案（如评级认证和打包）的工具和支持信息。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/jj863300.aspx" target="_blank"&gt;支持 Windows RT 和 ARM 处理器&lt;/a&gt;使您的 DirectX Windows 应用商店游戏能够在 Windows RT 设备上运行，并支持 Direct3D 功能级别 9_1 和编译 ARM 程序包。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用中间件缩短开发时间或降低开发成本&lt;/h3&gt;
&lt;p&gt;开发高品质专业游戏可能成本高昂。为多个平台开发游戏可能非常复杂、容易出错，甚至成本高昂。许多成熟的游戏工作室会构建工具和开发制作技术来构成他们的游戏开发流程或&amp;ldquo;管道&amp;rdquo;。这些投资可帮助工作室在不同的游戏和平台之间利用他们的游戏资产。渲染引擎、用户界面工具包、可见性闭塞、物理模拟器、音频视频创作、动画插补和人工智能只是游戏开发中通常会涉及的几个技术类别。有些游戏技术可能需要许多年才能成形和完善。&lt;/p&gt;
&lt;p&gt;专有游戏管道极其宝贵，许多工作室都将他们的投资视为与他们打造的游戏一样具有战略意义。但并不是每个人都能负担得起开发管道的时间或成本。幸运的是，第三方供应商提供了端到端游戏开发管道或具备这些功能的各个技术库。自从 Windows 8 推出以来，许多游戏中间件供应商已将他们的产品转换为新的 Windows 应用商店应用模型。通过使用这些产品，您可以更快的速度、更低的风险在 Windows 应用商店中推出您的游戏。随着时间的推移，我们预期有更多的供应商会宣布和推出 Windows 应用商店的游戏开发产品。下面（按字母顺序）收录了截止撰写本文时，已宣布推出或已提供支持 Windows 8 游戏开发的产品版本的第三方游戏中间件供应商。&lt;/p&gt;
&lt;div align="center"&gt;
&lt;table class="b8table" border="0" cellspacing="0" cellpadding="3" align="center"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Appcelerator&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;appMobi {!}&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="217"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Audiokinetic Wwise&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Autodesk Scaleform&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Cocos2d&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="217"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Epic Unreal Engine 3&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Exit Games Photon Server&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Fortumo Mobile Payments&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="217"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Firelight Technologies FMOD&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;GameSalad Creator&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Havok Physics&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="217"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Havok Vision Engine&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;MonoGame&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Ogre Rendering Engine&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="217"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;NVIDIA PhysX&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Scirra Construct 2&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;SharpDX&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="217"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;ShiVa3D&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;SlimDX&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Unigine Engine&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="217"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Unity 3d&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="208"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Yoyo Games GameMaker&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign="top" width="208"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td valign="top" width="217"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/bb200104(v=xnagamestudio.40).aspx" target="_blank"&gt;Microsoft 的 XNA Game Studio&lt;/a&gt; 是面向 Xbox 360、Windows Phone 和 Windows 的游戏开发管道。但是，它与 Windows 应用商店的游戏开发不兼容（尽管 XNA 游戏可以作为 Windows 8 的桌面应用运行）。Visual C++/CX 的 DirectX 开发借鉴了 XNA 的许多模式和做法，并且具有许多类似的概念。因此，许多 XNA 游戏开发人员将会发现切换到 DirectX 和 C++ 开发相对而言比以往任何时候都更加轻松。另一方面，我们已看到有开发人员成功地使用了开源 &lt;a href="http://monogame.codeplex.com/" target="_blank"&gt;MonoGame&lt;/a&gt; 库，该库复制了许多 XNA Game Studio 功能。网上已经有多篇文章介绍了如何对面向 Windows 应用商店的游戏利用使用 XNA 创建的资产。下面是一个指向有关该主题的更多信息的&lt;a href="http://blogs.msdn.com/b/tarawalker/archive/2012/12/04/windows-8-game-development-using-c-xna-and-monogame-3-0-building-a-shooter-game-walkthrough-part-1-overview-installation-monogame-3-0-project-creation.aspx" target="_blank"&gt;链接&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;有关游戏开发的其他资源&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh452744.aspx" target="_blank"&gt;MSDN 上专门为游戏开发文档开辟了一个区域&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/Build/2012?sort=sequential&amp;amp;direction=desc&amp;amp;term=game" target="_blank"&gt;//build/ 2012&lt;/a&gt; 上提供的以游戏为中心的专题讲座、幻灯片资料和演讲录音&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/chuckw/archive/2012/03/28/game-developer-conference-2012.aspx" target="_blank"&gt;GDC 2012&lt;/a&gt; 上提供的以游戏为中心的专题讲座、幻灯片资料和演讲录音&lt;/li&gt;
&lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/Build/BUILD2011?sort=sequential&amp;amp;direction=desc&amp;amp;term=game" target="_blank"&gt;//build/ 2011&lt;/a&gt; 上提供的以游戏为中心的专题讲座、幻灯片资料和演讲录音&lt;/li&gt;
&lt;li&gt;开发人员中心提供了相关帮助和支持，开发人员中心为像您这样的游戏开发人员开设了一个&lt;a href="http://social.msdn.microsoft.com/Forums/zh-cn/wingameswithdirectx/threads" target="_blank"&gt;专门的游戏开发论坛&lt;/a&gt;，那里可能有您需要的答案&lt;/li&gt;
&lt;li&gt;&lt;a href="http://directxtk.codeplex.com/" target="_blank"&gt;DirectX 工具包&lt;/a&gt;是用于编写 Direct3D 11 C++ 代码的帮助程序类的集合&lt;/li&gt;
&lt;li&gt;其他有用资源包括 &lt;a href="http://blogs.msdn.com/b/chuckw/" target="_blank"&gt;Chuck Walbourn 的博客&lt;/a&gt;和 &lt;a href="http://blogs.msdn.com/b/shawnhar/" target="_blank"&gt;Shawn Hargreaves 的博客&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;摘要&lt;/h2&gt;
&lt;p&gt;Windows 8 通过新的设备外形、创新技术和非常适合游戏领域的利润丰厚的商业模式，重塑了 PC 格局。该平台为利用它的人提供了全新的机会。截止撰写本文时，Windows 应用商店已拥有数千款游戏，并且该数字每天都在增加。本博文的目的是帮助您了解如何创建自己的出色 Windows 应用商店游戏以利用各种可能性。本文的信息旨在阐明 Windows 8 如何使游戏开发变得更轻松、更富创造力、更有创新意义且利润更丰厚。我们介绍了该平台上提供的工具、技术和服务以及有哪些第三方技术可用。在我们动身前往旧金山参加年度&lt;a href="http://gdconf.com/" target="_blank"&gt;游戏开发人员大会&lt;/a&gt;时，您不妨看看这篇文章，了解 Windows 应用商店游戏的开发指南。&lt;/p&gt;
&lt;p&gt;精彩即将呈现！&lt;/p&gt;
&lt;p&gt;Shai Hinitz，资深项目经理&lt;/p&gt;
&lt;!--
Title "开发 Windows 应用商店游戏"
Tags "Windows 应用商店应用, GDC, Windows 8 游戏, Windows 应用商店游戏, 游戏化, Windows 游戏, 游戏"
--&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10406413" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/GDC/">GDC</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+_945E28754655975E386E0F62_/">Windows 应用商店游戏</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+_945E28754655975E945E2875_/">Windows 应用商店应用</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_386E0F62_/">游戏</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+_386E0F62_/">Windows 游戏</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_386E0F621653_/">游戏化</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+8+_386E0F62_/">Windows 8 游戏</category></item><item><title>活力无限（第 3 部分）： 推送通知与 Windows Azure 移动服务</title><link>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/03/29/3-windows-azure.aspx</link><pubDate>Fri, 29 Mar 2013 17:31:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10406342</guid><dc:creator>Windows 8 Team</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/windowsappdev_cn/rsscomments.aspx?WeblogPostID=10406342</wfw:commentRss><comments>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/03/29/3-windows-azure.aspx#comments</comments><description>&lt;div class="PostContent"&gt; &lt;p&gt;在本博文系列的第 1 部分中，我们探讨了“活力”对于用户的意义，以及应用将如何参与创造活力无限的用户体验的过程。 在第 2 部分中，我们介绍了如何编写和调试 Web 服务来支持动态磁贴的定期更新。 下面是第 3 部分，我们将让您理解如何通过 Windows 推送通知服务 (WNS) 为特定客户端设备按需提供磁贴更新、Toast 和原始通知，以及 Windows Azure 移动服务将如何简化整个过程，进而结束这一博文系列。&lt;/p&gt;  &lt;h2&gt;推送通知&lt;/h2&gt;  &lt;p&gt;正如我们在第 2 部分中所看到的，定期更新从客户端启动，并提供了一种轮询&lt;i&gt;&lt;/i&gt;或“请求”方法来更新磁贴或锁屏提醒。 “推送”通知将在服务向设备直接发送更新时发生，该更新可能是特定于用户、应用甚至辅助磁贴的更新。&lt;/p&gt;  &lt;p&gt;与轮询不同，推送通知可随时发生，而且频率更高，但请注意，如果设备采用电池供电、处于连接待机模式或者通知流量过高时，Windows 将限制设备上的推送通知流量。 这意味着我们无法保证所有通知都将被传送（特别是当设备关闭时）。&lt;/p&gt;  &lt;p&gt;因此，请不要认为您可使用推送通知来实施一个时钟磁贴或频率或时间分辨率与时钟相似的其他磁贴小工具。 相反，您可以想一下如何使用推送通知来将磁贴和通知连接到可向用户传达颇有趣味且意义丰富的信息的后端服务，这些服务可吸引用户重新使用您的应用。&lt;/p&gt;  &lt;p&gt;在我们深入介绍详细内容之前，您应理解存在两类截然不同的推送通知：&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;包含磁贴或锁屏提醒更新或 Toast 通知的负载的 XML 更新： Windows 能够处理此类推送通知，并以某一应用的名义发布更新或 Toast。 如有需要，应用也可直接处理这些通知。&lt;/li&gt;    &lt;li&gt;包含服务希望发送的任何数据的二进制通知或“原始”通知：&lt;i&gt;&lt;/i&gt; 由于 Windows 不知道如何处理这些数据，因此这些通知“必须”由应用特定的代码处理。&lt;i&gt;&lt;/i&gt; 请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/Hh761463.aspx" target="_blank"&gt;原始通知的指导原则和检查列表&lt;/a&gt;页面（英文）了解诸如大小限制 (5KB) 和编码 (base64) 等详细信息。&lt;/li&gt;  &lt;/ol&gt;  &lt;p&gt;在这两类情形中，一个运行的（前台）应用能够通过 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br241283.aspx" target="_blank"&gt;PushNotificationChannel&lt;/a&gt; 类及其 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.pushnotifications.pushnotificationchannel.pushnotificationreceived.aspx" target="_blank"&gt;PushNotificationReceived&lt;/a&gt; 事件直接处理推送通知。 对于 XML 负载，应用能够在向本地发布通知（或选择忽略通知）之前进行内容修改、标签更改等操作。 对于原始通知，应用将先行处理内容，然后再确定发布哪些通知（如有）。&lt;/p&gt;  &lt;p&gt;如果应用被挂起或未运行，那么其也可提供一个后台任务，以达到相同的目的。 应用必须请求并被授予锁屏界面访问权限，之后此类应用特定的代码就可在接收到通知时运行。&lt;/p&gt;  &lt;p&gt;后台任务通常在通知到达时进行一项或两项操作。 首先，其可能将通知中某些相关信息保存到本地应用数据中，当应用下一次被激活或恢复时即可在此检索这些信息。 其次，后台任务可发布本地磁贴和锁屏提醒更新和/或 Toast 通知。&lt;/p&gt;  &lt;p&gt;为了更好地理解原始通知，假设有一个典型的电子邮件应用。 当后端服务为用户检测到新消息时，其将向 WNS 发送一条原始推送通知，其中包含数个电子邮件消息标题。 该服务采用一个连接到用户特定设备上的特定应用的“通道 URI”来进行这一操作。&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;然后，WNS 将试图把该通知推送给客户端。 假设其成功完成，那么 Windows 将收到该通知，并查找所涉及的通道 URI 相关的应用。 如果 Windows 能够找到适当的应用，那么该通知将被忽略。 如果某一应用存在并处于运行状态，那么 Windows 将启动 PushNotificationReceived 事件，反之，Windows 将为该应用查找并调用可用的后台任务。&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;这两种方式中的任何一种都将让原始通知最终获得一些应用代码，这些代码将处理数据、向应用磁贴发布锁屏提醒更新，以显示新消息的数量，并最多发布五个包含消息标题的循环磁贴更新。 应用还可为每条到达的新消息，或至少表明有新邮件的消息发布 Toast 通知。&lt;/p&gt;  &lt;p&gt;因此，Toast 将告诉用户有新邮件到达，而且“开始”屏幕上的应用磁贴将提供新邮件活动的快捷视图。&lt;/p&gt;  &lt;p&gt;欲了解这些客户端事件处理程序和后台任务的更多信息，请查阅&lt;a href="http://code.msdn.microsoft.com/windowsapps/Raw-notifications-sample-3bc28c5d" target="_blank"&gt;原始通知示例&lt;/a&gt;、本博客系列中的&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/06/07/backgrounds-tasks.aspx" target="_blank"&gt;在后台中高效工作 - 后台任务&lt;/a&gt;一文，以及&lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=28999" target="_blank"&gt;后台网络连接白皮书&lt;/a&gt;。 就我们这篇博文的目的而言，让我们转而讨论这一内容的服务端。&lt;/p&gt;  &lt;h2&gt;使用 Windows 推送通知服务 (WNS)&lt;/h2&gt;  &lt;p&gt;通过 Windows、应用、服务和 WNS 的通力协作，向某一特定用户的特定设备上的特定应用磁贴（或 Toast 或原始通知头）提供用户特定的数据将变为可能。 下图显示了所有这些要素之间的关系。&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8611.alive_2D00_with_2D00_activity_2D00_3_5F00_graph_5F00_52EC8A0B.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="WNS 协作流程图" border="0" alt="流程图显示出 Windows、应用、���务和 WNS 相互协作为特定应用磁贴提供数据" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/6457.alive_2D00_with_2D00_activity_2D00_3_5F00_graph_5F00_thumb_5F00_4AF4E7A9.png" width="700" height="347" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;很显然，为了让整个流程和谐进行，确立一些关系变得尤为必要：&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;您（开发人员）在 Windows 应用商店中注册应用以使用推送通知。 这将为服务提供一个 SID 和客户端秘钥来利用 WNS 进行身份验证（为了安全起见，这些 SID 和秘钥不应存储于客户端设备上）。&lt;/li&gt;    &lt;li&gt;在运行时，应用将为其每个动态磁贴（主磁贴和辅助磁贴）从 Windows 请求一个 WNS 通道 URI，或为原始通知请求一个 WNS 通道 URI。 应用还必须每 30 天刷新这些通道 URI，这样您才能使用其他后台任务。&lt;/li&gt;    &lt;li&gt;应用的服务将提供一个 URI，通过该 URI，应用可将通道 URI 与描述其用途（如天气更新的位置或特定用户的帐户和活动）的任何数据一同上载。 进行接收后，服务将存储这些通道 URI 和相关数据以供日后使用。&lt;/li&gt;    &lt;li&gt;服务将监视其后端是否存在应用到每个特定的用户/设备/应用/磁贴组合的变更。 当服务检测到为某一特定通道触发通知的条件时，服务将构建该通知（XML 通知或原始通知）的内容、使用 SID 和客户端秘钥来利用 WNS 对服务进行身份验证，然后将通知与通道 URI 一同发送到 WNS。&lt;/li&gt;  &lt;/ol&gt;  &lt;p&gt;让我们详细了解一下每个步骤。 （正如预览中的情形，如果您对处理 HTTP 请求感到紧张，那么正如您将要了解到的，Windows Azure 移动服务则无需您处理很多细节。）&lt;/p&gt;  &lt;h3&gt;利用 Windows 应用商店注册应用&lt;/h3&gt;  &lt;p&gt;要为您的服务获取 SID 和客户端秘钥，请参阅 Windows 开发中心中&lt;a href="http://msdn.microsoft.com/library/windows/apps/hh465407.aspx" target="_blank"&gt;如何利用 Windows 推送通知服务 (WNS) 进行验证身份&lt;/a&gt;页面（英文）。 SID 将通过 WNS 识别您的应用，而您的服务将利用客户端秘钥来告知 WNS 可向您的应用发送通知。 再次提醒，SID 和客户端秘钥只应存储于服务中。&lt;/p&gt;  &lt;p&gt;请注意，只有在您的服务将发送一个推送通知时，您才需要进行&lt;a href="http://msdn.microsoft.com/library/windows/apps/hh465407.aspx" target="_blank"&gt;利用 Windows 推送通知服务 (WNS) 验证身份&lt;/a&gt;的中第 4 步“将云服务器的凭据发送到 WNS”。 由于这一阶段中您的服务缺乏发送通知所需的关键要素（即通道 URI），因此我们稍后再返回探讨这一内容。&lt;/p&gt;  &lt;h3&gt;获取并刷新通道 URI&lt;/h3&gt;  &lt;p&gt;客户端应用将通过 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.pushnotifications.pushnotificationchannelmanager.aspx" target="_blank"&gt;Windows.Networking.PushNotifications.PushNotificationChannelManager&lt;/a&gt; 对象在运行时获得通道 URI。 该对象仅拥有两个方法：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;i&gt;&lt;/i&gt;createPushNotificationChannelForApplicationAsync： 为应用的主磁贴以及 Toast 和原始通知创建一个通道 URI。&lt;/li&gt;    &lt;li&gt;&lt;i&gt;&lt;/i&gt;createPushNotificationChannelForSecondaryTileAsync： 为 tileId 语法所识别的某一特定辅助磁贴创建一个通道 URI。&lt;i&gt;&lt;/i&gt;&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;两类异步操作的结果都是生成 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.networking.pushnotifications.pushnotificationchannel.aspx" target="_blank"&gt;PushNotificationChannel&lt;/a&gt; 对象。 该对象的&lt;i&gt;&lt;/i&gt; Uri 属性中包含通道 URI，以及一个 ExpirationTime&lt;i&gt;&lt;/i&gt; 来显示出刷新该通道的最后期限。 &lt;i&gt;&lt;/i&gt;如有需要，Close 方法将专门终止通道，而最重要的是 &lt;i&gt;&lt;/i&gt;PushNotificationReceived 事件，该事件将在应用处于前台，且通过通道接收推送通知时再次启动。&lt;/p&gt;  &lt;p&gt;一个通道 URI 的生存期为 30 天，30 天后，WNS 将拒绝为该通道所提出的任何请求。 因此，应用代码每 30 天至少需要采用上述 create 方法&lt;i&gt;&lt;/i&gt;来刷新一次这些 URI，并将这些 URI 发送到其服务中。 下面介绍一种很好的策略：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;首次启动时，请求一个通道 URI，并将 Uri 属性中的字符串保存到您的本地应用数据中。&lt;i&gt; &lt;/i&gt; 由于通道 URI 是设备特定的，因此请勿将其存储于您的漫游应用数据中。&lt;/li&gt;    &lt;li&gt;在后续启动中，再次请求一个通道 URI，并将其与此前保存的 URI 进行比较。 如果二者不同，则将其保存到服务中，或如有必要，发送该 URI，并让服务更换旧 URI。&lt;/li&gt;    &lt;li&gt;此外，由于应用被挂起的时间可能将超过 30 天，因此请在您应用的“恢复”&lt;i&gt;&lt;/i&gt;处理程序中执行此前的步骤（请参阅文档中&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh770837.aspx" target="_blank"&gt;启动、恢复和多任务处理&lt;/a&gt;页面（英文））。&lt;/li&gt;    &lt;li&gt;如果您担心应用在 30 天内不会运行，则请实施一个包含维护触发器的后台任务，以每几天或每周运行一次。 欲了解详情，请再次参阅&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/06/07/backgrounds-tasks.aspx" target="_blank"&gt;在后台高效工作 - 后台任务&lt;/a&gt;一文；此情形中的后台任务所执行的代码与应用用于请求通道并将其发送到您的服务的代码相同。&lt;/li&gt;  &lt;/ul&gt;  &lt;h3&gt;将通道 URI 发送到服务&lt;/h3&gt;  &lt;p&gt;通常情况下，推送通知通道将与诸如电子邮件状态、即时消息和其他个性化信息等用户特定的更新相互配合。 您的服务不大可能需要向每名用户和/或每个磁贴发送相同的通知。 因此，服务需要将每个通道 URI 与更为具体的信息相关联。 对于电子邮件应用而言，由于用户的 ID 将制定检查的帐户，因此 ID 至关重要。 而天气应用则相反，其有可能将通道 URI 与特定的纬度和经度相关联，这一磁贴（主磁贴和辅助磁贴）将反映出不同的位置。&lt;/p&gt;  &lt;p&gt;然后，应用必须在向其服务发送通道 URI 时包含这些详细信息，而且服务必将存储这些信息供日后使用。&lt;/p&gt;  &lt;p&gt;当需要关注用户身份时，应用最好采用服务单独验证用户的身份，使用服务特定的凭据或通过诸如 Facebook、Twitter、Google 或用户的 Microsoft 帐户等 OAuth 提供程序（正如我们将在稍后看到的，使用 OAuth 将对 Windows Azure 移动服务大有裨益）。 如果由于某些原因而无法实现这一点，那么请务必加密您发送到服务的用户 ID，或确保通过 HTTPS 发送。&lt;/p&gt;  &lt;p&gt;无论在哪一情况下，您都将最终确定向您的服务发送所有这些信息的方式（位于标题，通过消息主题中的数据，或作为服务 URI 上的参数）。 这部分通信将严格限定于应用及其服务之间。&lt;/p&gt;  &lt;p&gt;举一个简单的例子，让我们假设拥有一项服务，（如同我们将在下一部分中看到的）其包含一个名为 receiveuri.aspx&lt;i&gt;&lt;/i&gt; 的页面，该名称的完整地址是一个名为 url 的变量。&lt;i&gt;&lt;/i&gt; 以下代码将为应用从 Windows 中请求一个主通道 URI，并将其通过 HTTP 发布到页面中。 （该代码从&lt;a href="http://code.msdn.microsoft.com/windowsapps/Push-and-periodic-de225603" target="_blank"&gt;推送和定期通知客户端示例&lt;/a&gt;中派生，并加以了简化，其中在其他地方定义的 itemId &lt;i&gt;&lt;/i&gt;变量被用于识别辅助磁贴；该示例还拥有此处并未显示的 C++ 变量）：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;：&lt;/p&gt;  &lt;div&gt;  &lt;/div&gt;  &lt;blockquote&gt;   &lt;div id="codeSnippetWrapper"&gt;     &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;Windows.Networking.PushNotifications.PushNotificationChannelManager&lt;br /&gt;    .createPushNotificationChannelForApplicationAsync()&lt;br /&gt;    .done(&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (channel) {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;//Typically save the channel URI to appdata here.&lt;/span&gt;&lt;br /&gt;        WinJS.xhr({ type: &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;, url:url,&lt;br /&gt;            headers: { &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;: &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;application/x-www-form-urlencoded&amp;quot;&lt;/span&gt; },&lt;br /&gt;            data: &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;channelUri=&amp;quot;&lt;/span&gt; + encodeURIComponent(channel.uri) &lt;br /&gt;                + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;amp;itemId=&amp;quot;&lt;/span&gt; + encodeURIComponent(itemId)&lt;br /&gt;        }).done(&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (request) {&lt;br /&gt;            &lt;span style="color: rgb(0, 128, 0);"&gt;//Typically update the channel URI in app data here.&lt;/span&gt;&lt;br /&gt;        }, &lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (e) {&lt;br /&gt;            &lt;span style="color: rgb(0, 128, 0);"&gt;//Error handler&lt;/span&gt;&lt;br /&gt;        });&lt;br /&gt;    });&lt;br /&gt;&lt;/pre&gt;            &lt;/div&gt;
&lt;/blockquote&gt;

&lt;div&gt;&lt;strong&gt;C#：&lt;/strong&gt;&lt;/div&gt;

&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;  &lt;blockquote&gt;
    &lt;div id="codeSnippetWrapper"&gt;
      &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; Windows.Networking.PushNotifications;&lt;br /&gt;&lt;br /&gt;PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();&lt;br /&gt;HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);&lt;br /&gt;webRequest.Method = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;;&lt;br /&gt;webRequest.ContentType = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;application/x-www-form-urlencoded&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;byte&lt;/span&gt;[] channelUriInBytes = Encoding.UTF8.GetBytes(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;ChannelUri=&amp;quot;&lt;/span&gt; + WebUtility.UrlEncode(newChannel.Uri) + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;amp;ItemId=&amp;quot;&lt;/span&gt; + WebUtility.UrlEncode(itemId));&lt;br /&gt;&lt;br /&gt;Task&amp;lt;Stream&amp;gt; requestTask = webRequest.GetRequestStreamAsync();&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (Stream requestStream = requestTask.Result)&lt;br /&gt;{&lt;br /&gt;    requestStream.Write(channelUriInBytes, 0, channelUriInBytes.Length);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

      &lt;br /&gt;&lt;/div&gt;
  &lt;/blockquote&gt;
以下 ASP.NET 代码是一个处理此 HTTP POST 的 receiveuri.aspx &lt;i&gt;&lt;/i&gt;页面的基本实现，请确保其已收到有效的通道 URI、用户和一些对于该项目的标识符。&lt;/div&gt;

&lt;p&gt;我之所以强调此代码的“基本”属性，是因为您可看到 SaveChannel 功能&lt;i&gt;&lt;/i&gt;仅将请求的内容写入了固定的文本文件中，这显然不会扩展超过一个单一用户！ 当然，一项真正的服务将针对这一目的采用一个数据库，但此处的结构将与之相似。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&amp;lt;%@ Page Language=&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt; AutoEventWireup=&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script runat=&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;//Output page header&lt;/span&gt;&lt;br /&gt;    Response.Write(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;!DOCTYPE html&amp;gt;\n&amp;lt;head&amp;gt;\n&amp;lt;title&amp;gt;Register Channel URI&amp;lt;/title&amp;gt;\n&amp;lt;/head&amp;gt;\n&amp;lt;html&amp;gt;\n&amp;lt;body&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;//If called with HTTP GET (as from a browser), just show a message.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (Request.HttpMethod == &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        Response.StatusCode = 400;&lt;br /&gt;        Response.Write(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;p&amp;gt;This page is set up to receive channel URIs from a push notification client app.&amp;lt;/p&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;        Response.Write(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (Request.HttpMethod != &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;) {&lt;br /&gt;        Response.StatusCode = 400;&lt;br /&gt;        Response.Status = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;400 This page only accepts POSTs.&amp;quot;&lt;/span&gt;;&lt;br /&gt;        Response.Write(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;p&amp;gt;This page only accepts POSTs.&amp;lt;/p&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;        Response.Write(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;&lt;/span&gt;);        &lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;//Otherwise assume a POST and check for parameters    &lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;//channelUri and itemId are the values posted from the Push and Periodic Notifications Sample in the Windows 8 SDK&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (Request.Params[&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;channelUri&amp;quot;&lt;/span&gt;] != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; Request.Params[&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;itemId&amp;quot;&lt;/span&gt;] != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: rgb(0, 128, 0);"&gt;// Obtain the values, along with the user string&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; uri = Request.Params[&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;channelUri&amp;quot;&lt;/span&gt;];&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; itemId = Request.Params[&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;itemId&amp;quot;&lt;/span&gt;];&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; user = Request.Params[&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;LOGON_USER&amp;quot;&lt;/span&gt;];&lt;br /&gt;                 &lt;br /&gt;            &lt;span style="color: rgb(0, 128, 0);"&gt;//TODO: validate the parameters and return 400 if not.&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: rgb(0, 128, 0);"&gt;//Output in response&lt;/span&gt;&lt;br /&gt;            Response.Write(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;p&amp;gt;Saved channel data:&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;channelUri = &amp;quot;&lt;/span&gt; + uri + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;/span&gt; + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;itemId = &amp;quot;&lt;/span&gt; + itemId + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;user = &amp;quot;&lt;/span&gt; + user + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;/p&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 128, 0);"&gt;//The service should save the URI and itemId here, along with any other unique data from the app such as the user;&lt;/span&gt;&lt;br /&gt;            SaveChannel(uri, itemId, user);&lt;br /&gt;&lt;br /&gt;            Response.Write(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;    {&lt;br /&gt;        Trace.Write(ex.Message);&lt;br /&gt;        Response.StatusCode = 500;&lt;br /&gt;        Response.StatusDescription = ex.Message; &lt;br /&gt;        Response.End();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; SaveChannel(String uri, String itemId, String user)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;//Typically this would be saved to a database of some kind; to keep this demonstration very simple, we'll just use&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;//the complete hack of writing the data to a file, paying no heed to overwriting previous data.&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;//If running in the debugger on localhost, this will save to the project folder&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; saveLocation = Server.MapPath(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;) + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;\\&amp;quot; + &amp;quot;&lt;/span&gt;channeldata_aspx.txt&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;;&lt;br /&gt;    string data = uri + &amp;quot;&lt;/span&gt;~&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot; + itemId + &amp;quot;&lt;/span&gt;~&amp;quot; + user;&lt;br /&gt;&lt;br /&gt;    System.Text.ASCIIEncoding encoding = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; System.Text.ASCIIEncoding();&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;byte&lt;/span&gt;[] dataBytes = encoding.GetBytes(data);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (System.IO.FileStream fs = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; System.IO.FileStream(saveLocation, System.IO.FileMode.Create))&lt;br /&gt;    {&lt;br /&gt;        fs.Write(dataBytes, 0, data.Length);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;您可在我的免费电子书籍&lt;a href="http://go.microsoft.com/fwlink/?LinkID=269853"&gt;使用 HTML、CSS 和 JavaScript 编程 Windows 8 应用&lt;i&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;&lt;/i&gt;的第 13 章中找到这一服务的代码，特别是在配套内容的 HelloTiles 示例中。 其目的在于与此前提到的客户端 SDK 示例配合使用。 如果您在启用了本地主机的调试程序（Visual Studio 2012 旗舰版或 Visual Studio Express 2012 for Web）中运行 HelloTiles，那么您将拥有诸如 http://localhost:52568/HelloTiles/receiveuri.aspx &lt;i&gt;&lt;/i&gt;等 URL，您可将该 URL 粘贴到客户端 SDK 示例中。 当该示例随后向该 URL 提出请求时，您将停止服务中的任何断点，并可穿行于代码。&lt;/p&gt;

&lt;h3&gt;发送通知&lt;/h3&gt;

&lt;p&gt;在真正的服务中，您将拥有某些持续进程类型，这些进程将监视器数据源，并适时向特定用户发送推送通知。 这一过程的发生方式可能包括以下几种：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;计划的作业可能每 15 分钟到 30 分钟检查一次特定位置的检查天气警报，这一频率取决于额这些警报发布的频率，以及发布响应推送通知的频率。&lt;/li&gt;

  &lt;li&gt;例如消息传递后端等其他服务可能将在有新消息时向您的服务器上的页面提出请求。 该页面然后将发布适当的通知。&lt;/li&gt;

  &lt;li&gt;用户可能正与您的服务器上的网页交互，而他们的活动将向特定通道触发推送通知。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;简言之，推送通知拥有众多触发器，具体数量完全取决于您后端服务或网站的属性。 就本文的目的而言，&lt;a href="http://go.microsoft.com/fwlink/?LinkID=269853"&gt;使用 HTML、CSS 和 JavaScript 编程 Windows 8 应用&lt;i&gt;&lt;/i&gt;&lt;/a&gt;第 13 章中出现的相同 HelloTiles 示例服务就有一个名为 sendBadgeToWNS.aspx 的页面，&lt;i&gt;&lt;/i&gt;该页面将在您使用浏览器访问页面时使用此前在文本文件中保存的任何通道 URI 发送推送通知。 一项真正的服务将执行一些数据库查找操作以获取通道 URI，而不是读取文件内容，但是再次说明，二者的整体结构将非常相似。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ASP.NET 页面：&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div style="margin: 0em; padding: 0px; width: 100%; height: 200px; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippetWrapper"&gt;
    &lt;pre id="codeSnippet"&gt;&lt;span&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; CodeFile=&amp;quot;sendBadgeToWNS.aspx.cs&amp;quot; Inherits=&amp;quot;sendBadgeToWNS&amp;quot; %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;html&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;html&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;xmlns&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;head&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;    &lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;title&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;Send WNS Update&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;title&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;head&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;p&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;Sending badge update to WNS&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;p&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;html&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;&amp;#160; &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;C# 代码隐藏：&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Web.UI;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Net;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.IO;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Runtime.Serialization;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Runtime.Serialization.Json;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;partial&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; sendBadgeToWNS : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;//Load our data that was previously saved. A real service would do a database lookup here&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;//with user- or tile-specific criteria.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; loadLocation = Server.MapPath(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;) + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;\\&amp;quot; + &amp;quot;&lt;/span&gt;channeldata_aspx.txt&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;        byte&lt;/span&gt;[] dataBytes;&lt;br /&gt;        &lt;br /&gt;        using (System.IO.&lt;span style="color: rgb(0, 96, 128);"&gt;FileStream&lt;/span&gt; fs = new System.IO.&lt;span style="color: rgb(0, 96, 128);"&gt;FileStream&lt;/span&gt;(loadLocation, System.IO.&lt;span style="color: rgb(0, 96, 128);"&gt;FileMode&lt;/span&gt;.Open))&lt;br /&gt;        {&lt;br /&gt;            dataBytes = new byte[fs.Length];&lt;br /&gt;            fs.Read(dataBytes, 0, dataBytes.Length);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (dataBytes.Length == 0)&lt;br /&gt;        {&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        System.Text.&lt;span style="color: rgb(0, 96, 128);"&gt;ASCIIEncoding&lt;/span&gt; encoding = new System.Text.&lt;span style="color: rgb(0, 96, 128);"&gt;ASCIIEncoding&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; data = encoding.GetString(dataBytes);&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;[] values = data.Split(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Char[] { '~' });&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; uri = values[0]; &lt;span style="color: rgb(0, 128, 0);"&gt;//Channel URI&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; secret = &amp;quot;9ttsZT0JgHAFveYahK1B6jQbvMOIWYbm&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; sid = &amp;quot;&lt;/span&gt;ms-app:&lt;span style="color: rgb(0, 128, 0);"&gt;//s-1-15-2-2676450768-845737348-110814325-22306146-1119600341-293560589-2707026538&amp;quot;;&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;//Create some simple XML for a badge update&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; xml = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot; encoding=\&amp;quot;utf-8\&amp;quot; ?&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;        xml += &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;&amp;lt;badge value='alert'/&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;                    &lt;br /&gt;        PostToWns(secret, sid, uri, xml, &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;wns/badge&amp;quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;我们此处所进行的所有操作是检索通道 URI，构建 XML 负载，然后利用 WNS 进行身份验证，并对该通道 URI 进行 HTTP POST 操作。 最后两个步骤将在 Windows 开发中心内&lt;i&gt;&lt;/i&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh868252.aspx"&gt;快速入门： 发送推送通知&lt;/a&gt;主题中提到的 PostToWns 功能中进行。 由于完整列表中的大部分内容是围绕使用您从 Windows 应用商店获得的客户端秘钥和 SID 通过 OAuth（位于 https://login.live.com/accesstoken.srf）利用 WNS 进行身份验证，因此我在此处省略了完整列表。 这一身份验证的结果是生成一个随后将包含于我们发送到通道 URI 的 HTTP POST 中的访问标记：&lt;/p&gt;

&lt;p&gt;C#：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; PostToWns(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; secret, &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; sid, &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; uri, &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; xml, &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; type = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;wns/badge&amp;quot;&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// You should cache this access token&lt;/span&gt;&lt;br /&gt;        var accessToken = GetAccessToken(secret, sid);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;byte&lt;/span&gt;[] contentInBytes = Encoding.UTF8.GetBytes(xml);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// uri is the channel URI&lt;/span&gt;&lt;br /&gt;        HttpWebRequest request = HttpWebRequest.Create(uri) &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; HttpWebRequest;&lt;br /&gt;        request.Method = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;;&lt;br /&gt;        request.Headers.Add(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;X-WNS-Type&amp;quot;&lt;/span&gt;, type);&lt;br /&gt;        request.Headers.Add(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;, String.Format(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Bearer {0}&amp;quot;&lt;/span&gt;, accessToken.AccessToken));&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (Stream requestStream = request.GetRequestStream())&lt;br /&gt;            requestStream.Write(contentInBytes, 0, contentInBytes.Length);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse())&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; webResponse.StatusCode.ToString();&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;catch&lt;/span&gt; (WebException webException)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// Implements a maximum retry policy (omitted)&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;在本示例中，请注意 HTTP 请求中的 X-WNS-Type 标头将设为&lt;i&gt;&lt;/i&gt; wns/badge&lt;i&gt;&lt;/i&gt;，而且 Content-Type 标头将被默认设为 text/xml&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;。 对于磁贴而言，该类型应为 wns/tile&lt;i&gt;&lt;/i&gt;；而 Toast 将使用 wns/toast。&lt;i&gt;&lt;/i&gt; 对于原始通知，请使用 &lt;i&gt;&lt;/i&gt;wns/raw，并将 Content-Type 设置为 application/octet-stream。&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt; 欲了解有关标头的详细内容，请参阅文档中&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465435.aspx"&gt;推送通知服务请求和响应标头&lt;/a&gt;页面（英文）。&lt;/p&gt;

&lt;h3&gt;推送通知失败&lt;/h3&gt;

&lt;p&gt;当然，发送一个像这样的 HTTP 请求可能无法确保始终有效，WNS 将对 200 代码（成功）以外的其他内容发出响应的原因很多。 欲了解具体细节，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh465435.aspx" target="_blank"&gt;推送通知服务请求和响应标头&lt;/a&gt;页面（英文）中的“响应代码”部分；此处列出了一些更常见的错误和原因：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;通道 URI 无效（404 未找到）或过期（410 过期）。 在这些情况中，服务应将通道 URI 从其数据库中删除，并不再对该 URI 提出任何请求。&lt;/li&gt;

  &lt;li&gt;客户端秘钥和 SID 可能无效（401 未授权）或应用自身清单中的程序包 ID 与 Windows 应用商店中的 ID 不匹配（403 已禁止）。 确保这些 ID 匹配的最佳方式是使用 Visual Studio 中“应用商店” &amp;gt;“将应用与应用商店关联”的菜单命令（您可在 Visual Studio 2012 旗舰版的“项目”菜单中找到这一命令）。&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/li&gt;

  &lt;li&gt;原始通知负载超过 5KB（413 请求实体过大）。&lt;/li&gt;

  &lt;li&gt;客户端可能处于脱机状态，此时 WNS 将自动再次尝试，并最终报告错误。 对于 XML 通知，默认行为是缓存推送通知，并在客户端恢复联机状态时传送。 对于原始通知，系统将在默认情况下禁用缓存，您可通过将针对通道 URI 的请求中的&lt;i&gt;&lt;/i&gt; X-WNS-Cache-Policy 标头设置为 cache&lt;i&gt; &lt;/i&gt;而更改这一默认设置。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;对于其他错误（400 请求无效），请确保 XML 负载包含 UTF-8 编码文本，而且原始通知位于 base64，并将 Content-Type&lt;i&gt;&lt;/i&gt; 标头设为 &lt;i&gt;&lt;/i&gt;application/octet-stream。 WNS 也有可能因为您试图在一个特定时期内发送过多推送通知而限制传送。&lt;/p&gt;

&lt;p&gt;如果应用未显示于锁屏界面中，而且设备处于连接待机状态，那么系统也有可能拒绝原始推送通知。 由于在这一情形中（以及应用未处于前台时），Windows 将阻止向非锁屏界面应用发送的原始通知，因此 WNS 对此进行了优化，其可删除其知道不会被传送的通知。&lt;/p&gt;

&lt;h2&gt;Windows Azure 移动服务&lt;/h2&gt;

&lt;p&gt;既然我们已经了解了使用推送通知的复杂细节，甚至是省略了存储的问题，那么您可能在想“有没有什么办法能让这一切变得更加简单？”试想一下为了有望十分庞大，并不断扩展的客户库而管理有可能成千上万个通道 URI 需要花费多少精力！&lt;/p&gt;

&lt;p&gt;幸运的是，您并不是提出此类问题的第一人。 除了诸如 Urban Airship 等公司所提供的第三方解决方案以外，Windows Azure 移动服务也可大幅简化您的生活。&lt;/p&gt;

&lt;p&gt;Windows Azure 移动服务（我将其简称 AMS）为我们一直在探讨的服务细节提供了一个预构建的解决方案（基本为一些 REST 端点）。 “移动服务”基本上是在以您的名义管理数据库，并提供库功能，进而让您向 WNS 轻松发送负载。 您可在&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/09/05/windows-azure.aspx" target="_blank"&gt;使用 Windows Azure 移动服务将云添加到您的应用&lt;/a&gt;页面中找到 AMS 简介。&lt;/p&gt;

&lt;p&gt;特别是对于推送通知而言，请首先在&lt;a href="http://go.microsoft.com/fwlink/?LinkId=257545&amp;amp;clcid=0x409" target="_blank"&gt;面向 Windows 8 的 Windows Azure 移动服务 SDK&lt;/a&gt; 中获得客户端库。 然后参阅&lt;a href="http://www.windowsazure.com/zh-cn/develop/mobile/tutorials/get-started-with-push-dotnet/" target="_blank"&gt;移动服务中的推送通知入门&lt;/a&gt;页面（英文）（请注意，其中还包含&lt;a href="http://www.windowsazure.com/zh-cn/develop/mobile/tutorials/get-started-with-push-js/" target="_blank"&gt;同一主题 JavaScript 版本&lt;/a&gt;的内容），该页面（英文）描述了 AMS 将如何帮助您满足我们此前所提到的所有连接要求：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;利用 Windows 应用商店注册应用： 当您从 Windows 应用商店获得了您应用的客户端秘钥和 SID 之后，请在移动服务配置中保存这些值。 参阅此前提到的&lt;a href="http://www.windowsazure.com/zh-cn/develop/mobile/tutorials/get-started-with-push-dotnet/" target="_blank"&gt;入门&lt;/a&gt;主题中“为 Windows 应用商店注册您的应用”的部分。&lt;/li&gt;

  &lt;li&gt;获取并刷新通道 URI： 请求并管理应用中的通道 URI 纯粹是一个客户端的问题，而且这一问题与之前没有任何变化。&lt;/li&gt;

  &lt;li&gt;将通道 URI 发送到服务： 利用 AMS，这一步骤的难度将大幅降低。 首先，您将（通过 Windows Azure 门户）在移动服务中创建一个数据库表格。 然后，应用可简单地将记录插入该表格，并附加上通道 URI 以及任何其他您希望附加的关键信息。 AMS 客户端库将在后台处理 HTTP 请求，甚至将服务器中的任何变更更新到客户端记录中。 此外，AMS 能够通过用户的 Microsoft 帐户来自动处理身份验证，如果您使用三个其他 OAuth 提供商（Facebook、Twitter 或 Google）之一注册了您的应用，那么您也可通过该提供商来自动处理身份验证。 请参阅&lt;a href="http://www.windowsazure.com/zh-cn/develop/mobile/tutorials/get-started-with-users-js/" target="_blank"&gt;移动服务中的身份验证入门&lt;/a&gt;页面（英文）。&lt;/li&gt;

  &lt;li&gt;发送通知： 在移动服务中，您可将脚本（采用名为 Node.js 的 JavaScript 的变种语言编写）附加到数据操作中，并使用 JavaScript 创建计划的作业。 在这些脚本中，使用一个通道 URI 和一个负载来简单地调用 push.wns 对象将向该通道生成必要的 HTTP 请求。&lt;i&gt;&lt;/i&gt; 捕获推送失败并使用 console.log 记录响应也非常简单。&lt;i&gt;&lt;/i&gt; 您可在 Windows Azure 门户中轻松查看这些日志。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;欲了解更多详细内容，请参阅以下两份示例教程： &lt;a href="http://code.msdn.microsoft.com/windowsapps/Tile-Toast-and-Badge-Push-90ee6ff1" target="_blank"&gt;使用 Windows Azure 移动服务的磁贴、Toast 和锁屏提醒推送通知&lt;/a&gt;（英文）和 &lt;a href="http://code.msdn.microsoft.com/windowsapps/Raw-Notifications-using-adb63a01" target="_blank"&gt;Windows Azure 移动服务的原始通知&lt;/a&gt;（英文）。 在此处，我们并不会重复这些指令，而是介绍其中的一些要点。&lt;/p&gt;

&lt;p&gt;当您设置了一项移动服务后，该服务将拥有一个特定的服务 URL。 您将在创建 AMS SDK 内的 MobileServiceClient 对象的实例时使用该 URL：&lt;i&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; mobileService = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Microsoft.WindowsAzure.MobileServices.MobileServiceClient(&lt;br /&gt;    &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;https://{mobile-service-url}.azure-mobile.net/&amp;quot;&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;{mobile-service-key}&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;

    &lt;br /&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;C#：&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; Microsoft.WindowsAzure.MobileServices;&lt;br /&gt;&lt;br /&gt;MobileServiceClient MobileService = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; MobileServiceClient(&lt;br /&gt;    &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;https://{mobile-service-url}.azure-mobile.net/&amp;quot;&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;{mobile-service-key}&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;C++&lt;/strong&gt;（引自&lt;a href="http://code.msdn.microsoft.com/windowsapps/C-Windows-Store-apps-and-ab1ea114"&gt;其他示例&lt;/a&gt;）：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;namespace&lt;/span&gt; Microsoft::WindowsAzure::MobileServices;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;auto&lt;/span&gt; MobileService = ref &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; MobileServiceClient(&lt;br /&gt;    ref &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Uri(L&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot; https://{mobile-service-url}.azure-mobile.net/&amp;quot;&lt;/span&gt;), &lt;br /&gt;    ref &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; String(L&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;{mobile-service-key}&amp;quot;&lt;/span&gt;));&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;这一类别将所有 HTTP 通信与服务相结合，因而无需您考虑所有低级别的管道。&lt;/p&gt;

&lt;p&gt;要使用特定的 OAuth 提供程序进行身份验证，请使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windowsazure/jj554236.aspx"&gt;login&lt;i&gt;&lt;/i&gt;&lt;/a&gt; 或 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windowsazure/jj553650.aspx"&gt;LoginAsync&lt;i&gt;&lt;/i&gt;&lt;/a&gt; 方法，这一方法的结果是生成向应用提供该信息的 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windowsazure/jj554220.aspx"&gt;User&lt;i&gt;&lt;/i&gt;&lt;/a&gt; 对象。 （一旦完成身份验证，&lt;i&gt;&lt;/i&gt;客户端对象的 CurrentUser 属性也将包含用户 ID。） 当您直接这样验证移动服务的身份时，服务将拥有访问用户 ID 的权限，无需客户端显示发送：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;mobileService.login(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;facebook&amp;quot;&lt;/span&gt;).done(&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (user) { &lt;span style="color: rgb(0, 128, 0);"&gt;/* ... */&lt;/span&gt; });&lt;br /&gt;mobileService.login(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;twitter&amp;quot;&lt;/span&gt;).done(&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (user) { &lt;span style="color: rgb(0, 128, 0);"&gt;/* ... */&lt;/span&gt; });&lt;br /&gt;mobileService.login(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;google&amp;quot;&lt;/span&gt;).done(&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (user) { &lt;span style="color: rgb(0, 128, 0);"&gt;/* ... */&lt;/span&gt; });&lt;br /&gt;mobileService.login(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;microsoftaccount&amp;quot;&lt;/span&gt;).done(&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (user) { &lt;span style="color: rgb(0, 128, 0);"&gt;/* ... */&lt;/span&gt; });&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;C#：&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;MobileServiceUser user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook);&lt;br /&gt;MobileServiceUser user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.Twitter);&lt;br /&gt;MobileServiceUser user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.Google);&lt;br /&gt;MobileServiceUser user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount);&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;C++：&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;task&amp;lt;MobileServiceUser^&amp;gt; (MobileService-&amp;gt;LoginAsync(MobileServiceAuthenticationProvider::Facebook))&lt;br /&gt;    .then([&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;](MobileServiceUser^ user) { &lt;span style="color: rgb(0, 128, 0);"&gt;/* */&lt;/span&gt; } );&lt;br /&gt;task&amp;lt;MobileServiceUser^&amp;gt; (MobileService-&amp;gt;LoginAsync(MobileServiceAuthenticationProvider::Twitter))&lt;br /&gt;    .then([&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;](MobileServiceUser^ user) { &lt;span style="color: rgb(0, 128, 0);"&gt;/* */&lt;/span&gt; } );&lt;br /&gt;task&amp;lt;MobileServiceUser^&amp;gt; (MobileService-&amp;gt;LoginAsync(MobileServiceAuthenticationProvider::Google))&lt;br /&gt;    .then([&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;](MobileServiceUser^ user) { &lt;span style="color: rgb(0, 128, 0);"&gt;/* */&lt;/span&gt; } );&lt;br /&gt;task&amp;lt;MobileServiceUser^&amp;gt; (MobileService-&amp;gt;LoginAsync(MobileServiceAuthenticationProvider::MicrosoftAccount))&lt;br /&gt;    .then([&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;](MobileServiceUser^ user) { &lt;span style="color: rgb(0, 128, 0);"&gt;/* */&lt;/span&gt; } );&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;向服务发送通道 URI 也是一个在该服务的数据库中存储记录的简单操作，客户端对象将发出 HTTP 请求。 要进行这一操作，只需按照此前提供链接的推送通知教程中的一下示例所显示的，请求数据库对象，并插入记录。 在每个代码段中，假设&lt;i&gt;&lt;/i&gt; ch 包含来自 WinRT API 的 &lt;i&gt;&lt;/i&gt;PushNotificationChannel。 您也可在构建的 channel 对象中包含任何其他属性，例如一个辅助磁贴 ID 或可识别通道目的的其他数据。&lt;i&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript：&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; channelTable = MobileServicesSample.mobileService.getTable(&lt;span style="color: rgb(0, 96, 128);"&gt;'Channels'&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; channel = {&lt;br /&gt;    uri: ch.uri, &lt;br /&gt;    expirationTime: ch.expirationTime.&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;channelTable.insert(channel).done(&lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; (item) {&lt;br /&gt;&lt;br /&gt;    },&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;function&lt;/span&gt; () {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// Error on the insertion.&lt;/span&gt;&lt;br /&gt;    });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;C#： &lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;var channel = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Channel { Uri = ch.Uri, ExpirationTime = ch.ExpirationTime };&lt;br /&gt;var channelTable = privateClient.GetTable&amp;lt;Channel&amp;gt;();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (ApplicationData.Current.LocalSettings.Values[&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;ChannelId&amp;quot;&lt;/span&gt;] == &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;// Use try/catch block here to handle exceptions&lt;/span&gt;&lt;br /&gt;    await channelTable.InsertAsync(channel);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;C++：&lt;/strong&gt; &lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;auto&lt;/span&gt; channel = ref &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; JsonObject();&lt;br /&gt;channel-&amp;gt;Insert(L&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Uri&amp;quot;&lt;/span&gt;, JsonValue::CreateStringValue(ch-&amp;gt;Uri));&lt;br /&gt;channel-&amp;gt;Insert(L&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;ExpirationTime&amp;quot;&lt;/span&gt;, JsonValue::CreateBooleanValue(ch-&amp;gt;ExpirationTime));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;auto&lt;/span&gt; table = MobileService-&amp;gt;GetTable(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Channel&amp;quot;&lt;/span&gt;);&lt;br /&gt;task&amp;lt;IJsonValue^&amp;gt; (table-&amp;gt;InsertAsync(channel))&lt;br /&gt;    .then([&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;, item](IJsonValue^ V) { &lt;span style="color: rgb(0, 128, 0);"&gt;/* ... */&lt;/span&gt; });&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;请注意，一旦通道记录被插入，那么服务可能对该记录进行的任何变更和添加都将在客户端中反映出来。&lt;/p&gt;

&lt;p&gt;此外，如果您在 &lt;i&gt;&lt;/i&gt;GetTable/getTable&lt;i&gt;&lt;/i&gt; 调用中拼写错数据库的名称，那么您在试图插入一条记录之前不会看到任何异常。 这将是一个难于跟踪的错误，因此在您确信所有内容都应运行无误，但事实并非如此时，请查看数据库的名称。&lt;/p&gt;

&lt;p&gt;现在，这些对客户端的插入内容已经转换成面向服务的 HTTP 请求，但是即使是在服务端中，这一过程也未向您显示。 您不需要接收和处理请求，您只需将自定义脚本附加到每个数据库操作中（插入、读取、更新和删除）。&lt;/p&gt;

&lt;p&gt;这些脚本采用 Node.js 中可用的相同固有对象和方法被编写成 JavaScript 函数（所有这些均与应用内任何客户端 JavaScript 无关）。 每个函数将接收适当的参数： &lt;i&gt;&lt;/i&gt;insert 和 update &lt;i&gt;&lt;/i&gt;将接收新纪录，delete 将接收项目的 ID，而 read 将接收一项查询。&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt; 如果应用采用移动服务对用户进行身份验证，那么所有函数还将接收一个&lt;i&gt;&lt;/i&gt; user 用户对象和一个&lt;i&gt;&lt;/i&gt;可让您执行操作并生成将成为 HTTP 响应的内容的 request 对象。&lt;/p&gt;

&lt;p&gt;最简单（和默认的）&lt;i&gt;&lt;/i&gt; insert 脚本，只需原样执行请求并插入记录，item&lt;i&gt;&lt;/i&gt;：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(204, 102, 51);"&gt;function&lt;/span&gt; insert(item, user, request) {&lt;br /&gt;    request.execute();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;如果您希望在记录中附加时间戳和用户 ID，那么这与在执行请求之前将这些属性添加到 item 参数一样简单：&lt;i&gt; &lt;/i&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(204, 102, 51);"&gt;function&lt;/span&gt; insert(item, user, request) {&lt;br /&gt;    item.user = user.userId;&lt;br /&gt;    item.createdAt = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Date();&lt;br /&gt;    request.execute();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;请注意，&lt;i&gt;&lt;/i&gt;在插入数据库之前对本脚本中 item 所做的变更将自动传播回客户端。 在上述代码中，&lt;i&gt;&lt;/i&gt;一旦插入操作成功，则客户端中的 channel 对象将包含 user 和 createdAt 属性&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;。 一切非常方便！&lt;/p&gt;

&lt;p&gt;服务脚本也可在&lt;i&gt;&lt;/i&gt; request.execute 后执行其他操作，特别是作为对成功或失败的响应，但是此处我不做详细解释，请参阅&lt;a href="http://msdn.microsoft.com/zh-cn/library/windowsazure/jj591477.aspx"&gt;服务器脚本示例操作文档（英文）&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;现在，让我们返回推送通知，将通道 URI 保存到表格中只是中的一部分，服务可能将发送通知作为对特定事件的响应，也可能不发送。 服务更有可能拥有包含更多信息的其他表格，在这些表格中所执行的操作将对通道 URI 的一些子集触发通知。 我们将在下一部分探讨一些示例。 无论是在哪一情形中，您都将使用 &lt;a href="https://github.com/tjanczuk/wns/blob/master/README.md"&gt;push.wns&lt;i&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;&lt;/i&gt; 对象从一个脚本发送一个推送通知。 发送特定类型的更新（包括原始）也有许多方法，其中磁贴、Toast 和锁屏提醒直接通过与可用模板相匹配的名称方法运行。 例如：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;push.wns.sendTileSquarePeekImageAndText02(channel.uri, {&lt;br /&gt;    image1src: baseImageUrl + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;image1.png&amp;quot;&lt;/span&gt;,&lt;br /&gt;    text1: &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Notification Received&amp;quot;&lt;/span&gt;,&lt;br /&gt;    text2: item.text&lt;br /&gt;}, {&lt;br /&gt;    success: &lt;span style="color: rgb(204, 102, 51);"&gt;function&lt;/span&gt; (pushResponse) {&lt;br /&gt;        console.log(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Sent Tile Square:&amp;quot;&lt;/span&gt;, pushResponse);&lt;br /&gt;    },&lt;br /&gt;    error: &lt;span style="color: rgb(204, 102, 51);"&gt;function&lt;/span&gt; (err) {&lt;br /&gt;        console.log(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Error sending tile:&amp;quot;&lt;/span&gt;, err);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;push.wns.sendToastImageAndText02(channel.uri, {&lt;br /&gt;    image1src: baseImageUrl + &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;image2.png&amp;quot;&lt;/span&gt;,&lt;br /&gt;    text1: &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Notification Received&amp;quot;&lt;/span&gt;,&lt;br /&gt;    text2: item.text&lt;br /&gt;}, {&lt;br /&gt;    success: &lt;span style="color: rgb(204, 102, 51);"&gt;function&lt;/span&gt; (pushResponse) {&lt;br /&gt;        console.log(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Sent Toast:&amp;quot;&lt;/span&gt;, pushResponse);&lt;br /&gt;    }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;push.wns.sendBadge(channel.uri, {&lt;br /&gt;    value: value,&lt;br /&gt;    text1: &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Notification Received&amp;quot;&lt;/span&gt;&lt;br /&gt;}, {&lt;br /&gt;    success: &lt;span style="color: rgb(204, 102, 51);"&gt;function&lt;/span&gt; (pushResponse) {&lt;br /&gt;        console.log(&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Sent Badge:&amp;quot;&lt;/span&gt;, pushResponse);&lt;br /&gt;    }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;此外，&lt;i&gt;&lt;/i&gt;console.log 函数将在您可在 Azure Mobile 服务门户中看到的日志中创建一个条目，通常情况下，您希望记录错误处理程序中的调用，如上述磁贴通知所示。&lt;/p&gt;

&lt;p&gt;您可能注意到 &lt;i&gt;&lt;/i&gt;send* 方法分别与一个特定的模板所绑定，对于磁贴而言，其意味着宽形负载和方形负载必须作为两个通知分别发送。 请记住，由于用户将控制磁贴在其“开始”屏幕上的显示方式，因此您几乎始终希望同时发送两种尺寸。 借助 push.wns 中模板特定 send 函数，那么，这就意味着进行两次顺序调用，其中每次调用将生成一个单独的推送通知。&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;为了合并多个更新，其中包括一次发送包含不同标记的多个磁贴更新或发送多个 Toast，您应使用&lt;i&gt;&lt;/i&gt; push.wns.sendTile 和 push.wns.sendToast&lt;i&gt;&lt;/i&gt; 方法。 例如：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;var channel = &lt;span style="color: rgb(0, 96, 128);"&gt;'{channel_url}'&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;push.wns.sendTile(channel,&lt;br /&gt;    { type: &lt;span style="color: rgb(0, 96, 128);"&gt;'TileSquareText04'&lt;/span&gt;, text1: &lt;span style="color: rgb(0, 96, 128);"&gt;'Hello'&lt;/span&gt; },&lt;br /&gt;    { type: &lt;span style="color: rgb(0, 96, 128);"&gt;'TileWideText09'&lt;/span&gt;, text1: &lt;span style="color: rgb(0, 96, 128);"&gt;'Hello'&lt;/span&gt;, text2: &lt;span style="color: rgb(0, 96, 128);"&gt;'How are you?'&lt;/span&gt; },&lt;br /&gt;    { client_id: &lt;span style="color: rgb(0, 96, 128);"&gt;'{your Package Security Identifier}'&lt;/span&gt;, client_secret: &lt;span style="color: rgb(0, 96, 128);"&gt;'{your Client Secret}'&lt;/span&gt; },&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(204, 102, 51);"&gt;function&lt;/span&gt; (error, result) {&lt;br /&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;// ...&lt;/span&gt;&lt;br /&gt;    });&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;在更低的级别上，&lt;i&gt;&lt;/i&gt;push.wns.send 可让您准确获得通知内容；&lt;i&gt;&lt;/i&gt;push.wns.sendRaw 也将在这一级别中面向原始通知可用。 欲查看全部详细内容，请再次参阅 &lt;a href="https://github.com/tjanczuk/wns/blob/master/README.md" target="_blank"&gt;push.wns&lt;/a&gt;&lt;i&gt;&lt;/i&gt; 对象文档（英文）。&lt;/p&gt;

&lt;h2&gt;使用 Windows Azure 移动服务的实际应用场景&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/windowsapps/Tile-Toast-and-Badge-Push-90ee6ff1" target="_blank"&gt;使用 Windows Azure 移动服务的磁贴、Toast 和锁屏提醒推送通知&lt;/a&gt;中的示例应用向您展示了如何发送推送通知以响应插入数据库表格中的新消息。 然而，这意味着应用最终将向自身发送推送通知，而通常情况中都无需进行这一操作（除非可能向用户的其他设备上的同一应用发送通知）。&lt;/p&gt;

&lt;p&gt;服务更有可能发送推送通知响应发生于最终将接收这些通知的应用/磁贴以外的事件。 让我们考虑一些应用场景：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;使用社交网络&lt;/b&gt;： &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;应用可采用用户的社交网络来实施诸如向好友发起挑战等功能。 例如，当一名用户在某一游戏中创造了一个新的最高分时，您可能希望通过动态磁贴或 Toast 向该用户同样安装了该款游戏的朋友发起挑战。 同样情形还可能发生于健身应用中，您可能在该应用中发布了进行某类活动的最佳时间。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;要进行这一操作，应用可在适当的移动服务表格中插入一个新的记录（分数、最佳时间等）。 在插入的脚本内，服务将查询当前用户的合适的朋友，并向这些通道 URI 发送通知。 其他查询标准描述了游戏的确切方面、（辅助磁贴）将描述某类特别的运动等。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;天气更新和警报&lt;/b&gt;： &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;天气应用通常可让您向应用主磁贴分配一个位置，并为其他位置创建一个辅助磁贴。 对于每个磁贴而言，重要的信息是该位置的纬度和经度，应用（通过将这些信息插入表格）而将其与每个通道 URI 一同发送到服务。 为了向该通道触发一个更新，该服务可能拥有另一可为更新和警报而定期查询中央天气服务，然后处理这些响应，并将适当的消息插入移动服务警报表格中的进程（例如下面所描述的计划的作业）。 插入脚本然后将检索适当的通道 URI 并发送更新。 另外，如果一项天气服务自身可让您注册警报或定期更新，则该服务中的另一页面将接收这些请求（最有可能为 HTTP PUT），处理这些请求，并调用移动服务来插入记录，进而触发一项更新。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;消息传递&lt;/b&gt;： &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;处理即时消息与接收天气更新的方式一模一样。 另一进程将监视新消息的接收，例如定期检查传入消息，或注册消息源以在新消息到达时发出警报。 在这两种情形的任何一种中，新消息的到达将向适当的通道触发推送通知。 在这一情形中，通道 URI 与用户的磁贴相关联，以进行特定类型的消息传递。 由于这与本博文开始所描述的电子邮件应用场景较为相似，因此您可能将在这一情形中使用原始通知。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;请注意，在所有这些应用场景中，您并没有必要在数据库中插入任何内容。 如果您不在插入脚本中调用 request.execute&lt;i&gt;&lt;/i&gt;，那么所有操作都不会在数据库中结束，但是您仍需要在该脚本中执行诸如发送通知等其他任务。 换句话说，您不需要将您此后不会使用的记录填充到数据库中，特别是当考虑到存储数据将引发成本时，您更应避免这一操作。&lt;/p&gt;

&lt;p&gt;另请注意 Azure 移动服务中拥有一个用于计划作业的设施，您可在&lt;a href="http://www.windowsazure.com/zh-cn/develop/mobile/tutorials/schedule-backend-tasks/" target="_blank"&gt;在移动服务中计划重复执行作业&lt;/a&gt;页面（英文）阅读有关内容。 该类作业可经常从其他服务检索数据、处理数据，并将记录插入该服务的数据库中，并再次触发推送通知。 同样的，正如我们在本博文系列的第 2 部分中指出的，其他网页和移动应用也可更改该数据库并触发推送通知。 移动服务中的数据库脚本将在所有这些情形中运行。&lt;/p&gt;

&lt;h2&gt;结语&lt;/h2&gt;

&lt;p&gt;总结一下这一博文系列，我们探讨了“活力无限”对于用户、开发人员、应用和服务的全部含义。 我们了解了磁贴、锁屏提醒和 Toast 更新，如何设置定期通知，如何将后台任务作为这一过程中的一部分来使用，以及处理定期和推送通知的服务结构。 很显然，Windows Azure 移动服务让我们从更高的级别了解了整个推送通知的运行过程。 相比从零开始编写全新服务，Windows Azure 无疑有助于您提高工作效率，并有望免除您很多烦恼。&lt;/p&gt;

&lt;p&gt;Kraig Brockschmidt
  &lt;br /&gt;Windows 生态系统团队项目经理 

  &lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2012/10/29/free-ebook-programming-windows-8-apps-with-html-css-and-javascript.aspx"&gt;使用 HTML、CSS 和 JavaScript 编程 Windows 8 应用&lt;i&gt;&lt;/i&gt;&lt;/a&gt;作者&lt;/p&gt;
 
&lt;!-- Title: “活力无限（第 3 部分）： 推送通知与 Windows Azure 移动服务” Tags: “移动服务, Azure, 推送通知, Windows Azure 移动服务, WNS, 磁贴更新” --&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10406342" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_FB79A8520D67A152_/">移动服务</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Azure/">Azure</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_A86301901A90E577_/">推送通知</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+Azure+_FB79A8520D67A152_/">Windows Azure 移动服务</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/WNS/">WNS</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_C178348DF466B065_/">磁贴更新</category></item><item><title>活力无限（第 2 部分）：针对动态磁贴编写和调试服务</title><link>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/03/11/10401301.aspx</link><pubDate>Mon, 11 Mar 2013 19:00:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10401301</guid><dc:creator>Windows 8 Team</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/windowsappdev_cn/rsscomments.aspx?WeblogPostID=10401301</wfw:commentRss><comments>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/03/11/10401301.aspx#comments</comments><description>&lt;div class="PostContent"&gt; &lt;p&gt;在&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/03/05/1-toast.aspx" target="_blank"&gt;本博文系列的第 1 部分&lt;/a&gt;中我们探讨了为 Windows 8 的整体用户体验注入“活力”的磁贴更新、徽章更新和 toast 通知的本质。特别是，我们了解了这些通知如何与以下 XML 负载进行组合：稍后将通过正在运行的应用或后台任务在本地发布，或者可以应在线服务的请求进行提供。&lt;/p&gt;  &lt;p&gt;使用 Visual Studio Express 2012 或适用于 Windows 8 的 Visual Studio Ultimate 2012，生成 XML 负载并通过正在运行的应用对其进行发布并非难事，可以在应用中轻松完成开发和调试。&lt;a href="http://code.msdn.microsoft.com/windowsapps/zh-cn/App-tiles-and-badges-sample-5fc49148" target="_blank"&gt;应用磁贴和徽章示例&lt;/a&gt;、&lt;a href="http://code.msdn.microsoft.com/windowsapps/zh-cn/Secondary-Tiles-Sample-edf2a178" target="_blank"&gt;辅助磁贴示例&lt;/a&gt;以及&lt;a href="http://code.msdn.microsoft.com/windowsapps/zh-cn/Scheduled-notifications-da477093" target="_blank"&gt;计划通知示例&lt;/a&gt;向您展示了整个过程。&lt;/p&gt;  &lt;p&gt;开发和调试 Web 服务以支持定期更新以及推送通知所需的工作略多一些。&lt;a href="http://code.msdn.microsoft.com/windowsapps/zh-cn/Push-and-periodic-de225603" target="_blank"&gt;推送与定期通知客户端示例&lt;/a&gt;中出色地展示了客户端的这些情形，但是要充分利用该示例，您需要结合使用一些服务！在本篇博文中，我们特别介绍了如何开发支持针对磁贴和徽章更新的定期通知的服务，重点讲解在将这些服务部署到生产环境之前使用 Visual Studio 工具和本地主机调试服务。我们还将着手探索如何使用 Windows Azure 移动服务实现上述目的，这样做对于支持推送通知也会非常有帮助，我们将在第 3 部分中对此进行介绍。&lt;/p&gt;  &lt;h2&gt;服务的本质&lt;/h2&gt;  &lt;p&gt;支持定期磁贴和徽章更新的服务实际起到了哪些作用？我们首先回顾一下我们所谓的“服务”的含义，这个词往往会令那些主要致力于客户端应用的开发人员心生畏惧。&lt;/p&gt;  &lt;p&gt;用最简单的话来说，服务就是存储在某一 Web 服务器上的一段代码，该代码会应针对它的 HTTP 请求在该服务器上运行。&lt;i&gt;&lt;/i&gt;HTML 页面（.htm 或 .html）的机制并非如此：这些页面不涉及服务器端代码，服务器仅返回页面的文本，所有处理过程都在客户端上完成（包括运行页面中包含的任何客户端脚本）。不过，如果您的页面 URI 的后缀为 php、asp、aspx、cgi、cshtml 或一些其他服务器端扩展名，您将有效地从常规意义上谈论“服务”。&lt;/p&gt;  &lt;p&gt;服务负责接收客户端 HTTP 请求，处理 URI 中可能包含的任何参数并返回适当的文本响应。对于使用 PHP 或 ASP.NET 之类的技术编写的网页，这些响应应采用 HTML 形式。&lt;i&gt;&lt;/i&gt;实施 Web API 的服务，如 Facebook 和 Twitter 中的服务（以及成千上万的其他服务！），通常接受 URI 查询字符串中（或请求标头中）任意数量的参数并在响应中返回 XML 或 JSON 数据。（注意，我们在此谈论的是构建于&lt;a href="http://zh.wikipedia.org/wiki/Representational_state_transfer" target="_blank"&gt;代表性状态传输&lt;/a&gt;（即 REST）之上的服务，而不是构建于其他协议（如 &lt;a href="http://zh.wikipedia.org/wiki/SOAP" target="_blank"&gt;SOAP&lt;/a&gt;）之上的服务，原因是 REST 在当前的服务中最常见。）&lt;/p&gt;  &lt;p&gt;因此，提供定期磁贴和/或徽章更新的服务只是存在于应用出于此目的向 Windows 提供的 URI 中的一种服务，使用适当的 XML 负载对 HTTP 请求作出响应。该负载包含与任何支持的模板相对应的元素，在其中可以使用其他 URI 引用图像（不支持内联编码）。负载中包含的特定信息还可以来自任何来源，我们将在稍后进行介绍。&lt;/p&gt;  &lt;p&gt;然而，抛开这些细节，所有此类服务都共用类似的结构：接收和处理请求，然后构建 XML 响应。现在，我们来看一下如何创建这种基本结构。&lt;/p&gt;  &lt;h2&gt;编写服务&lt;/h2&gt;  &lt;p&gt;要编写和调试服务，您可以使用支持所选服务器端语言的任何工具。在此我们将重点关注 Visual Studio，特别是 Visual Studio Ultimate 2012 和 &lt;a href="http://msdn.microsoft.com/zh-cn/subscriptions/dd537667(v=vs.110).aspx" target="_blank"&gt;Visual Studio Express 2012 for Web&lt;/a&gt;&lt;b&gt;&lt;/b&gt;，后者随其 Windows 伙伴（您已了解）一起免费提供。要进行安装，请运行 &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx" target="_blank"&gt;Web Platform Installer&lt;/a&gt;，通过此工具，您还可以安装各种其他相关的技术，例如 PHP 和 WebMatrix。这样一来您可以使用各种语言创建服务。&lt;/p&gt;  &lt;p&gt;以下代码是一个非常简单的示例，包含一个完整的 PHP 服务，该服务用于响应徽章更新 XML 负载，其中徽章值设置为当前日期（注意，该日期应与服务器保持一致！）。这段代码出自免费电子书第 13 章&lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2012/10/29/free-ebook-programming-windows-8-apps-with-html-css-and-javascript.aspx" target="_blank"&gt;使用 HTML、CSS 和 JavaScript 编程 Windows 8 应用&lt;/a&gt;中的 HelloTiles 示例站点：&lt;/p&gt;  &lt;blockquote&gt;   &lt;div id="codeSnippetWrapper"&gt;     &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;php&lt;/span&gt;&lt;br /&gt;    echo '&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;xml&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;encoding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;';&lt;br /&gt;    echo &amp;quot;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;badge&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;='&amp;quot;.date(&amp;quot;j&amp;quot;).&amp;quot;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&amp;quot;;&lt;br /&gt;?&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;可以直接试用此服务。单击 Windows Azure 网站上为实现此目的而建立的链接--&lt;a href="http://programmingwin8-js-ch13-hellotiles.azurewebsites.net/dayofmonthservice.php"&gt;http://programmingwin8-js-ch13-hellotiles.azurewebsites.net/dayofmonthservice.php&lt;/a&gt;--您将看到返回的 XML 如下所示：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;xml&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;encoding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;UTF-8&amp;quot;&lt;/span&gt;?&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;badge&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;24&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;试用&lt;a href="http://code.msdn.microsoft.com/windowsapps/zh-cn/Push-and-periodic-de225603" target="_blank"&gt;推送与定期通知客户端示例&lt;/a&gt;的应用场景 5“轮询徽章更新”中的同一 URI。首次运行此应用（在 Visual Studio Express for Windows 内）时，其磁贴会显示在“开始”屏幕上，如下所示：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5008.push_5F00_js_5F00_1_5F00_5F4DC8FF.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="轮询徽章更新磁贴" border="0" alt="轮询徽章更新磁贴" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/2845.push_5F00_js_5F00_1_5F00_thumb_5F00_061BDF40.png" width="400" height="193" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;现在，将上述 URI 输入到应用场景 5 的文本框中，按开始定期更新按钮，在连接到网络的情况下，您很快就会看到示例的磁贴上显示数字徽章：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0702.push_5F00_js_5F00_2_5F00_6600D282.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="带有数字徽章的磁贴" border="0" alt="带有数字徽章的磁贴" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/7658.push_5F00_js_5F00_2_5F00_thumb_5F00_45E5C5C5.png" width="400" height="193" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;注意，Windows 会在应用开始定期更新后立即开始尝试轮询更新，随后以指定的时间间隔持续进行轮询。&lt;/p&gt;

&lt;p&gt;要查看更完整的 PHP 示例，请参见&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/04/24/10297319.aspx" target="_blank"&gt;打造卓越的磁贴体验（第 2 部分）&lt;/a&gt;，其中显示了磁贴更新的更多定制。在此示例中，假设的 get_trucks_from_database 函数使用 URI 的查询字符串参数中包含的邮政编码对数据库进行查询，然后使用该查询的结果生成 XML 响应。&lt;i&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;除此之外服务还可以做更多事情。例如：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;使用上述日期 PHP 服务，由于可以轻松地将服务器定位到其他时区，因此应用可以通过在查询字符串中指出其当地时区来获得更准确的日期。&lt;/li&gt;

  &lt;li&gt;天气服务可以通过在 URI 中使用经度和纬度值来检索该位置的当前天气情况。&lt;/li&gt;

  &lt;li&gt;服务可以动态生成图像并将其存储在 Web 服务器上，然后将适当的 URI 插入到 XML 负载中。&lt;/li&gt;

  &lt;li&gt;服务会将其自己的请求发送给其他服务以获取更多数据，通过查询字符串参数进行定制（此后会有更多此类功能）。&lt;/li&gt;

  &lt;li&gt;如果应用启用磁贴更新队列（请参见 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.ui.notifications.tileupdater.enablenotificationqueue.aspx" target="_blank"&gt;EnableNotificationQueue&lt;/a&gt;&lt;i&gt;&lt;/i&gt; 方法），可以指定最多五个单独的 URI 来轮询定期更新，如&lt;a href="http://code.msdn.microsoft.com/windowsapps/zh-cn/Push-and-periodic-de225603" target="_blank"&gt;推送与定期通知客户端示例&lt;/a&gt;应用场景 4 中所示。磁贴更新队列将使用每个 URI 中的更新进行填充。当然，其中每个 URI 都可以通过其自己的查询字符串实现进一步定制，因此，同一服务自身可以适应所有请求。&lt;/li&gt;

  &lt;li&gt;应用可以在查询字符串中包括用户 ID，这样一来，服务可以通过对其数据存储进行查询了解用户的试用历史记录、他们在游戏中取得的高分以及他们通过已注册的源获得的新闻等。在这种情况下，用户 ID 就成为个人身份信息 (PII)，因此，应用必须尊重隐私。这意味着应用应在查询字符串中对用户名进行加密或使用 https:// URI。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;注意&lt;/b&gt;：Windows 未在定期更新机制中提供通过服务对用户进行身份验证的方法。只有使用推送通知（或在清单中声明企业身份验证功能的企业应用场景中）才能实现这一级别的支持。&lt;/p&gt;

&lt;p&gt;当然，服务也可以使用其他技术编写。ASP.NET 是个不错的选择，使用此技术，您可以在随后采用可在应用中使用的 &lt;a href="http://msdn.microsoft.com/library/windows/apps/hh969156.aspx" target="_blank"&gt;Notifications Extensions 库&lt;/a&gt;（使用 C# 编写）轻松地生成结构良好的 XML 负载。&lt;/p&gt;

&lt;p&gt;要看一个简单的示例，不妨看看我在书中第 13 章为 HelloTiles 示例服务创建的非常基本的 WebMatrix 服务（&lt;a href="http://go.microsoft.com/FWLink/?Linkid=270057" target="_blank"&gt;请参见随附内容&lt;/a&gt;）。这项特定的服务仅返回固定的 XML 负载（绑定方形磁贴和宽形磁贴）并且结构上类似于&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/04/24/10297319.aspx" target="_blank"&gt;打造卓越的磁贴体验（第 2 部分）&lt;/a&gt;中给出的第一个 ASP.NET 示例：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;@{&lt;br /&gt;  //&lt;br /&gt;  // This is where any other code would be placed to acquire the dynamic content&lt;br /&gt;  // needed for the tile update. In this case we'll just return static XML to show&lt;br /&gt;  // the structure of the service itself.&lt;br /&gt;  // &lt;br /&gt;  var weekDay = DateTime.Now.DayOfWeek;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;xml&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;encoding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;tile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;visual&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;lang&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;en-US&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;binding&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;template&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;TileSquarePeekImageAndText02&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;branding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;none&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;image&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;http://www.kraigbrockschmidt.com/images/Liam07.png&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;Liam--&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;Giddy on the day he learned to sit up!&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;binding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;binding&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;template&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;TileWideSmallImageAndText04&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;branding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;none&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;image&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;http://www.kraigbrockschmidt.com/images/Liam08.png&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;This is Liam&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;Exploring the great outdoors!&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;binding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;visual&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;tile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;当您希望在推送与定期通知客户端示例的应用场景 4 中试用这一特定服务时，可将该服务部署到 &lt;a href="http://programmingwin8-js-ch13-hellotiles.azurewebsites.net/Default.cshtml" target="_blank"&gt;http://programmingwin8-js-ch13-hellotiles.azurewebsites.net/Default.cshtml&lt;/a&gt;。进行此部署后，您会在几秒钟后看到以下磁贴更新（左侧显示宽形磁贴，右侧显示两部分方形摘要磁贴）：&lt;/p&gt;

&lt;div align="center"&gt;
  &lt;table class="b8table" border="0" cellspacing="0" cellpadding="3" align="center"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td valign="top" width="312"&gt;
          &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8228.liam_5F00_1_5F00_25CAB908.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="liam_1" border="0" alt="liam_1" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5670.liam_5F00_1_5F00_thumb_5F00_05AFAC4B.png" width="350" height="169" /&gt;&lt;/a&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="617"&gt;
          &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0207.liam_5F00_2_5F00_457992D0.png"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="liam_2" border="0" alt="liam_2" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0211.liam_5F00_2_5F00_thumb_5F00_106D03A0.png" width="175" height="175" /&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8625.liam_5F00_tile_5F00_373B19E0.png"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="liam_tile" border="0" alt="liam_tile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/6562.liam_5F00_tile_5F00_thumb_5F00_2C118F96.png" width="175" height="176" /&gt;&lt;/a&gt;&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;现在，让我们使用 Notification Extensions 库来编写相同的代码。首先要做的是为您的网站构建一个版本的库，如下所示：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;转到&lt;a href="http://code.msdn.microsoft.com/windowsapps/zh-cn/App-tiles-and-badges-sample-5fc49148" target="_blank"&gt;应用磁贴和徽章示例&lt;/a&gt;，然后将 Notifications Extensions 文件夹从该项目复制到您自己的文件夹中。（还可以直接从 Visual Studio 中安装库，方法是右键单击一个项目，选择 [Manage NuGet Packages…]（管理 NuGet 程序包…）并搜索 NotificationsExtensions.WinRT。&lt;i&gt;&lt;/i&gt;不过，这样做会将库引入现有的应用项目中，而这样我们需要在此构建一个独立的 DLL。）&lt;/li&gt;

  &lt;li&gt;在 Visual Studio Express for Windows 中，打开 NotificationsExtensions.csproj 文件。&lt;/li&gt;

  &lt;li&gt;在解决方案资源管理器中，右键单击 NotificationExtensions 项目，选择“属性”，然后进行以下更改：&lt;/li&gt;

  &lt;ol&gt;
    &lt;li&gt;在“应用”设置中，将输出类型更改为“类库”(.dll)。&lt;i&gt;&lt;/i&gt;要将库用于 ASP.NET 站点，这一更改非常必要。&lt;/li&gt;

    &lt;li&gt;在“构建”设置中，将配置更改为“所有配置”，将条件编译符号更改为 NETFX_CORE; WINRT_NOT_PRESENT 并确保选中页面底部附近的 XML 文档文件。&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;WINRT_NOT_PRESENT 标记表示库可以在没有 WinRT 的情况下进行编译。&lt;i&gt;&lt;/i&gt;&lt;/li&gt;
  &lt;/ol&gt;

  &lt;li&gt;选择调试或发布目标，然后右键单击 Notifications Extensions 项目并选择&lt;b&gt;构建&lt;/b&gt;。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;上述步骤将在该项目的文件夹中生成 DLL 和相关的文件。现在我们需要将其拉入到网站项目中。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;在 Visual Studio Express for Web 中，右键单击您的网站项目并选择 &lt;b&gt;[Add]（添加）&lt;/b&gt;&amp;gt; &lt;b&gt;[Add ASP.NET folder]（添加 ASP.NET 文件夹）&lt;/b&gt;&amp;gt; &lt;b&gt;Bin&lt;/b&gt;（如果您的网站还没有 Bin 文件夹）。&lt;/li&gt;

  &lt;li&gt;右键单击 Bin 文件夹，选择 &lt;b&gt;[Add Reference]（添加引用）&lt;/b&gt;…。在 &lt;b&gt;[Add Reference]（添加引用）&lt;/b&gt;中，转到 Notifications Extensions 项目的 &lt;b&gt;bin\Debug&lt;/b&gt; 或 &lt;b&gt;bin\Release&lt;/b&gt; 文件夹并选择其中的 DLL。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;如果您使用的是 Visual Studio Ultimate，可以根据需要将 Notification Extensions 项目添加到网站解决方案中，因为此工具可以处理这两种项目类型。只需确保您不会将该项目的源代码部署到您的 Web 服务器！&lt;/p&gt;

&lt;p&gt;另请注意，如果您将网站构建为在浏览器中以本地方式运行（如我们将在下面的“调试”部分中所看到的），可能会收到错误消息，指出向 System.Runtime 中添加引用时出错。&lt;i&gt;&lt;/i&gt;要更正此错误，请打开 web.config 文件并将“compilation”元素更改为如下所示：&lt;i&gt;&lt;/i&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;compilation&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;targetFramework&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;4.0&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;assemblies&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;add&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;assembly&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;assemblies&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;compilation&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;完成上述所有操作后，将获得如下页面（名为 DefaultNE.aspx），该页面能与之前的硬编码示例生成相同的输出：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;xml&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;encoding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 0);"&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;script&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum1"&gt;   1:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum2"&gt;   2:&lt;/span&gt;     &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; GenerateTileXML()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum3"&gt;   3:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum4"&gt;   4:&lt;/span&gt;         &lt;span style="color: rgb(0, 128, 0);"&gt;// Construct the square template&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum5"&gt;   5:&lt;/span&gt;         NotificationsExtensions.TileContent.ITileSquarePeekImageAndText02 squareTile = &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum6"&gt;   6:&lt;/span&gt;             NotificationsExtensions.TileContent.TileContentFactory.CreateTileSquarePeekImageAndText02();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum7"&gt;   7:&lt;/span&gt;         squareTile.Branding = NotificationsExtensions.TileContent.TileBranding.None;        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum8"&gt;   8:&lt;/span&gt;         squareTile.Image.Src = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;http://www.kraigbrockschmidt.com/images/Liam07.png&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum9"&gt;   9:&lt;/span&gt;         squareTile.TextHeading.Text = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Liam--&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum10"&gt;  10:&lt;/span&gt;         squareTile.TextBodyWrap.Text = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Giddy on the day he learned to sit up!&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum11"&gt;  11:&lt;/span&gt;         &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color: rgb(0, 128, 0);"&gt;// Construct the wide template&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum13"&gt;  13:&lt;/span&gt;         NotificationsExtensions.TileContent.ITileWideSmallImageAndText04 wideTile =&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum14"&gt;  14:&lt;/span&gt;             NotificationsExtensions.TileContent.TileContentFactory.CreateTileWideSmallImageAndText04();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum15"&gt;  15:&lt;/span&gt;         wideTile.Branding = NotificationsExtensions.TileContent.TileBranding.None;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum16"&gt;  16:&lt;/span&gt;         wideTile.Image.Src = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;http://www.kraigbrockschmidt.com/images/Liam08.png&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum17"&gt;  17:&lt;/span&gt;         wideTile.TextHeading.Text = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;This is Liam&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum18"&gt;  18:&lt;/span&gt;         wideTile.TextBodyWrap.Text = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Exploring the great outdoors!&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum19"&gt;  19:&lt;/span&gt;                 &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color: rgb(0, 128, 0);"&gt;// Attach the square template to the notification&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum21"&gt;  21:&lt;/span&gt;         wideTile.SquareContent = squareTile;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum22"&gt;  22:&lt;/span&gt;         wideTile.Lang = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;en-US&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum23"&gt;  23:&lt;/span&gt;         &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum24"&gt;  24:&lt;/span&gt;         &lt;span style="color: rgb(0, 128, 0);"&gt;// The wideTile object is an XMLDOM object, suitable for issuing tile updates&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum25"&gt;  25:&lt;/span&gt;         &lt;span style="color: rgb(0, 128, 0);"&gt;// directly. In this case we just want the XML text.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum26"&gt;  26:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; wideTile.ToString();        &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum27"&gt;  27:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;script&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 0);"&gt;&amp;lt;%&lt;/span&gt;&lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum1"&gt;   1:&lt;/span&gt;  = GenerateTileXML() &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;span style="background-color: rgb(255, 255, 0);"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;您可以转到 &lt;a href="http://programmingwin8-js-ch13-hellotiles.azurewebsites.net/DefaultNE.aspx" target="_blank"&gt;http://programmingwin8-js-ch13-hellotiles.azurewebsites.net/DefaultNE.aspx&lt;/a&gt; 访问此服务，通过此服务，您将获得基本上与之前相同的 XML，只有细微的差异。将此 URI 粘贴到推送与定期通知客户端示例的应用场景 4 中同样也可以生成与之前相同的磁贴更新。&lt;/p&gt;

&lt;h2&gt;调试服务&lt;/h2&gt;

&lt;p&gt;当然，成功生成磁贴或徽章更新的前提是服务响应中 XML 的正确生成：Windows 拒绝任何未正确生成的 XML。这就很好地解释了为什么要使用 Notifications Extensions 库，因为它可以显著减少此过程中可能会出现的错误。&lt;/p&gt;

&lt;p&gt;但是，如果服务根本无法很好地运行会怎样呢？如何诊断和调试服务处理请求和生成其响应的方式？&lt;/p&gt;

&lt;p&gt;事实上，我第一次试用上述 ASP.NET 服务代码时，由于 XML 响应的顶部有一个前导新行，更新并未显示。这就是为什么 &amp;lt;?xml ?&amp;gt; 标头显示为文件中的第一行而并非显示在 &amp;lt;%@ Page %&amp;gt; 指令之后以及为什么没有任何额外的换行符的具体原因。&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;很显然，众多原因促使您希望能够单步执行自己的服务代码并对其进行逐行调试，在您对数据库进行查询并处理这些查询结果时尤其如此。&lt;/p&gt;

&lt;p&gt;其中的技巧是在开发计算机上使用本地主机，这样您可以在运行客户端测试代码（如 SDK 示例）的同时在本地运行和调试您的服务。&lt;/p&gt;

&lt;p&gt;使用本地主机意味着您将运行本地 Web 服务器（如 Internet Information Services 或 Apache）。要在 Windows 中打开 IIS（其内置组件），请访问&lt;b&gt;控制面板&lt;/b&gt; &amp;gt; &lt;b&gt;打开或关闭 Windows 功能&lt;/b&gt;。按照下图中所示选中顶级 Internet Information Services 框以安装核心功能：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/7142.windows_2D00_features_2D00_window_5F00_0BF682D9.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="Windows 功能对话框，其中 Internet Information Services 为选中状态" border="0" alt="Windows 功能对话框，其中 Internet Information Services 为选中状态" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1778.windows_2D00_features_2D00_window_5F00_thumb_5F00_56E9F3A8.png" width="500" height="438" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;安装 IIS 之后，可在 c:\inetpub\wwwroot 文件夹中找到以 http://localhost/ 编址的本地站点。&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;您可以向该文件夹中拖入一些内容，如上一部分中所述的 PHP 页面，这样，就可以在客户端示例中使用诸如 http://localhost/dayofmonthservice.php 之类的 URI 了。&lt;i&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;要将 PHP 与 IIS 结合使用，您可能需要通过 Microsoft 的 &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx" target="_blank"&gt;Web 平台安装程序&lt;/a&gt;对其进行安装，否则服务器端代码将无法正常执行。安装 PHP 后，尝试在浏览器中输入本地 PHP 页面的 URI。如果您收到错误消息，指出“处理程序 PHP53_via_FastCGI 包含错误模块”（耶，这一错误提示真的很有用！），要更正这一错误，只需返回前面所示的“打开或关闭 Windows 功能”对话框，转到 &lt;b&gt;Internet Information Services&lt;/b&gt; &amp;gt; &lt;b&gt;[World Wide Web Services]（万维网服务）&lt;/b&gt;&lt;b&gt;&amp;gt; [Application Development Features]（应用程序开发功能）&lt;/b&gt;，选中 &lt;b&gt;CGI&lt;/b&gt; 对应的框然后按 &lt;b&gt;[OK]（确定）&lt;/b&gt;。安装 CGI 引擎后，您的 PHP 页面就应可以正常工作了。&lt;/p&gt;

&lt;p&gt;本地主机就位后，您可以使用 Visual Studio Express for Web 或 Visual Studio Ultimate 在您自己的计算机上调试服务。还可以结合使用 Visual Studio Express for Web 和 Visual Studio Express for Windows 共同对客户端和服务器代码进行调试。&lt;/p&gt;

&lt;p&gt;当您在 Visual Studio (for Web) 调试器中运行某一服务或网站时，该服务或网站在浏览器中运行时所用的 URL 为 http://localhost:&amp;lt;port&amp;gt;/，其中 &amp;lt;port&amp;gt; 是为该项目随机分配的。&lt;i&gt;&lt;/i&gt;举例来说，在 Visual Studio Express for Web 中运行上一部分中的 DefaultNE.aspx 页面时，该页面将在 Internet Explorer 中打开，URI 为 http://localhost:52568/HelloTiles/DefaultNE.aspx。&lt;i&gt;&lt;/i&gt;如果我在该页面的代码中设置了断点，调试器会在运行到该点时立即停止。&lt;/p&gt;

&lt;p&gt;如果您在客户端代码中使用同一本地主机 URI 启动请求，断点也会被命中。举例来说，如果我在 Visual Studio Express for Windows 中运行推送与定期通知客户端示例时将该 URI 粘贴到应用场景 4 中，则 Visual Studio Express for Web 将在 Windows 发出请求后立即在调试器中停止我的服务。之后我可以单步执行该代码（幸运的是，Windows 很有耐心），确保生成正确的响应。如果不这样做，可以修复代码然后在本地主机上重新启动服务。&lt;/p&gt;

&lt;p&gt;在您确信您的服务以预期方式运行后，可以将其上载到活动 Web 主机（或过渡环境）并进行最终生产测试。&lt;/p&gt;

&lt;p&gt;注意，要以这种方式使用本地主机，不需要在调试器中运行客户端代码。不过，如果您要运行客户端代码，必须打开 Visual Studio 中相应的选项本地主机才能运行。默认情况下，该选项为选中状态，但是如果您需要更改它，可以在项目属性中的 &lt;b&gt;[Debugging]（调试）&lt;/b&gt;&amp;gt; &lt;b&gt;[Allow Local Network Loopback]（允许本地网络环回）&lt;/b&gt;下找到它：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/4186.pushandperiodic_5F00_7DB809E8.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="允许本地网络环回选项" border="0" alt="允许本地网络环回选项" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8132.pushandperiodic_5F00_thumb_5F00_32586624.png" width="700" height="496" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;来自外部来源的数据&lt;/h2&gt;

&lt;p&gt;定期通知服务除了可以对其自己的数据库进行查询之外，还可以通过向其他服务发送请求来获取响应数据。不过需要引起注意的是，这些请求本质上是异步的，往往会导致各种故障情况。因此，使用它们会显著增加服务实施的复杂性。&lt;/p&gt;

&lt;p&gt;为简化相关事宜，我们可以利用 Windows 仅以 30 分钟或更长时间为间隔向您的服务发出请求这一情况（通过客户端 API 强制实施）。这意味着您拥有大把时间，在这段时间内其他服务器端过程可以发出外部请求来监控天气预警、排行榜、RSS 源或包含 Web API 的任何其他事物。这些过程将结果存储在数据库中，在数据库收到下一个请求时，这些结果就可供您的定期通知服务查询（同步）。&lt;/p&gt;

&lt;p&gt;任意数量的代理可以更新同一数据库。例如，用户可能通过您的网站输入数据。他们可能使用手机应用跟踪其活动，并将结果自动上载到数据库。数据库还可能由在其各自的设备上使用同一应用的好友进行更新。&lt;/p&gt;

&lt;p&gt;具体排列情况如下所示，数据库作为中央存储居于后端，而定期通知服务就其状态而言只是普通的用户。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1768.database_5F00_servers_5F00_graph_5F00_03FEE077.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="database_servers_graph" border="0" alt="database_servers_graph" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/4405.database_5F00_servers_5F00_graph_5F00_thumb_5F00_7CDFA3FE.png" width="700" height="330" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;将 Windows Azure 移动服务与定期更新服务结合使用&lt;/h2&gt;

&lt;p&gt;随着您开始了解后端服务并将其扩展用于支持动态磁贴和其他通知，您已将其用于探索 &lt;a href="http://www.windowsazure.com/zh-cn/develop/mobile/tutorials/get-started/" target="_blank"&gt;Windows Azure 移动服务&lt;/a&gt;，我将此服务简称为 AMS。AMS 除了能大大简化推送通知（我们将在本博文系列的第 3 部分中看到）之外，还可用于通过以下几种方式支持定期更新服务：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;在移动服务中，您可以创建计划后台作业，通过这些作业向其他服务发出请求并将结果存储在数据库中。从 Twitter 中获取 tweet 是其中一个例子，可以在&lt;a href="http://www.windowsazure.com/zh-cn/develop/mobile/tutorials/schedule-backend-tasks/" target="_blank"&gt;在移动服务中计划重复执行的作业&lt;/a&gt;这一主题中找到。&lt;/li&gt;

  &lt;li&gt;当您在 AMS 中（或在 Windows Azure 中的其他位置）创建 SQL Server 数据库时，可以像访问任何其他 Web 托管的 SQL Server 数据库一样访问该数据库，因此您可以通过网站和其他服务（包括使用 PHP 编写的网站和服务）使用该数据库。&lt;/li&gt;

  &lt;li&gt;使用 AMS，可以非常轻松地借助&lt;a href="http://www.windowsazure.com/zh-cn/develop/mobile/developer-tools/" target="_blank"&gt;移动服务 SDK&lt;/a&gt; 通过客户端应用将记录插入到数据库中。&lt;/li&gt;

  &lt;li&gt;不同于移动服务，Windows Azure 可以托管使用多种语言（包括 Node.js、Python、Java、PHP 和 .NET）编写的服务器端过程。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在将来，还应期待 Azure 移动服务中推出的名为“服务操作”的新功能，通过此新功能，您将可以创建任意的 http 端点，包括定期通知服务。&lt;/p&gt;

&lt;p&gt;有关 Windows Azure 的详细信息，请访问 &lt;a href="http://www.windowsazure.com" target="_blank"&gt;http://www.windowsazure.com&lt;/a&gt;。要观看入门视频，请访问 Channel 9 上的 &lt;a href="http://channel9.msdn.com/Series/Windows-Azure-Mobile-Services" target="_blank"&gt;Windows Azure 移动服务教程&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;现在我们已探讨了如何创建定期通知服务，接下来我们将可以开始介绍推送通知了。在您需要以高于定期通知允许的频率发布更新时就要用到推送通知，实质上是按需（因此有了“推送”这个名字）。这是我们将在本博文系列的第 3 部分中讨论的主题，在第 3 部分中我们将更深入地探讨 Azure 移动服务。&lt;/p&gt;

&lt;p&gt;Kraig Brockschmidt
  &lt;br /&gt;Windows 生态系统团队项目经理

  &lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2012/10/29/free-ebook-programming-windows-8-apps-with-html-css-and-javascript.aspx" target="_blank"&gt;使用 HTML、CSS 和 JavaScript 编程 Windows 8 应用&lt;/a&gt;作者&lt;/p&gt;&lt;/div&gt;
&lt;!-- Title: “活力无限（第 2 部分）：针对动态磁贴编写和调试服务” Tags: “调试动态磁贴, 动态磁贴, Windows 8 动态磁贴” --&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10401301" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_A8520160C178348D_/">动态磁贴</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+8+_A8520160C178348D_/">Windows 8 动态磁贴</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_038CD58BA8520160C178348D_/">调试动态磁贴</category></item><item><title>活力无限（第 1 部分）：使用磁贴、徽章和 Toast</title><link>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/03/05/1-toast.aspx</link><pubDate>Wed, 06 Mar 2013 00:05:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10399679</guid><dc:creator>Windows 8 Team</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/windowsappdev_cn/rsscomments.aspx?WeblogPostID=10399679</wfw:commentRss><comments>http://blogs.msdn.com/b/windowsappdev_cn/archive/2013/03/05/1-toast.aspx#comments</comments><description>&lt;div class="PostContent"&gt;&lt;p&gt;动态磁贴以及徽章、Toast 通知和推送通知的相关功能是 Windows 8 和 Windows 应用商店应用最显著的特点之一。它们相互结合，共同打造出了一个“活力无限”的系统：即使是在应用未运行的时候，应用仍可不断获得来自其各自服务的信息，这些信息将显示于“开始”屏幕和锁屏中。&lt;/p&gt;  &lt;p&gt;本博客此前发布的数篇博文中已经介绍了一些涉及动态磁贴和通知的基本要素。&lt;/p&gt;  &lt;p&gt;如果您希望回顾这些博文，请参阅：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;《&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/04/20/10295998.aspx" target="_blank"&gt;打造卓越的磁贴体验（第 1 部分）&lt;/a&gt;》：该博文介绍了磁贴的设计，以及如何根据您应用的功能来选择合适的模板。&lt;/li&gt;    &lt;li&gt;《&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/04/24/10297319.aspx" target="_blank"&gt;打造卓越的磁贴体验（第 2 部分）&lt;/a&gt;》：该博文探讨了应用将如何发送本地更新、设置定期通知，以及管理辅助磁贴。该博文还介绍了 PHP 形式和 ASP.NET 形式的服务结构。&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;为了基于这些资源进行构建，本篇由三个部分组成的博文将对几个方面的内容进行深入的介绍。&lt;/p&gt;  &lt;p&gt;在第 1 部分（本博文）中，我们将介绍：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;概述用户体验的视觉之旅：“活力”对于用户而言意味着什么？&lt;/li&gt;    &lt;li&gt;磁贴、徽章和 Toast 通知的 XML 架构可以展示无法在模板目录中始终显而易见的多项特性和功能。&lt;/li&gt;    &lt;li&gt;磁贴、通知和后台任务的关系。&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;第 2 部分将探讨如何以多种语言编写和调试服务，特别是采用本地主机和面向 Web/Visual Studio 2012 的 Visual Studio 2012 Express 进行编写和调试。第 2 部分还将涉及专为此目的而使用 Windows Azure 移动服务的内容。&lt;/p&gt;  &lt;p&gt;第 3 部分将探讨推送通知的主题。这包括如何使用 Windows 推送通知服务 (WNS)，以及如何使用 Windows Azure 移动服务来支持您应用中的推送通知。&lt;/p&gt;  &lt;p&gt;这三部分与我在 //Build 2012 上所做的发言：&lt;a href="http://channel9.msdn.com/Events/Build/2012/3-101" target="_blank"&gt;3-101 活力无限&lt;/a&gt;（此视频和幻灯片平台已发布于 Channel 9）相互呼应，并扩展了相关内容。这三部分也反映和扩展了我在 Microsoft Press 中的免费电子书的第 13 章的内容：&lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2012/10/29/free-ebook-programming-windows-8-apps-with-html-css-and-javascript.aspx" target="_blank"&gt;使用 HTML、CSS 和 JavaScript 编程 Windows 8 应用&lt;/a&gt;&lt;i&gt;&lt;/i&gt;（尽管该标题标明了三种特定语言，但是该内容对于使用其他语言编程的开发人员同样有所帮助）。&lt;/p&gt;  &lt;h2&gt;“活力”对于用户而言意味着什么？&lt;/h2&gt;  &lt;p&gt;我们在本系列中所讨论的“活力”出现于用户所能见到的三个地方：“开始”屏幕、锁屏，以及其他任何显示 Toast 通知的位置。&lt;/p&gt;  &lt;p&gt;相信到目前为止，您已经非常熟悉“开始”屏幕上&lt;b&gt;磁贴&lt;/b&gt;的创意。如以下示例所示，磁贴能以方形和宽形呈现，并包含多种显示文本、图像，或二者组合的布局模板。应用的清单将定义磁贴的颜色，只要应用能够同时支持方形和宽形磁贴，用户即可任意选择形状。磁贴的左下角能够显示应用名称、徽标，或不显示任何内容。而磁贴的右下角可包含一个小型“徽章”，这可以是从 1 到 99 的任意数字（来作为邮件、消息等内容的数量），或是一些预定义的字形（请参阅&lt;a href="http://msdn.microsoft.com/library/windows/apps/Hh761458.aspx" target="_blank"&gt;徽章图像目录&lt;/a&gt;）。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3806.start_2D00_screen_2D00_tiles_5F00_3A8FFD9E.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="Windows 8“开始”屏幕显示的磁贴" border="0" alt="Windows 8“开始”屏幕显示的磁贴" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/7610.start_2D00_screen_2D00_tiles_5F00_thumb_5F00_615E13DE.png" width="700" height="411" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;磁贴模板还包括大量“扫视”设计，该设计能够让用户在诸如图像等一部分内容和诸如文本等第二部分内容间翻转（在&lt;a href="http://msdn.microsoft.com/library/windows/apps/hh761491.aspx" target="_blank"&gt;磁贴模板目录&lt;/a&gt;中，他们看起来像是双层磁贴，但是每一层只显示了一半）。系统将同步显示这两部分的切换动画效果和所有其他磁贴的动画效果。此外，每个磁贴能够将最多五个自动循环的更新排入队列，系统同样将与其他磁贴协调，为这些更新提供动画效果。队列中的每个更新将获得一个标记，因此您可为每个更新更换标记，否则队列将按照“先进先出”的方式操作。&lt;/p&gt;  &lt;p&gt;不同动画效果之间的协调有助于我们理解 Windows 为何要将磁贴更新限制到一组预定义的模板中。这是因为，如果应用可对其磁贴进行任何所希望的操作，那么“开始”屏幕体验将是怎么样一番情形。此外，在磁贴上自由播放视频将更快地耗尽电池电量，因此这样“放任自由”必将导致混乱。没错，对于完全静止的“开始”屏幕，这并不会产生什么问题，但是观众却无法获得卓越的视觉效果！Windows 的设计人员希望您能长时间地享受“开始”屏幕，因此他们打造了一个活力无限，但又让所有磁贴统一、和谐的体验。使用模板和系统控制的动画效果能够提供一定的一致性，同时又允许各个应用之间存在较大的差异。（请记住，您可使用始终只包含图像的模板，并在其中放置您希望置于该处的任何设计，但是请避免创建诸如按钮等可引发磁贴不同部分的不同行为的图像，系统将不支持此类设计。）&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Toast&lt;/strong&gt; &lt;strong&gt;通知&lt;/strong&gt;将显示于“开始”屏幕、锁屏、桌面或任何运行的应用的顶部。点击 Toast 将激活其相关的应用（该应用中包含在系统发布 Toast 时指定的任何参数）。Toast 将以相关应用的清单所定义的颜色显示，并在右下角包含该应用的徽标；颜色和徽标都将有助于用户识别点击 Toast 所将激活的应用。&lt;/p&gt;  &lt;p&gt;与磁贴相同，每个 Toast 的布局是由 &lt;a href="http://msdn.microsoft.com/library/windows/apps/hh761494.aspx" target="_blank"&gt;Toast 模板目录&lt;/a&gt;中的模板所定义的，开发人员可在目录中选择仅包含文本或文本加图像的模板。Toast 将在显示一段时间后淡出，此过程可伴随以声音，并可作为会议提醒反复出现。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/2804.toast_2D00_template_5F00_2127FA64.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="Toasts 将在显示一段时间后淡出。" border="0" alt="Toasts 将在显示一段时间后淡出。" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5531.toast_2D00_template_5F00_thumb_5F00_1A08BDEC.png" width="700" height="178" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;在&lt;b&gt;锁屏&lt;/b&gt;中，应用活动将与时间、日期和系统徽章并排显示。正如以下示例所显示的，应用内容由位于底部的最多七个徽标和徽章，以及显示于时间旁边的一个文本更新组成：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0172.app_5F00_logos_5F00_12E98174.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="本应用内容包括最多 7 个徽标和徽章，以及一个显示于时间旁边的文本更新" border="0" alt="本应用内容包括最多 7 个徽标和徽章，以及一个显示于时间旁边的文本更新" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/6445.app_5F00_logos_5F00_thumb_5F00_32985B3C.png" width="700" height="356" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;用户可通过“PC 设置”&amp;gt;“个性化”&amp;gt;“锁屏”来控制显示于锁屏中的内容，以下显示了一个示例。在第一行中，点击一个方形按钮将列出支持锁屏功能，并将显示为徽标和徽章的一组应用。在第二行中，您可选择将提供详细文本的应用。该文本将专门显示该应用的最新磁贴更新内容。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3302.lock_2D00_screen_2D00_apps_5F00_003487BD.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="支持锁屏的应用列表" border="0" alt="支持锁屏的应用列表" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3806.lock_2D00_screen_2D00_apps_5F00_thumb_5F00_322C2847.png" width="700" height="292" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;更新 XML&lt;/h2&gt;  &lt;p&gt;现在，我们已经了解何谓用户体验活跃，那么接下来的问题是：这些更新究竟是由什么组成的？即什么将用于描述磁贴更新、徽章或 Toast 通知？&lt;/p&gt;  &lt;p&gt;除了我们所说的“原始”&lt;i&gt;&lt;/i&gt;通知以外，所有更新都是一组用于更新磁贴或显示 Toast 的 Windows 能够处理的 XML。（原始通知能够包含应用特定的文本或二进制数据。接收这些通知的应用或后台任务通常将处理该数据并发布磁贴更新、徽章更新或响应 Toast。）&lt;/p&gt;  &lt;p&gt;我们一直提到的模板就是这些更新的特定 XML 结构。例如，数字 7 的徽章更新如下：&lt;/p&gt;  &lt;blockquote&gt;   &lt;div id="codeSnippetWrapper"&gt;     &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;badge&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;7&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;作为经常调用的 XML 结构&lt;i&gt;&lt;/i&gt;，以下显示的是我们此前所看到的位于中下方的磁贴的红点徽章的类似负载。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;badge&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;busy&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;包含图像、文本以及徽标/名称选项引用，并使用 TileWideSmallImageAndText01&lt;i&gt;&lt;/i&gt; 模板的同样宽度的磁贴的 XML 负载大致如下（图像 URI 是虚构的）：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;tile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;visual&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;binding&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;template&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;TileWideSmallImageAndText01&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;branding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;logo&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;image&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;http://friends.contoso.com/sally.png&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;alt&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;Sally's picture&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;Hey, you there? Txt me when you’re back&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;binding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;visual&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;tile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;在此负载中，您可以看到我们识别了 binding&lt;i&gt;&lt;/i&gt; 元素中的模板。Windows 将根据模板验证 XML 的其他部分。binding&lt;i&gt;&lt;/i&gt; 元素的 branding&lt;i&gt;&lt;/i&gt; 属性指示了是显示徽标&lt;i&gt;&lt;/i&gt;、应用的名称&lt;i&gt;&lt;/i&gt;，还是不显示任何内容&lt;i&gt;&lt;/i&gt;。binding&lt;i&gt;&lt;/i&gt; 的子级元素随后将描述该模板的其他必要部分。&lt;/p&gt;

&lt;p&gt;现在，过多关注此类更新的特定模板没有太多意义，而是应该关注其通用的 XML 架构，因为这些架构将揭示可在各个更新中使用的其他功能。也就是说，&lt;a href="http://msdn.microsoft.com/library/windows/apps/hh761491.aspx" target="_blank"&gt;磁贴模板目录&lt;/a&gt;、&lt;a href="http://msdn.microsoft.com/library/windows/apps/Hh761458.aspx" target="_blank"&gt;徽章图像目录&lt;/a&gt;，以及 &lt;a href="http://msdn.microsoft.com/library/windows/apps/hh761494.aspx" target="_blank"&gt;Toast 模板目录&lt;/a&gt;仅显示了要求的元素、架构，另一方面，其还显示了所有额外的选项。&lt;/p&gt;

&lt;p&gt;架构内容记录于该文档的&lt;a href="http://msdn.microsoft.com/library/windows/apps/br212853.aspx" target="_blank"&gt;磁贴、Toast 和徽章架构&lt;/a&gt;部分。但是，详细内容可能分散于许多单独主题中，因此让我将这些内容汇集到“伪架构”中，伪架构可让我们从整体检查结构。&lt;/p&gt;

&lt;p&gt;最简单的是&lt;b&gt;徽章更新&lt;/b&gt;的结构，因此让我们从这开始说起：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;xml&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;encoding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;badge&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;value&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;1-99&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;none&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;activity&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;alert&amp;quot;&lt;/span&gt; | “&lt;span style="color: rgb(255, 0, 0);"&gt;attention&lt;/span&gt;” | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;available&amp;quot;&lt;/span&gt; |&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;away&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;busy&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;newMessage&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;paused&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;playing&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;unavailable&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;error&amp;quot;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;从技术角度来说，所有 XML 负载都应该有 &amp;lt;?xml&amp;gt;&lt;i&gt;&lt;/i&gt; 头标记；在没有这些头标记的情况下，Windows 仍可正常运行，但是为了确保完整性，我希望仍然将其包括其中。&lt;/p&gt;

&lt;p&gt;接下来，您可看到该 badge&lt;i&gt;&lt;/i&gt; 元素仅包含一个 value&lt;i&gt;&lt;/i&gt; 属性，该属性可以是一个数字（大于 99 的任何数字将显示为“99+”），或是一组可识别特定字形的预定义字词。这些内容还记录于本文档的&lt;a href="http://msdn.microsoft.com/library/windows/apps/hh761458.aspx" target="_blank"&gt;徽章图像目录&lt;/a&gt;页面。&lt;/p&gt;

&lt;p&gt;其他唯一的属性是可选的 version&lt;i&gt;&lt;/i&gt;（名称后的 ?&lt;i&gt;&lt;/i&gt; 代表可选），该属性可让开发人员在今后更改架构。由于这是可选属性，因此目前您可在您的负载中将其省略。&lt;/p&gt;

&lt;p&gt;&lt;b&gt;磁贴更新&lt;/b&gt;具有以下伪架构：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;xml&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;encoding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;tile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;visual&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;lang&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;baseUri&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;anyURI&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;fallback&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(255, 0, 0);"&gt;branding&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;none&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;logo&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;name&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;addImageQuery&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;!-- One or more binding elements --&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;binding&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;template&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;TileSquareImage&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;TileSquareBlock&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;TileSquareText01&amp;quot;&lt;/span&gt; | ... &lt;br /&gt;      &lt;span style="color: rgb(255, 0, 0);"&gt;fallback&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;lang&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;baseUri&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;anyURI&amp;quot;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(255, 0, 0);"&gt;branding&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;none&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;addImageQuery&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;!-- Some combination of image and text elements --&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;image&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;alt&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;addImageQuery&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;lang&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;binding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;visual&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;tile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;visual&lt;i&gt;&lt;/i&gt; 元素包含可整体应用到更新的属性，在该元素中，我们能够看到可选的 version&lt;i&gt;&lt;/i&gt; 属性，目前您可再次将其省略。其他属性如下所述：&lt;/p&gt;

&lt;div align="center"&gt;
  &lt;table class="b8table" border="0" cellspacing="0" cellpadding="3" align="center"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td valign="top" width="110"&gt;
          &lt;p&gt;属性&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="513"&gt;
          &lt;p&gt;描述&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="110"&gt;
          &lt;p&gt;lang&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="513"&gt;
          &lt;p align="left"&gt;一个可选的 BCP-47 语言字符串，该字符串将识别更新的数据的语言，例如“en-US”或“de-DE”。&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="110"&gt;
          &lt;p&gt;baseUri&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="513"&gt;
          &lt;p align="left"&gt;一个可选的 URI，您可为负载中的所有其他 URI 而预置该 URI，从而让您在建造负载时省略这些冗余的信息。默认值为“ms-appx:///”。&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="110"&gt;
          &lt;p&gt;branding&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="513"&gt;
          &lt;p align="left"&gt;指示是在磁贴上显示应用的徽标（默认情况为“logo”），其名称（“name”），还是不显示任何内容（“none”）。&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="110"&gt;
          &lt;p&gt;addImageQuery&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="513"&gt;
          &lt;p align="left"&gt;如果将其设置为“true”（默认情况为“false”），则指示 Windows 向负载中的 URI（即图像 URI）所发出的每个请求追加查询参数，以识别当前语言、比例因子和对比度设置。参数形式为：&lt;/p&gt;

          &lt;p align="left"&gt;&lt;/p&gt;

          &lt;p align="left"&gt;?ms-scale=&amp;lt;scale&amp;gt;&amp;amp;ms-contrast=&amp;lt;contrast&amp;gt;&amp;amp;ms-lang=&amp;lt;language&amp;gt;&lt;/p&gt;

          &lt;p align="left"&gt;&lt;/p&gt;

          &lt;p align="left"&gt;有关详情，请参阅&lt;a href="http://msdn.microsoft.com/library/windows/apps/Hh831183.aspx" target="_blank"&gt;磁贴和 Toast 通知的全球化和可访问性&lt;/a&gt;。&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;在 visual&lt;i&gt;&lt;/i&gt; 内，负载随后将拥有一个或多个 binding&lt;i&gt;&lt;/i&gt; 元素，其中每个磁贴尺寸一个元素。也就是说，一个单一负载能够（而且理想情况下应该）同时包含一个面向方形和宽形磁贴的更新，由于用户可能随时更改磁贴尺寸，因此这一点十分重要。如果您省略了某一尺寸或另一尺寸，那么在用户将磁贴设置为特定尺寸时，则不会显示该更新的任何内容。但是，请务必注意，您可以为不同的尺寸单独发送更新，Windows 将保留二者。&lt;/p&gt;

&lt;p&gt;在 binding&lt;i&gt;&lt;/i&gt; 内，您可以看到 template&lt;i&gt;&lt;/i&gt; 识别出了需要验证的 XML 模板，另外，您可以看到 visual&lt;i&gt;&lt;/i&gt; 中也存在相同的属性，除非它们仅适用于本 binding&lt;i&gt;&lt;/i&gt; 中的属性（并覆盖 visual&lt;i&gt;&lt;/i&gt; 中的这些属性）。另一属性是 fallback&lt;i&gt;&lt;/i&gt;，该属性可识别系统在无法找到主模板时所使用的模板。该属性将在今后用于向后兼容，因此您无需将其与 Windows 8 一同使用。&lt;/p&gt;

&lt;p&gt;在各个 binding&lt;i&gt;&lt;/i&gt; 中，根据模板的不同，可能存在一些 image&lt;i&gt;&lt;/i&gt; 和 text&lt;i&gt;&lt;/i&gt; 元素的组合；我相信您从这些元素的名称中就能了解其属性，或者我已在此前介绍过其属性。请注意，正如您所预期的，image&lt;i&gt;&lt;/i&gt; 或 text&lt;i&gt;&lt;/i&gt; 中（也可能出现在 binding&lt;i&gt;&lt;/i&gt; 或 visual&lt;i&gt;&lt;/i&gt; 中）的任何属性都将覆盖父级元素中的属性值。&lt;/p&gt;

&lt;p&gt;对于&lt;b&gt; Toast 通知&lt;/b&gt;，磁贴的结构较为相似，但是其包含一些其他特性：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;toast&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;launch&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;duration&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;long&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;short&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;visual&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;lang&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(255, 0, 0);"&gt;baseUri&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;anyURI&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;branding&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;none&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;name&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;logo&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;addImageQuery&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;!-- One or more bindings --&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;binding&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;template&lt;/span&gt;  = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;ToastImageAndText01&amp;quot;&lt;/span&gt; | &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;ToastImageAndText02&amp;quot;&lt;/span&gt; | ...&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(255, 0, 0);"&gt;fallback&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;  &lt;span style="color: rgb(255, 0, 0);"&gt;lang&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;baseUri&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;anyURI&amp;quot;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(255, 0, 0);"&gt;branding&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;none&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;addImageQuery&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;!-- Some number of child elements --&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;image&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;  = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;alt&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;addImageQuery&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;text&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;lang&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;binding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;visual&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;!-- Optional audio --&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;audio&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;ms-winsoundevent:Notification.Default&amp;quot;&lt;/span&gt; | ...&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(255, 0, 0);"&gt;loop&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;silent&lt;/span&gt;? = &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;toast&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;visual&lt;i&gt;&lt;/i&gt; 内的 lang、baseUri、branding&lt;i&gt;&lt;/i&gt; 和 addImageQuery&lt;i&gt;&lt;/i&gt; 属性具有相同的面向磁贴的含义和默认值，这与 binding、image&lt;i&gt;&lt;/i&gt; 和 text&lt;i&gt;&lt;/i&gt; 属性内的所有属性相同。在负载的这一部分，磁贴更新和 Toast 通知的唯一真正的差别在于受支持的模板。&lt;/p&gt;

&lt;p&gt;Toast 负载的不同之处在于最外层的 Toast&lt;i&gt;&lt;/i&gt; 元素的属性，及其可选的 audio&lt;i&gt;&lt;/i&gt; 子级。&lt;/p&gt;

&lt;p&gt;借助 toast&lt;i&gt;&lt;/i&gt;，launch&lt;i&gt;&lt;/i&gt; 属性可被分配一个字符串，该字符串将作为参数被传递到应用的激活处理程序，这与辅助磁贴将发生的情形一模一样。duration&lt;i&gt;&lt;/i&gt; 属性将获得“short”值&lt;i&gt;&lt;/i&gt;（五秒或从“PC 设置”&amp;gt;“轻松访问”中获得的值）或“long”值（25 秒或从“PC 设置”&amp;gt;“轻松访问”中获得的值，选择较长的值）。&lt;/p&gt;

&lt;p&gt;在 audio&lt;i&gt;&lt;/i&gt; 中，其 src&lt;i&gt;&lt;/i&gt; 属性是一个字符串，该字符串将指示来自 &lt;a href="http://msdn.microsoft.com/library/windows/apps/Hh761492.aspx" target="_blank"&gt;Toast 音频选项目录&lt;/a&gt;的一组预定义声音中的一个声音。目前，您只能从这些声音中选择，这些声音通常将映射到您在“控制面板”中所配置的任何系统声音中。（请注意：如果您像我通常所做的那样关闭所有声音，那么您将无法听到任何声音，请在测试应用时牢记这一点！）。存在该局限性的原因有几个。首先，包含来自远程源的自定义声音将产生更多的网络流量，这将在设备处于锁屏状态或试图在连接待机模式保存电量时引发令人担忧的问题。同时也可以防止可能发生的滥用行为，例如在 Toast 中包含音频广告。&lt;/p&gt;

&lt;p&gt;此外，如果将 silent&lt;i&gt;&lt;/i&gt; 属性设为“true”，那么系统将始终静音。而对于 loop&lt;i&gt;&lt;/i&gt;，如果设置了 Toast 的 duration&lt;i&gt;&lt;/i&gt; 属性，而且您将音频的 src&lt;i&gt;&lt;/i&gt; 设置为目录中四个“循环”声音（“闹钟”和“呼叫”各两种变体）中的一种，那么您还可将 loop&lt;i&gt;&lt;/i&gt; 设置成“true”以重复声音，或将其设置成“false”，而只播放一次声音，这也是默认设置。&lt;/p&gt;

&lt;p&gt;除了循环播放音频，您还可计划重复执行的 Toast。这并不是 XML 负载中的一部分，而是您可在创建 &lt;a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/br208607.aspx" target="_blank"&gt;ScheduledToastNotification&lt;/a&gt;&lt;i&gt;&lt;/i&gt; 对象时指示的某个内容。在这些情形中，每个间隔将出现相同的负载（音频及全部）。&lt;/p&gt;

&lt;h2&gt;在不运行应用的情况下保持无限活力&lt;/h2&gt;

&lt;p&gt;了解了哪些 XML 负载将生成哪类更新后，需要解决的下一个问题是了解这些负载将如何在适当的时间进入系统，以及这些负载的创建方式。我们已在此前的博文《&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/04/20/10295998.aspx" target="_blank"&gt;打造卓越的磁贴体验（第 1 部分）&lt;/a&gt;》和《&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/04/24/10297319.aspx" target="_blank"&gt;打造卓越的磁贴体验（第 2 部分）&lt;/a&gt;》中探讨过这些主题，这两篇博文向您展示了如何在代码中生成负载。这包括使用&lt;a href="http://msdn.microsoft.com/library/windows/apps/hh969156.aspx" target="_blank"&gt;通知扩展库&lt;/a&gt;，通知扩展库中包含大量示例，同时可通过 Visual Studio 作为 NuGet 包使用。&lt;/p&gt;

&lt;p&gt;在此处，让我们集中总结一下提供这些负载的方法。发布这些负载共有三种方法：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;运行的应用或应用的后台任务能够发布&lt;b&gt;直接&lt;/b&gt;或&lt;b&gt;本地更新&lt;/b&gt;。这些操作可立即执行，也可计划在今后某个时间执行。磁贴、徽章和 Toast 也可包含一个过期时间，过了该时间后它们将被自动删除，或者如果在该时间之前它们未被提供，则它们将从计划中删除。

    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;运行应用能够为 Windows 提供最多五个 URI，以进行&lt;b&gt;定期更新&lt;/b&gt;，并指定范围从 30 分钟到一天不等的间隔。（当使用多个 URI 时，每个 URI 将对应于更新队列中的五个时间间隔中的一个。）一旦配置完定期更新后，Windows 将在每个间隔向 URI 发送一个请求 (HTTP GET)。如果 Windows 接收到返回的一个有效负载，那么 Windows 将以应用的名义把该更新发送到相应的磁贴，就像运行的应用直接发布该更新一样。我们将在本博文系列的第 2 部分来介绍如何创建更新服务。

    &lt;br /&gt;定期更新的主要优势在于即使是在应用未运行时，请求仍将继续，这可让磁贴在一段较长的时间内持续接收更新和徽章，而完全不需要用户启动应用。当然，我希望您的更新能够足够有趣，从而吸引用户再次使用您的应用！

    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;应用能够请求一个 Windows 推送通知 (WNS) 渠道 URI，并将该 URI 发送到其自有的后端服务中。随后，这些服务可以借助通过 WNS 的该渠道 URI 来发出任何特定类型的更新，而这样可以在特定设备联机时把该更新发送到该特定设备。Windows 将接收这些更新，并将其应用到相应的磁贴或显示 Toast。此外，应用能够配置一个后台任务来接收这些推送通知（原始通知就需要进行该操作）。我们将在本博文系列的第 3 部分探讨推送通知。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;以下表格总结了这些选项，并包含了磁贴的周期队列特性，以及 Toast 的重复执行/音频功能：&lt;/p&gt;

&lt;div align="center"&gt;
  &lt;table class="b8table" border="0" cellspacing="0" cellpadding="3" align="center"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td valign="top" width="119"&gt;
          &lt;p&gt;通知类型&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;队列&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;已计划&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;即将过期&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;重复执行&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;音频&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;定期&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;推送&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="119"&gt;
          &lt;p&gt;磁贴&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="119"&gt;
          &lt;p&gt;徽章&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="119"&gt;
          &lt;p&gt;Toast&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="119"&gt;
          &lt;p&gt;原始&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt; &lt;/td&gt;

        &lt;td valign="top" width="77"&gt;
          &lt;p&gt;✔&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;请注意，您在此处看到的有关磁贴和徽章的所有内容同样适用于应用的主磁贴和辅助磁贴。以上所引用的此前的博文详细介绍了有关辅助磁贴的内容。您也可参阅&lt;a href="http://code.msdn.microsoft.com/windowsapps/Secondary-Tiles-Sample-edf2a178" target="_blank"&gt;辅助磁贴示例&lt;/a&gt;了解相关内容。&lt;/p&gt;

&lt;p&gt;说到示例，让我再向您介绍一下&lt;a href="http://code.msdn.microsoft.com/windowsapps/App-tiles-and-badges-sample-5fc49148" target="_blank"&gt;应用磁贴和徽章示例&lt;/a&gt;、&lt;a href="http://code.msdn.microsoft.com/windowsapps/Scheduled-notifications-da477093" target="_blank"&gt;计划通知示例&lt;/a&gt;，以及&lt;a href="http://code.msdn.microsoft.com/windowsapps/Push-and-periodic-de225603" target="_blank"&gt;推送和定期通知客户端示例&lt;/a&gt;，从而让您查看所有不同应用场景下的完整示例。为了更好地使用您应用中的各种磁贴和通知，这些示例中的代码非常值得您抽空来熟悉一下。&lt;/p&gt;

&lt;p&gt;除此之外，还请记住后台任务也可发布磁贴、徽章和 Toast 更新。我喜欢将后台任务理解成是一种应用代码类型，这些代码即使是在应用本身挂起或完全不处于内存中时仍可运行。从后台任务发布更新所使用的代码与主应用所使用的代码相同，因此此处并无实际差别。&lt;/p&gt;

&lt;p&gt;后台任务很适于检查不同条件的状态，整个过程十分迅速，因此能够遵循分配给这些任务的 CPU 配额。当情况需要时，后台任务可生成适当的通知。事实上，后台任务的主要操作是 (a) 发布此类更新，或 (b) 将值保存到应用的 AppData 文件夹或设置容器中，应用将在其下次运行时处理这些文件夹或容器。&lt;/p&gt;

&lt;p&gt;后台任务还是应用在未运行时处理原始推送通知所必不可少的，我们将在本博文的第 3 部分中来探讨这一话题。&lt;/p&gt;

&lt;p&gt;有关后台任务的更多内容，请参阅本博客此前的博文《&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/06/07/backgrounds-tasks.aspx" target="_blank"&gt;在后台高效工作&lt;/a&gt;》，以及更一般的概述《&lt;a href="http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/05/21/being-productive.aspx" target="_blank"&gt;当应用程序在屏幕外时保持高工作效率&lt;/a&gt;》。&lt;/p&gt;

&lt;p&gt;了解了这些内容之后，那么我们就已经准备好告别熟悉的客户端应用内容，并跟随本博文的第 2 部分和第 3 部分，一同了解包含您的磁贴、徽章和 Toast 的在线服务所扮演的重要角色。&lt;/p&gt;

&lt;p&gt;Kraig Brockschmidt
  &lt;br /&gt; Windows 生态系统团队项目经理

  &lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2012/10/29/free-ebook-programming-windows-8-apps-with-html-css-and-javascript.aspx" target="_blank"&gt;使用 HTML、CSS 和 JavaScript 编程 Windows 8 应用&lt;/a&gt;作者&lt;/p&gt;
&lt;!-- Title: “活力无限（第 1 部分）：使用磁贴、徽章和 Toast” Tags: “磁贴, 徽章, Windows 8 磁贴, Windows 8 徽章, Windows 8 Toast, Toast” --&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10399679" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_C178348D_/">磁贴</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/_BD5FE07A_/">徽章</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+8+Toast/">Windows 8 Toast</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+8+_C178348D_/">Windows 8 磁贴</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Windows+8+_BD5FE07A_/">Windows 8 徽章</category><category domain="http://blogs.msdn.com/b/windowsappdev_cn/archive/tags/Toast/">Toast</category></item></channel></rss>