<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Lighthouse</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/lighthouse/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/lighthouse/feed.xml</link>
    <description>Our daily work is focusing on Windows Store Apps, Windows Phone Apps, Windows Azure, BI solutions and other cutting-edge technologies.</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:23:05 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>云计算设计模式指南系列(0) - 背景简介及内容提要</title>
      <link>https://docs.microsoft.com/archive/blogs/lighthouse/0</link>
      <pubDate>Sun, 29 Mar 2015 11:17:34 GMT</pubDate>
      <dc:creator><![CDATA[Ranger Yu]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/lighthouse/2015/03/29/0/</guid>
      <description><![CDATA[&nbsp;
大家好。这个博客很久没有更新了，这半年多来在工作重心上有所变动，现在主要还是研究Azure以及服务端开发这块了。不过最近WindowsApp方面的变化的确令人激动，今后在App开发这块...]]></description>
      <content:encoded><![CDATA[<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span lang="zh-CN">大家好。这个博客很久没有更新了，这半年多来在工作重心上有所变动，现在主要还是研究</span><span lang="en-US">Azure</span><span lang="zh-CN">以及服务端开发这块了。不过最近</span><span lang="en-US">Windows<br />App</span><span lang="zh-CN">方面的变化的确令人激动，今后在</span><span lang="en-US">App</span><span lang="zh-CN">开发这块应该还会持续关注。我们准备开始撰写若干篇关于云计算以及</span><span lang="en-US">Azure</span><span lang="zh-CN">的博客文章，暂定名《云计算设计模式指南》，这是第</span><span lang="en-US">0</span><span lang="zh-CN">篇，主要是给大家介绍一下我们的想法以及作为系列文章的目录。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span style="font-weight: bold;" lang="zh-CN">首先必须向</span><a href="https://msdn.microsoft.com/en-us/library/ff921345.aspx"><span style="font-weight: bold;" lang="en-US">P</span><span style="font-weight: bold;" lang="zh-CN">atterns &amp; </span><span style="font-weight: bold;" lang="en-US">P</span><span style="font-weight: bold;" lang="zh-CN">ractices</span></a><span style="font-weight: bold;" lang="zh-CN">（模式与实践</span><span style="font-weight: bold;" lang="en-US">,P&amp;P</span><span style="font-weight: bold;" lang="zh-CN">）小组及其</span><a href="https://msdn.microsoft.com/en-us/library/ff898430.aspx"><span style="font-weight: bold;" lang="zh-CN">Cloud Development</span></a><span style="font-weight: bold;" lang="zh-CN">系列致敬。我们希望有更多的开发者能够关注到</span><span style="font-weight: bold;" lang="en-US">P&amp;P</span><span style="font-weight: bold;" lang="zh-CN">的</span><a href="https://msdn.microsoft.com/en-us/library/dn568099.aspx"><span style="font-weight: bold;" lang="zh-CN">Cloud Design Patterns: Prescriptive<br />Architecture Guidance for Cloud Applications</span></a><span style="font-weight: bold;" lang="zh-CN">。该系列中包含了</span><span style="font-weight: bold;" lang="en-US">24</span><span style="font-weight: bold;" lang="zh-CN">个云计算设计模式以及</span><span style="font-weight: bold;" lang="en-US">10</span><span style="font-weight: bold;" lang="zh-CN">个通用场景的设计指导。</span><span lang="zh-CN">这里所讲的设计模式并不是指类似</span><a href="https://en.wikipedia.org/wiki/Design_Patterns"><span lang="zh-CN">经典</span><span lang="en-US">GoF</span><span lang="zh-CN">的设计模式</span></a><span lang="zh-CN">的侧重面向对象、软件工程方面的设计指引，而是联系云计算环境的一些特质和优势所作出的架构设计层次最佳实践。可贵之处在于，事实上其中涉及到</span><span lang="en-US">Azure</span><span lang="zh-CN">的功能、服务方面的内容并不占太多篇幅，更多的只是在描述某个场景的最佳实践的同时，提及对应的在</span><span lang="en-US">Azure</span><span lang="zh-CN">中能通过哪些服务组件来完成目标。所以该系列文章老少咸宜，不管开发者关心的是不是</span><span lang="en-US">Azure</span><span lang="zh-CN">或是</span><span lang="en-US">.Net</span><span lang="zh-CN">，都将从中受益。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span lang="zh-CN">言归正传，正值</span><span lang="en-US">Azure</span><span lang="zh-CN">在中国大陆</span><a href="https://www.windowsazure.cn/anniversary"><span lang="zh-CN">正式商用一周年</span></a><span lang="zh-CN">之际，我们最近也在构思一系列的关于</span><span lang="en-US">Azure</span><span lang="zh-CN">以及云计算架构设计方面的中文博客文章，内容主要来自于平时的实践和积累，所以在引用和翻译到一些</span><span lang="en-US">Azure</span><span lang="zh-CN">官方和非官方的文档资料的同时，还会尝试加入一些个人的观点、学习笔记以及样例代码、项目。早些在学习前文所提到的</span><span lang="en-US">Cloud Design Patterns</span><span lang="zh-CN">系列的时候就已经向几乎身边所有关心</span><span lang="en-US">Azure</span><span lang="zh-CN">的同事朋友强烈推荐阅读。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span lang="zh-CN">我们在日常工作中接触到不少国内外的</span><span lang="en-US">Azure</span><span lang="zh-CN">用户，主要还是把</span><span lang="en-US">Azure</span><span lang="zh-CN">平台当做</span><span lang="en-US">IDC</span><span lang="zh-CN">托管机房来用，没有或者来不及考虑利用一些</span><span lang="en-US">Azure</span><span lang="zh-CN">所提供的非常优秀的特性和服务来优化开发和降低运维成本。现在提笔写这个系列文章的最主要的一个动机是希望更多的开发者在接触到云计算特别是</span><span lang="en-US">Azure</span><span lang="zh-CN">的时候，除了</span><span lang="en-US">IaaS </span><span lang="zh-CN">的</span><span lang="en-US">VM</span><span lang="zh-CN">、</span><span lang="en-US">Networking</span><span lang="zh-CN">等基础设施的迁移之外，能够在开发设计层面重新审视一下当前的实现和架构是否已经充分利用到了云平台的优势，是否能够适应分布式计算存储、易伸缩等架构特性。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">以下是我想到的内容大纲，不保证坑会被完全且按次序在接下来几个月中填满，但一定尽力。</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span style="font-weight: bold;" lang="en-US">Cache-Aside</span><span style="font-weight: bold;" lang="zh-CN">。</span><span lang="zh-CN">考虑将一个传统</span><span lang="en-US">Web </span><span lang="zh-CN">服务的满足横向扩展（</span><span lang="en-US">scale out</span><span lang="zh-CN">）的特性并迁移到云端的第一步往往是检查其缓存机制，这里并不是指狭义上的页面缓存或是数据缓存，而是包括了应用逻辑是否会依赖于某个特别计算实例内的磁盘内容、内存对象、全局变量和缓存数据等等。</span><span lang="en-US">Azure</span><span lang="zh-CN">提供了多种缓存服务但当前官方推荐的是使用</span><span lang="en-US">Redis Service</span><span lang="zh-CN">，不仅功能强大而且</span><span lang="en-US">Client API</span><span lang="zh-CN">通用，我们可以通过</span><span lang="en-US">Linux</span><span lang="zh-CN">或</span><span lang="en-US">Windows Server VM</span><span lang="zh-CN">来部署自己的</span><span lang="en-US">Redis</span><span lang="zh-CN">服务。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span style="font-weight: bold;" lang="en-US">Competing Consumer</span><span style="font-weight: bold;" lang="zh-CN">，</span><span style="font-weight: bold;" lang="en-US">Priority Queue</span><span style="font-weight: bold;" lang="zh-CN">，</span><span style="font-weight: bold;" lang="en-US">Queue-based Load Leveling Pattern</span><span style="font-weight: bold;" lang="zh-CN">，</span><span style="font-weight: bold;" lang="en-US">Scheduler<br />Agent Supervisor Pattern</span><span lang="zh-CN">等多方消息传递和分发的相关模式。不同节点之间的通讯消息，在经过队列</span><span lang="en-US">Queue</span><span lang="zh-CN">或主题</span><span lang="en-US">Topic</span><span lang="zh-CN">的缓冲和分发之后，能够极大程度上提高消息传递的效率和可靠性。</span><span lang="en-US">Azure</span><span lang="zh-CN">中消息队列服务我们一般会用到</span><span lang="en-US">Service Bus</span><span lang="zh-CN">。消息传递是个非常大的主题，我们将联系实例场景用最基础的代码演示</span><span lang="en-US">Service Bus</span><span lang="zh-CN">对以上这几个经典场景模式的实现。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span style="font-weight: bold;" lang="en-US">Retry pattern</span><span style="font-weight: bold;" lang="zh-CN">。</span><span lang="zh-CN">在公有云的环境中，整套解决方案中所涉及的包括虚拟机、网站、存储、数据库、消息队列等等服务可能散落在多个机柜甚至数据中心，而各个服务所在的物理宿主可能被多个实例共享，数据包也可能会被高负荷的网络所临时阻塞。所以在服务间互相调用的时候会有一定几率临时性地产生一些极短暂的错误（</span><span lang="en-US">transient error</span><span lang="zh-CN">），而这些错误往往并不是服务器这段的问题，且只需毫秒级别的等待重试就能解决问题。为了程序能够平稳运行，我们需要能识别这些</span><span lang="en-US">transient error</span><span lang="zh-CN">并加入重试</span><span lang="en-US">Retry</span><span lang="zh-CN">的相关机制。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span style="font-weight: bold;" lang="en-US">Cost Effectiveness Design</span><span lang="zh-CN">成本效益最大化设计。了解</span><span lang="en-US">Azure</span><span lang="zh-CN">的计费模式介绍、制定缩放计划、识别缩放单元</span><span lang="en-US">Scale Unit</span><span lang="zh-CN">、</span><span lang="zh-CN">通过</span><span lang="en-US">Management API</span><span lang="zh-CN">进行自动化操作和管理将会显著降低运维成本，这些特性也是云平台同托管机房的最大的优势。而在功能实现层面，我们可以通过</span><span lang="en-US">Azure</span><span lang="zh-CN">平台或</span><span lang="en-US">SDK</span><span lang="zh-CN">内建的诊断工具（</span><span lang="en-US">Diagnostics</span><span lang="zh-CN">）集中记录和分析服务的运行情况，以分析最优的部署和缩放方案。同时某些细节功能的优化实现也能提高服务接口的吞吐量，更高效合理地利用带宽和存储资源。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span style="font-weight: bold;" lang="en-US">NoSQL</span><span lang="zh-CN">非关系型数据库实践。同传统关系型数据库相比，主流的</span><span lang="en-US">NoSQL</span><span lang="zh-CN">解决方案在可扩展性、高可用性、并发查询等方面有极大优势，键</span><span lang="en-US">-</span><span lang="zh-CN">值的基本存储和查询方式也允许表内数据结构可变（</span><span lang="en-US">Schema Free</span><span lang="zh-CN">），更能适应海量以及非结构数据的大规模存储查询的需要。</span><span lang="en-US"> Azure</span><span lang="zh-CN">提供了</span><span lang="en-US">Storage<br />Table</span><span lang="zh-CN">、</span><span lang="en-US">DocumentDB</span><span lang="zh-CN">等</span><span lang="en-US">NoSQL</span><span lang="zh-CN">服务，亦可自行在</span><span lang="en-US">Linux VM</span><span lang="zh-CN">上部署</span><span lang="en-US">Mongo DB</span><span lang="zh-CN">。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span style="font-weight: bold;" lang="en-US">Troubleshooting Azure</span><span lang="zh-CN">故障排错的方法和工具。日常工作中我们需要同客户一起解决</span><span lang="en-US">Azure</span><span lang="zh-CN">使用过程中碰到的问题。有时我们通过查询数据中心端能够定位问题所在，但是更多时候我们会通过一些更高效的方法来帮助排错。而这里所涉及到的一些工具和方法本身其实并不局限于</span><span lang="en-US">MSFT</span><span lang="zh-CN">内部或付费客户。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span lang="zh-CN">同时，我们当前正在开发一个</span><span style="font-weight: bold;" lang="zh-CN">原型项目</span><span style="font-weight: bold;" lang="en-US">(POC)</span><span lang="zh-CN">。初步想法是构建可随时缩放、扩展的爬虫集群，从外部数据源抓取数据，存储到本地的数据库。最终客户端能够通过</span><span lang="en-US">API</span><span lang="zh-CN">查询数据。</span><span lang="zh-CN">抓取操作可以实时响应客户端要求，也能按照既定计划由专门的任务服务器所统筹。</span><span lang="zh-CN">这个项目需要运用到多种云计算设计模式和场景，也会涉及到</span><span lang="en-US">Azure</span><span lang="zh-CN">的多个服务，包括</span><span lang="en-US">Websites/WebRole/WorkerRole/ServiceBus/DocumentDB/Redis/API<br />Management</span><span lang="zh-CN">等。待代码相对稳定成熟后会发布源代码和相关文档。。</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">其他方面之后亦会随时补充。</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;" lang="zh-CN">&nbsp;</p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span style="font-weight: bold;" lang="zh-CN">文章目录索引</span><span style="font-weight: bold;" lang="en-US"> (</span><span style="font-weight: bold;" lang="zh-CN">最后更新</span><span style="font-weight: bold;" lang="en-US">3/30)</span><span style="font-weight: bold;" lang="zh-CN">：</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;"><span lang="zh-CN">云计算设计模式指南系列（</span><span lang="en-US">0</span><span lang="zh-CN">）</span><span lang="en-US"> - </span><span lang="zh-CN">背景简介及内容提要</span></p>
<p style="margin: 0in; font-family: 微软雅黑; font-size: 10.5pt;">&hellip;</p>]]></content:encoded>
    </item>
    <item>
      <title>NFC 与 Windows Phone 的那点事儿</title>
      <link>https://docs.microsoft.com/archive/blogs/lighthouse/nfc-windows-phone</link>
      <pubDate>Sun, 18 Jan 2015 01:03:58 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/lighthouse/2015/01/18/nfc-windows-phone/</guid>
      <description><![CDATA[说起NFC这个词儿应该已经不陌生了，在我们的生活中有很多使用场景都是使用的这项技术，例如公交卡，门禁，还有银联的闪付卡等等。并且近些年在移动设备上使用的场景也越来越多，例如 对 NFC TAG...]]></description>
      <content:encoded><![CDATA[<p>说起NFC这个词儿应该已经不陌生了，在我们的生活中有很多使用场景都是使用的这项技术，例如公交卡，门禁，还有银联的闪付卡等等。并且近些年在移动设备上使用的场景也越来越多，例如 对 NFC TAG 的读写，对 NFC+蓝牙 耳机音响的支持，还有手机和手机之间的数据交换场景。</p>  <p>说起NFC这项技术其实也不算新奇了，许多手机都支持例如，Nokia、三星、SONY、HTC、小米都有机型硬件支持NFC的功能。在应用商店中搜索NFC也可以找到不少 NFC 相关的应用，但是目前来讲使用率还是个问题，不管怎样今天我还是想在这里为大家 分享一下在 Windows Phone 平台中对NFC功能的技术支持情况。对不对的请大家参考一下，多多提些意见。</p>  <p>从NFC在手机上支持的场景上看大致分为三种模式（点对点模式，主动模式，被动模式）</p>  <p>首先说一下点对点模式，点对点模式实际上就是在两台手机上都同时打开NFC后，将手机进行触碰（实现 Touch and Connect就是一个典型场景），通过NFC的数据交换，可以引导不同设备进行连接，例如应用和应用间的 Socket，蓝牙耳机、音响 （基于蓝牙配对）。这部分内容请参考我之前的文章 <a href="https://www.cnblogs.com/sonic1abc/archive/2013/03/11/2953999.html" target="_blank">近场通信 NFC / Bluetooth Proximity</a></p>  <p><img src="https://i3.bbs.fd.zol-img.com.cn/t_s800x5000/g4/M09/0D/03/Cg-4WlHABLeIemk9AAAfDXJHivwAAJ0LwFQTwoAAB8l369.jpg" /></p>  <p>&#160;</p>  <p>主动模式 （读/写 卡模式） 就是在移动设备中NFC模块产生射频场从外部采用相同标准的NFC标签中读写数据。这里面有一个典型的使用场景就是在Android手机上使用支付宝为公交卡充值。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/4572.image_0F0F0B39.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/4572.image_5F00_0F0F0B39.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3414.image_thumb_48B6C685.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3414.image_5F00_thumb_5F00_48B6C685.png" width="360" height="234" /></a></p>  <p>或者从应用当中通过NFC读取银行卡的消费记录</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0601.image_05DD12BC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0601.image_5F00_05DD12BC.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0003.image_thumb_220FEC4B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0003.image_5F00_thumb_5F00_220FEC4B.png" width="261" height="347" /></a></p>  <p>以上两个场景都是属于主动模式，在 Windows Phone 生态系统中也不乏对NFC前景看好的朋友研究过此类功能。在 Windows Phone 8.0 SL 的框架下开发由于SDK的限制不能使用除了NDEN以外的通信格式。所以不能支持此功能，但是在现在的 Windows Universal 框架下 Windows Phone 8.1 可以通过Windows.Devices.SmartCards.SmartCardReader，Windows.Devices.Enumeration.DeviceInformation等SDK实现此功能，但是要有一点要注意的是和类似公交卡这样的NFC设备进行交互还需要手机硬件NFC芯片的支持，<font style="background-color: #ffff00">特需NXP PN547芯片</font> 只要配置此种芯片的手机就可以实现 多种协议的NFC卡片交互例如：<font style="background-color: #ffff00">MIFARE Classic/Ultralight/DESfire</font> 如果我没记错的话 公交卡是第一种。目前在Windows Phone 家族中使用此种芯片的设备有 (Lumia 830 &amp; 73x）</p>  <p>这里我列举一个 Sample Code， 由于本人手上木有这新款设备暂时没有上手测试过，不过凭直觉看上去问题不大。（如果有测试设备或者有开发过Android类似应用的大牛，还请帮忙测试一下，很愿意和大家一起研究这部分功能）这里还有一个CodePlex上的开源项目用于介绍这部分功能：<a href="https://nfcsmartcardreader.codeplex.com/" target="_blank">NFC Smart Card Reader PC/SC Library</a></p>  <div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5">   <pre><span style="color: #0000ff">public</span> <span style="color: #0000ff">async</span> <span style="color: #0000ff">void</span><span style="color: #000000"> TestNFC()
        {
            </span><span style="color: #0000ff">string</span> selector =<span style="color: #000000"> SmartCardReader.GetDeviceSelector();
            </span><span style="color: #0000ff">var</span> deviceInfoCollection = <span style="color: #0000ff">await</span> Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(selector, <span style="color: #0000ff">null</span><span style="color: #000000">);
 
            </span><span style="color: #0000ff">if</span> (deviceInfoCollection.Count != <span style="color: #800080">0</span><span style="color: #000000">)
            {
                </span><span style="color: #0000ff">var</span> scReader = <span style="color: #0000ff">await</span> Windows.Devices.SmartCards.SmartCardReader.FromIdAsync(deviceInfoCollection[<span style="color: #800080">0</span><span style="color: #000000">].Id);
 
                scReader.CardAdded </span>+= <span style="color: #0000ff">async</span> (s, c) =&gt;<span style="color: #000000">
                    {
                        SmartCard sc </span>=<span style="color: #000000"> c.SmartCard;
                        SmartCardStatus scStatus </span>= <span style="color: #0000ff">await</span><span style="color: #000000"> sc.GetStatusAsync();
                        </span><span style="color: #0000ff">if</span> (scStatus == SmartCardStatus.Ready) <span style="color: #008000">//</span><span style="color: #008000"> This Check is not needed.</span>
<span style="color: #000000">                        { 
                            SmartCardConnection scConn </span>= <span style="color: #0000ff">await</span><span style="color: #000000"> c.SmartCard.ConnectAsync();
                            scConn.TransmitAsync(</span><span style="color: #008000">/*</span><span style="color: #008000">APDU command</span><span style="color: #008000">*/</span>); <span style="color: #008000">//</span><span style="color: #008000"> You can send the command and receive the response from Device</span>
<span style="color: #000000">                        }
                    };
            }
        }</span></pre>
</div>

<p>被动模式（卡模拟 - Card Emulation），顾名思义就是将具备NFC功能的手机模拟成一张消费/会员/银行/等。卡片进行数据（花）交互（钱）。谈到跟钱相关的交互不得不提的一个名词就是 <font style="background-color: #ffff00">NFC- Secure Element</font> 既： <font style="background-color: #ffff00">NFC–SE</font> 这个SE我们可以简单的理解成是我们在网上消费时使用网银过程中让我们插入电脑USB接口中的U盾。 这里存有用户支付相关的安全信息，需要由单独的设备保存。目前在所有手机平台中做法分为三种：</p>

<p>第一种，独立存储芯片（全终端的解决方案 - Embedded），例如苹果设备（iP6 用户的指纹等安全信息是保存在独立的芯片当中），提供最高安全级别的权限，并且会开发部分SDK给 MO，银行，及开发者。</p>

<p>第二种，SWP（Single Wire Protocol - UICC）其中还有 eNFC、NFC-SIM 其实都是可以将安全信息写在 SIM 卡中，例如 现在中国移动有一种NFC-SIM卡就是这种解决方案，实现了公交卡刷卡乘坐地铁和公交的功能，其他三方应用需要和中国移动这样的运营商合作才能使用这类的 SE 进行消费验证。</p>

<p>第三种，NFC-SD 如果严格说NFC-SD 也是SWP的一种，为什么把它单独拿出来的原因是他与SIM的SE相比更为灵活。不会受到MO的制约，受到银行的认可（因为每个银行本来就是有自己的U盾么），但是 NFC –SD 的短板也非常明显，首先不是所有所有的手机都支持SD卡的SE，另外面对不同的消费的模拟需要更换不同的SD卡对于用户来说还是太挑战了，所以没有广泛的使用起来。</p>

<p>所以综上所述，手机内独立芯片的场景目前应该是 Apple 在尝试走的路，SWP（NFC-SIM）使用较为多的一种在Windows Phone 中同样也是支持的，对于NFC Emulation的开发内容就会牵扯到手机对UICC SE （Universal Integrated Circuit Card）的操作，这里需要开发者如果要完整SE的支付是需要和 运营商（MO） 的开发者一同完成整个购买流程，另外如果是MO自己的应用有些操作内容是需要MO权限才可以例如：更新部分SE内容。（这部分内容我暂时也没有试过，如果有MO开发者想做WP上的内容欢迎联系，我们一起研究探讨）微软对于如何申请MO权限以及如何UICC SE内容也有一个指导书大家可以参考一下。总的来说还是要申请权限建立信任证书，然后根据MO的信任机制进行开发流程：</p>

<p>参考：<a href="https://www.microsoft.com/en-us/download/details.aspx?id=43681" target="_blank">App development guide for UICC based NFC card emulation for Windows Phone 8.1</a></p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3808.image_66E3C292.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3808.image_5F00_66E3C292.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/5584.image_thumb_4AD59458.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/5584.image_5F00_thumb_5F00_4AD59458.png" width="576" height="228" /></a></p>

<p>从实现场景上看目前中国移动以及和多家进行了合作例如</p>

<p>北京市政公交一卡通</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6765.image_2EC7661E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6765.image_5F00_2EC7661E.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/2626.image_thumb_4A909D69.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/2626.image_5F00_thumb_5F00_4A909D69.png" width="244" height="222" /></a></p>

<p>银行的闪付</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/4431.image_77A81AE8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/4431.image_5F00_77A81AE8.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/2742.image_thumb_3AA90AB8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/2742.image_5F00_thumb_5F00_3AA90AB8.png" width="244" height="142" /></a></p>

<p>今天我在这里只是为大家介绍了一下NFC支付相关内容，在 Windows Phone 8.1 也是具备 读卡，刷卡，支付 等场景的，希望大家了解了这部分内容后可以结合自己好的想法做出更好的应用，相信今后是一定会迎来一个NFC时代的到来大家赶快行动起来吧：）</p>

<p>希望上的总结可以帮助到大家, 同时欢迎大家在这里和我沟通交流或者在新浪微博上 <a href="https://www.weibo.com/wangvbo">@王博_Nick</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Phone 8.1 Update1 支持中文“小娜”及开发者模拟器更新</title>
      <link>https://docs.microsoft.com/archive/blogs/lighthouse/windows-phone-8-1-update1</link>
      <pubDate>Tue, 05 Aug 2014 01:37:56 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/lighthouse/2014/08/05/windows-phone-8-1-update1/</guid>
      <description><![CDATA[千呼万唤的 Windows Phone 8.1 Update1 在 developer Perview 发布了还没有升级的朋友随我先睹为快吧。升级了的盆友来看看 WP8.1 update1...]]></description>
      <content:encoded><![CDATA[<p>千呼万唤的 Windows Phone 8.1 Update1 在 developer Perview 发布了还没有升级的朋友随我先睹为快吧。升级了的盆友来看看 WP8.1 update1 还有哪些你不知道的功能。当然这里包括我们一直念叨的中文版 Cortana。</p>  <p>首先介绍一下 Windows Phone 8.1 New features</p>  <p>1. Cortana 中文版不用多说，升级后尽情的调戏吧。（做开发的朋友参考 <a href="https://www.cnblogs.com/sonic1abc/p/3868729.html">如何将 Cortana 与 Windows Phone 8.1 应用集成</a> ）</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/4010.helloJoe_1DDAA371.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/4010.helloJoe_5F00_1DDAA371.png"><img title="helloJoe" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="helloJoe" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6013.helloJoe_thumb_561BAB3A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6013.helloJoe_5F00_thumb_5F00_561BAB3A.png" width="244" height="145" /></a></p>  <p>2. Live Folders ( 暂且翻译成 动态文件夹吧 )：原因很简单，即使将应用的 Tile 放到文件夹后也可以保持 live Tile的特性，并且可以调整 Tile 的大小。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/7382.start-folder-create_InvariantCulture_Default_2D139CEF.gif" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/7382.start_2D00_folder_2D00_create_5F00_InvariantCulture_5F00_Default_5F00_2D139CEF.gif"><img title="start-folder-create_InvariantCulture_Default" style="display: inline" alt="start-folder-create_InvariantCulture_Default" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/2475.start-folder-create_InvariantCulture_Default_thumb_6C07AE3B.gif" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/2475.start_2D00_folder_2D00_create_5F00_InvariantCulture_5F00_Default_5F00_thumb_5F00_6C07AE3B.gif" width="262" height="434" /></a>&#160; <img alt="medium-live-folder-expanded" src="https://az648995.vo.msecnd.net/win/2014/07/medium_2D00_live_2D00_folder_2D00_expanded_5F00_thumb_5F00_2EB3A7D4.png" width="246" height="437" /></p>  <p>3. Store Live Tile（应用商店动态磁贴）：应用商店可以显示最新的应用情况。（每六小时更新一次）</p>  <p><img alt="store-tile-1" src="https://az648995.vo.msecnd.net/win/2014/07/store_2D00_tile_2D00_1_5F00_thumb_5F00_226CC0B1.png" />&#160; <img alt="store-tile-2" src="https://az648995.vo.msecnd.net/win/2014/07/store_2D00_tile_2D00_2_5F00_thumb_5F00_26E5D229.png" />&#160; <img alt="store-tile-3" src="https://az648995.vo.msecnd.net/win/2014/07/store_2D00_tile_2D00_3_5F00_thumb_5F00_04249A6C.png" /></p>  <p>4. 信息的多选和转发功能： 增加了信息的多选并且可以选择新建消息和多选删除。</p>  <p><img alt="Messaging_chatView_16x9_7_30_14" src="https://az648995.vo.msecnd.net/win/2014/07/Messaging_5F00_chatView_5F00_16x9_5F00_7_5F00_30_5F00_14_5F00_thumb_5F00_3F8E4A0D.png" /></p>  <p>5. Apps Corner : 这是一个偏向于企业应用的功能，有点类似于8.0里面就有的儿童天地，让几个特殊的应用运行在一个特殊的沙箱当中。</p>  <p>6. Accessory apps and notifications：这也是一个非常火爆的功能，例如智能手环，智能手表的提醒，可以于手机进行同步。</p>  <p>7. VPN 新增了 L2TP 的支持（目前支持 IKEv2 VPN 和 IPSec L2TP）。</p>  <p>8. Internet 分享功能的增强： 使用蓝牙连接分享手机移动网络。</p>  <p>&#160;</p>  <p>另外：还有一些功能就不单独解释了等待大家使用中去发掘吧，或者你也可以参考<a href="https://www.windowsphone.com/en-us/how-to/wp8/basics/windows-phone-8-update-history" target="_blank">微软官方升级文档</a> , 如果你不知道怎么通过 WP8.1 Developer Preview 升级 8.1 Update1 <a href="https://dev.windows.com/en-us/develop/devpreview" target="_blank">请点击这里</a>。</p>  <p>&#160;</p>  <p><font style="background-color: #ffff00">此次更新主要是针对用户体验（操作系统体验的改进），对于开发者没有放出更多的SDK，但是提供了新的测试版模拟器用来配合Windows Phone 8.1 update1.</font></p>  <p><font style="background-color: #ffff00">注意</font>，<a href="https://blogs.windows.com/buildingapps/2014/08/04/windows-platform-developer-august-updates/" target="_blank">微软官方Blog</a> 提到 设备制造商提供了一些额外的API用来帮助 <font style="background-color: #ffff00">Windows Phone 的蓝牙连接功能，主要用于可穿戴设备</font>。</p>  <p>获取 Windows Phone 8.1 update1 模拟器可以通过安装 <a href="https://dev.windows.com/en-us/develop/downloads?logged_in=1" target="_blank">Windows Phone 8.1 Update 1 Emulators</a></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/4075.image_58E91240.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/4075.image_5F00_58E91240.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6253.image_thumb_01877E48.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6253.image_5F00_thumb_5F00_01877E48.png" width="748" height="622" /></a></p>  <p>除此以外还同事发布了 Visual&#160; Studio 2013 Update 3 开发者可以 <a href="https://www.visualstudio.com/en-us/downloads#d-visual-studio-2013-update" target="_blank">从此下载更新</a></p>]]></content:encoded>
    </item>
    <item>
      <title>如何将 Cortana 与 Windows Phone 8.1 应用集成 ( Voice command - Natural language recognition )</title>
      <link>https://docs.microsoft.com/archive/blogs/lighthouse/cortana-windows-phone-8-1-voice-command-natural-language-recognition</link>
      <pubDate>Wed, 30 Jul 2014 19:06:15 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/lighthouse/2014/07/30/cortana-windows-phone-8-1-voice-command-natural-language-recognition/</guid>
      <description><![CDATA[随着 Windows Phone 8.1 GDR1 + Cortana 中文版的发布，相信有很多用户或开发者都在调戏 Windows Phone 的语音私人助理 Cortana...]]></description>
      <content:encoded><![CDATA[<p>随着 Windows Phone 8.1 GDR1 + Cortana 中文版的发布，相信有很多用户或开发者都在调戏 Windows Phone 的语音私人助理 Cortana 吧，在世界杯的时候我亲测 Cortana 预测德国和阿根廷的比赛很准的。（题外话扯远了），可是作为开发者我们怎么将Cortana集成到应用中呢，今天我用一点时间给大家介绍一下如何使用 voice command 集成 Windows Phone 8.1 的应用。</p>  <p>首先要明确两个名词 <span style="background-color: #ffff00">Voice command</span> &amp; <span style="background-color: #ffff00">Voice Command Definition</span> 即 VCD文件，相信做过windows Phone 8.0 开发的朋友应该有所了解，通过注册VCD文件 Windows phone 8.0 的应用当中就可以实现 voice command 的功能，如果你不了解请先读一下我之前的文章（这里我就不在过多介绍 8.0 Voice command 的重复内容了），<a href="https://www.cnblogs.com/sonic1abc/archive/2012/11/18/2775153.html" target="_blank">Windows Phone 8 语音 - Speech for Windows Phone 8</a> 快速了解一下Windows Phone 开发语音功能的前期准备工作。</p>  <p>&#160;</p>  <p>简单的说在 Windows Phone 8.0 voice command 功能比较简单，主要是通过 Voice Command Name 判断预制在VCD文件中的几个命令。</p>  <p>在 Windows Phone 8.1 应用中 Cortana 提供了更强的自然语言识别（Natural language recognition）</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6835.Cortana1_5BA3BA6F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6835.Cortana1_5F00_5BA3BA6F.png"><img title="Cortana1" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Cortana1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0042.Cortana1_thumb_084F04FA.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0042.Cortana1_5F00_thumb_5F00_084F04FA.png" width="929" height="397" /></a></p>  <p>当然 VCD 文件的中的 grammars&#160; 也得到了扩充，并且区别两个OS版本的</p>  <p><a href="https://schemas.microsoft.com/voicecommands/1.0">https://schemas.microsoft.com/voicecommands/1.0</a> for Windows Phone 8.0 Voice Command and Cortana compatible.</p>  <p><strong><a href="https://schemas.microsoft.com/voicecommands/1.1">https://schemas.microsoft.com/voicecommands/1.1</a>&#160;<em><span style="text-decoration: underline">only for Widnows Phone 8.1 Cortnan.</span></em></strong></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6622.Cortana2_0302AEFA.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6622.Cortana2_5F00_0302AEFA.png"><img title="Cortana2" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Cortana2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/4382.Cortana2_thumb_0AB0390B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/4382.Cortana2_5F00_thumb_5F00_0AB0390B.png" width="928" height="508" /></a></p>  <p>详细内容请参考</p>  <h3>Windows Phone 8.0:&#160; <a href="https://msdn.microsoft.com/library/windows/apps/jj207041(v=vs.105).aspx" target="_blank">Voice command element and attribute reference for Windows Phone 8</a></h3>  <h3>Windows Phone 8.1:&#160; <a href="https://msdn.microsoft.com/en-us/library/windows/apps/xaml/dn722331.aspx" target="_blank">Voice command elements and attributes</a></h3>  <p>通过 8.0 和 8.1 VCD 文件属性支持情况来看有一个最主要的区别在8.1 VCD中支持 <span style="background-color: #ffff00">PhraseTopic</span> 这个属性。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6567.image_32E502CE.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6567.image_5F00_32E502CE.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/2046.image_thumb_0970C18E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/2046.image_5F00_thumb_5F00_0970C18E.png" width="859" height="592" /></a></p>  <p>文字说的太抽象了还是贴出代码给大家说说吧：</p>  <p>这里我主要强调说一<span style="color: #000000">下 ListenFor&#160; 结点和 PhraseTopic 结点。 注意在 Listenfor 结点中的中括号 {dictatedSearchTerms} 是对应的 PhraseTopic&#160; 结点中的 Label 属性。同时我们可以把 PhraseTopic 理解成<span style="background-color: #ffff00">任意内容</span>。最后都可以从Cortana回传到我们的应用当中来。</span></p>  <div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5">   <pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">VoiceCommands </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">=&quot;https://schemas.microsoft.com/voicecommands/1.1&quot;</span><span style="color: #0000ff">&gt;</span>
    <span style="color: #008000">&lt;!--</span><span style="color: #008000"> The CommandSet Name is used to programmatically access the CommandSet </span><span style="color: #008000">--&gt;</span>
    <span style="color: #0000ff">&lt;</span><span style="color: #800000">CommandSet </span><span style="color: #ff0000">xml:lang</span><span style="color: #0000ff">=&quot;zh-CN&quot;</span><span style="color: #ff0000"> Name</span><span style="color: #0000ff">=&quot;chineseCommands&quot;</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #008000">&lt;!--</span><span style="color: #008000"> The CommandPrefix provides an alternative to your full app name for invocation </span><span style="color: #008000">--&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">CommandPrefix</span><span style="color: #0000ff">&gt;</span> 微软 文档 <span style="color: #0000ff">&lt;/</span><span style="color: #800000">CommandPrefix</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #008000">&lt;!--</span><span style="color: #008000"> The CommandSet Example appears in the global help alongside your app name </span><span style="color: #008000">--&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">Example</span><span style="color: #0000ff">&gt;</span> 搜索 构造 函数 <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Example</span><span style="color: #0000ff">&gt;</span>

        <span style="color: #0000ff">&lt;</span><span style="color: #800000">Command </span><span style="color: #ff0000">Name</span><span style="color: #0000ff">=&quot;MSDNSearch&quot;</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #008000">&lt;!--</span><span style="color: #008000"> The Command example appears in the drill-down help page for your app </span><span style="color: #008000">--&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">Example</span><span style="color: #0000ff">&gt;</span> 搜索 构造 函数' <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Example</span><span style="color: #0000ff">&gt;</span>

            <span style="color: #008000">&lt;!--</span><span style="color: #008000"> ListenFor elements provide ways to say the command, including references to 
            {PhraseLists} and {PhraseTopics} as well as [optional] words </span><span style="color: #008000">--&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span> 查找 {dictatedSearchTerms} <span style="color: #0000ff">&lt;/</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span> 搜 {dictatedSearchTerms} <span style="color: #0000ff">&lt;/</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span> 搜索  {dictatedSearchTerms} <span style="color: #0000ff">&lt;/</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span> 查 {dictatedSearchTerms} <span style="color: #0000ff">&lt;/</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span> 找 {dictatedSearchTerms} <span style="color: #0000ff">&lt;/</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span>

          <span style="color: #008000">&lt;!--</span><span style="color: #008000">Feedback provides the displayed and spoken text when your command is triggered </span><span style="color: #008000">--&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">Feedback</span><span style="color: #0000ff">&gt;</span> 查找 MSDN... <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Feedback</span><span style="color: #0000ff">&gt;</span>

            <span style="color: #008000">&lt;!--</span><span style="color: #008000"> Navigate specifies the desired page or invocation destination for the Command</span><span style="color: #008000">--&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">Navigate </span><span style="color: #ff0000">Target</span><span style="color: #0000ff">=&quot;MainPage.xaml&quot;</span> <span style="color: #0000ff">/&gt;</span>
        <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Command</span><span style="color: #0000ff">&gt;</span>

        <span style="color: #0000ff">&lt;</span><span style="color: #800000">Command </span><span style="color: #ff0000">Name</span><span style="color: #0000ff">=&quot;MSDNNaturalLanguage&quot;</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">Example</span><span style="color: #0000ff">&gt;</span> 我 想 去 Windows 手机 开发 中心 <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Example</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span> {naturalLanguage} <span style="color: #0000ff">&lt;/</span><span style="color: #800000">ListenFor</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">Feedback</span><span style="color: #0000ff">&gt;</span> 启动 MSDN... <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Feedback</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">Navigate </span><span style="color: #ff0000">Target</span><span style="color: #0000ff">=&quot;MainPage.xaml&quot;</span> <span style="color: #0000ff">/&gt;</span>
        <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Command</span><span style="color: #0000ff">&gt;</span>

        <span style="color: #0000ff">&lt;</span><span style="color: #800000">PhraseTopic </span><span style="color: #ff0000">Label</span><span style="color: #0000ff">=&quot;dictatedSearchTerms&quot;</span><span style="color: #ff0000"> Scenario</span><span style="color: #0000ff">=&quot;Search&quot;</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">Subject</span><span style="color: #0000ff">&gt;</span> MSDN <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Subject</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #0000ff">&lt;/</span><span style="color: #800000">PhraseTopic</span><span style="color: #0000ff">&gt;</span>

        <span style="color: #0000ff">&lt;</span><span style="color: #800000">PhraseTopic </span><span style="color: #ff0000">Label</span><span style="color: #0000ff">=&quot;naturalLanguage&quot;</span><span style="color: #ff0000"> Scenario</span><span style="color: #0000ff">=&quot;Natural Language&quot;</span><span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span><span style="color: #800000">Subject</span><span style="color: #0000ff">&gt;</span> MSDN <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Subject</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #0000ff">&lt;/</span><span style="color: #800000">PhraseTopic</span><span style="color: #0000ff">&gt;</span>

    <span style="color: #0000ff">&lt;/</span><span style="color: #800000">CommandSet</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">VoiceCommands</span><span style="color: #0000ff">&gt;</span></pre>
</div>

<p>&#160;</p>

<p>了解完新的VCD文件，在这里我提醒下大家，<span style="background-color: #ffff00">其实在Windows Phone 8.0的应用中也可以兼容 Cortana的功能的</span>，在8.0的应用当中我们只需要判断一下操作系统的版本然后选择不同的VCD文件向系统注册即可。</p>

<p>首先我们需要把两个版本的VCD文件都存放到项目中来</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0523.image_6B289B48.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0523.image_5F00_6B289B48.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/7888.image_thumb_260FCE12.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/7888.image_5F00_thumb_5F00_260FCE12.png" width="389" height="438" /></a></p>

<p>其次在注册VCD文件的时候根据<span style="background-color: #ffff00">系统版本</span>进行一下判断即可。</p>

<div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5">
  <pre><span style="color: #808080">        ///</span> <span style="color: #808080">&lt;summary&gt;</span>
        <span style="color: #808080">///</span><span style="color: #008000"> Installs the Voice Command Definition (VCD) file associated with the application.
        </span><span style="color: #808080">///</span><span style="color: #008000"> Based on OS version, installs a separate document based on version 1.0 of the schema or version 1.1.
        </span><span style="color: #808080">///</span> <span style="color: #808080">&lt;/summary&gt;</span>
        <span style="color: #0000ff">private</span> <span style="color: #0000ff">async</span> <span style="color: #0000ff">void</span><span style="color: #000000"> InstallVoiceCommands()
        {
            </span><span style="color: #0000ff">const</span> <span style="color: #0000ff">string</span> wp80vcdPath = <span style="color: #800000">&quot;</span><span style="color: #800000">ms-appx:///VoiceCommandDefinition_8.0.xml</span><span style="color: #800000">&quot;</span><span style="color: #000000">;
            </span><span style="color: #0000ff">const</span> <span style="color: #0000ff">string</span> wp81vcdPath = <span style="color: #800000">&quot;</span><span style="color: #800000">ms-appx:///VoiceCommandDefinition_8.1.xml</span><span style="color: #800000">&quot;</span><span style="color: #000000">;
            </span><span style="color: #0000ff">const</span> <span style="color: #0000ff">string</span> chineseWp80vcdPath = <span style="color: #800000">&quot;</span><span style="color: #800000">ms-appx:///ChineseVoiceCommandDefinition_8.0.xml</span><span style="color: #800000">&quot;</span><span style="color: #000000">;
            </span><span style="color: #0000ff">const</span> <span style="color: #0000ff">string</span> chineseWp81vcdPath = <span style="color: #800000">&quot;</span><span style="color: #800000">ms-appx:///ChineseVoiceCommandDefinition_8.1.xml</span><span style="color: #800000">&quot;</span><span style="color: #000000">;

            </span><span style="color: #0000ff">try</span><span style="color: #000000">
            {
                </span><span style="color: #0000ff">bool</span> using81orAbove = ((Environment.OSVersion.Version.Major &gt;= <span style="color: #800080">8</span><span style="color: #000000">)
                    </span>&amp;&amp; (Environment.OSVersion.Version.Minor &gt;= <span style="color: #800080">10</span><span style="color: #000000">));

                </span><span style="color: #0000ff">string</span> vcdPath = using81orAbove ?<span style="color: #000000"> wp81vcdPath : wp80vcdPath;
                </span><span style="color: #0000ff">if</span> (InstalledSpeechRecognizers.Default.Language.Equals(<span style="color: #800000">&quot;</span><span style="color: #800000">zh-CN</span><span style="color: #800000">&quot;</span><span style="color: #000000">, StringComparison.InvariantCultureIgnoreCase))
                {
                    vcdPath </span>= using81orAbove ?<span style="color: #000000"> chineseWp81vcdPath : chineseWp80vcdPath;
                }

                Uri vcdUri </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> Uri(vcdPath);
                </span><span style="color: #0000ff">await</span><span style="color: #000000"> VoiceCommandService.InstallCommandSetsFromFileAsync(vcdUri);
            }
            </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception vcdEx)
            {
                Dispatcher.BeginInvoke(() </span>=&gt;<span style="color: #000000">
                {
                    MessageBox.Show(String.Format(
                        AppResources.VoiceCommandInstallErrorTemplate, vcdEx.HResult, vcdEx.Message));
                });
            }
        }</span></pre>
</div>

<p>最后在应用当中获取用户的语音输入方法，注意这里也是需要通过 <span style="background-color: #ffff00">PhraseTopic</span> 结点的 <span style="background-color: #ffff00">Label </span>名称获取的。</p>

<div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5">
  <pre><span style="color: #808080">        ///</span> <span style="color: #808080">&lt;summary&gt;</span>
        <span style="color: #808080">///</span><span style="color: #008000"> Takes specific action for a retrieved VoiceCommand name.
        </span><span style="color: #808080">///</span> <span style="color: #808080">&lt;/summary&gt;</span>
        <span style="color: #808080">///</span> <span style="color: #808080">&lt;param name=&quot;voiceCommandName&quot;&gt;</span><span style="color: #008000"> the command name triggered to activate the application </span><span style="color: #808080">&lt;/param&gt;</span>
        <span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span> HandleVoiceCommand(<span style="color: #0000ff">string</span><span style="color: #000000"> voiceCommandName)
        {
            </span><span style="color: #008000">//</span><span style="color: #008000"> Voice Commands can be typed into Cortana; when this happens, &quot;voiceCommandMode&quot; is populated with the
            </span><span style="color: #008000">//</span><span style="color: #008000"> &quot;textInput&quot; value. In these cases, we'll want to behave a little differently by not speaking back.</span>
            <span style="color: #0000ff">bool</span> typedVoiceCommand = (NavigationContext.QueryString.ContainsKey(<span style="color: #800000">&quot;</span><span style="color: #800000">commandMode</span><span style="color: #800000">&quot;</span><span style="color: #000000">) 
                </span>&amp;&amp; (NavigationContext.QueryString[<span style="color: #800000">&quot;</span><span style="color: #800000">commandMode</span><span style="color: #800000">&quot;</span>] == <span style="color: #800000">&quot;</span><span style="color: #800000">text</span><span style="color: #800000">&quot;</span><span style="color: #000000">));

            </span><span style="color: #0000ff">string</span> phraseTopicContents = <span style="color: #0000ff">null</span><span style="color: #000000">;
            </span><span style="color: #0000ff">bool</span> doSearch = <span style="color: #0000ff">false</span><span style="color: #000000">;

            </span><span style="color: #0000ff">switch</span><span style="color: #000000"> (voiceCommandName)
            {
                </span><span style="color: #0000ff">case</span> <span style="color: #800000">&quot;</span><span style="color: #800000">MSDNNaturalLanguage</span><span style="color: #800000">&quot;</span><span style="color: #000000">:
                    </span><span style="color: #0000ff">if</span> (NavigationContext.QueryString.TryGetValue(<span style="color: #800000">&quot;</span><span style="color: #800000">naturalLanguage</span><span style="color: #800000">&quot;</span>, <span style="color: #0000ff">out</span><span style="color: #000000"> phraseTopicContents)
                        </span>&amp;&amp; !<span style="color: #000000">String.IsNullOrEmpty(phraseTopicContents))
                    {
                        </span><span style="color: #008000">//</span><span style="color: #008000"> We'll try to process the input as a natural language query; if we're successful, we won't
                        </span><span style="color: #008000">//</span><span style="color: #008000"> fall back into searching, since the query will have already been handled.</span>
                        doSearch =<span style="color: #000000"> TryHandleNlQuery(phraseTopicContents, typedVoiceCommand);
                    }
                    </span><span style="color: #0000ff">break</span><span style="color: #000000">;
                </span><span style="color: #0000ff">case</span> <span style="color: #800000">&quot;</span><span style="color: #800000">MSDNSearch</span><span style="color: #800000">&quot;</span><span style="color: #000000">:
                    </span><span style="color: #008000">//</span><span style="color: #008000"> The user explicitly asked to search, so we'll attempt to retrieve the query.</span>
                    NavigationContext.QueryString.TryGetValue(<span style="color: #800000">&quot;</span><span style="color: #800000">dictatedSearchTerms</span><span style="color: #800000">&quot;</span>, <span style="color: #0000ff">out</span><span style="color: #000000"> phraseTopicContents);
                    doSearch </span>= <span style="color: #0000ff">true</span><span style="color: #000000">;
                    </span><span style="color: #0000ff">break</span><span style="color: #000000">;
            }

            </span><span style="color: #0000ff">if</span><span style="color: #000000"> (doSearch)
            {
                HandleSearchQuery(phraseTopicContents, typedVoiceCommand);
            }
        }</span></pre>
</div>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0474.image_313BE90D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0474.image_5F00_313BE90D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0310.image_thumb_330C3ED4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0310.image_5F00_thumb_5F00_330C3ED4.png" width="696" height="180" /></a></p>

<p>整个过程就这么简单，心动不如行动，赶快把你的应用加入Cortana 功能让小伙伴儿们调戏一番。</p>

<p>更多参考资料：</p>

<p><a href="https://msdn.microsoft.com/en-us/library/windows/apps/xaml/dn630430.aspx" target="_blank">Quickstart: Voice commands (XAML)</a></p>

<p><a href="https://msdn.microsoft.com/library/windows/apps/jj206958(v=vs.105).aspx" target="_blank">Speech for Windows Phone 8</a></p>

<p><a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/dn630430.aspx" target="_blank">快速入门：语音命令 (XAML)</a></p>

<p>源码下载：</p>

<p><a href="https://code.msdn.microsoft.com/windowsapps/MSDN-Voice-Search-for-95c16d92">MSDN Voice Search for Windows Phone 8.1</a></p>]]></content:encoded>
    </item>
    <item>
      <title>A new stable version: A Private Windows Store project codename 'BootyBay' has been published to Codeplex!</title>
      <link>https://docs.microsoft.com/archive/blogs/lighthouse/a-new-stable-version-a-private-windows-store-project-codename-bootybay-has-been-published-to-codeplex</link>
      <pubDate>Mon, 09 Jun 2014 03:10:48 GMT</pubDate>
      <dc:creator><![CDATA[Ranger Yu]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/lighthouse/2014/06/09/a-new-stable-version-a-private-windows-store-project-codename-bootybay-has-been-published-to-codeplex/</guid>
      <description><![CDATA[Update&nbsp;June, 2014
Sorry for the long waiting!
Finally we published the latest version of this...]]></description>
      <content:encoded><![CDATA[<h4>Update&nbsp;June, 2014</h4>
<p>Sorry for the long waiting!</p>
<p>Finally we published the latest version of this POC onto codeplex. Actually most of the work has been done in April or earlier. Actually it is a kinda internal project so for some reasons we have to serve it internally.&nbsp;</p>
<p>We created a dedicated demo site with corresponding&nbsp;services on&nbsp;<a title="https://bootybaydemo.azurewebsites.net/" href="https://bootybaydemo.azurewebsites.net/" target="_blank">https://bootybaydemo.azurewebsites.net/</a>&nbsp;, and both store app &amp; local agent now point to this url (see the source file).&nbsp;</p>
<p>This website is used for admin but we didn't set any credential or login page. Again it is for proof of concept so please feel free to go through app adding process but please leave other's app there.</p>
<p>We host the db on Azure SQL Database and blobs on Azure Storage Blob. Of course we hided credentials from the shared source code but you may refer to Bootybay.ServerWebApp/App_Data/bootybayDBScript.sql for the db script. Actually we use Entity Framework code first so the models are the db script indeed.</p>
<p>later we will probably compose some technical articles about this project on our blog. Thank you for your interesting in this project!</p>
<p>&nbsp;</p>
<h4>What&rsquo;s this:</h4>
<p>A proof-of-concept of a Windows Private Store solution for enterprise side-loading app management, including a Windows Store App as the &ldquo;Private Store&rdquo;, a Desktop App as the &ldquo;Store Agent&rdquo;, an ASP.NET MVC web application as the &ldquo;Store Server&rdquo;.&nbsp; The target audiences are ISVs who are developing and deploying side-load apps to organizations. Our goal is&nbsp; to deploy LOB windows apps more easily then&nbsp; help the growth of the win8 device selling to enterprises.</p>
<h4>How to review the demo</h4>
<ul>
<li>Download and run the latest release for the app &amp; desktop agent clients&nbsp;<a href="https://bootybay.codeplex.com/releases/">https://bootybay.codeplex.com/releases/</a></li>
<li>Live Demo website:&nbsp;<a href="https://bootybaydemo.azurewebsites.net/">https://bootybaydemo.azurewebsites.net/</a></li>
<li>Fork or clone the source code and review the solution&nbsp;from your Visual Studio</li>
<li>Prerequisites:&nbsp;<strong>Client</strong>&nbsp;Windows 8.1 or Windows 2012 R2, sideloading app enabled. To enable sideloading, we need to&nbsp;<a href="https://msdn.microsoft.com/en-us/library/windows/apps/hh974578.aspx">Get a developer license</a>&nbsp;(once per month) or use a sideloading key. Currently this project doesn&rsquo;t provide any function or wizard to do the tasks;&nbsp;<strong>Server</strong>&nbsp;&ndash; standard&nbsp; ASP.Net 4.5 MVC</li>
</ul>
<h4>Brief architecture &amp; design:</h4>
<ul>
<li>desktop agent (BootyBay.WPFAgent,BootyBay.StoreAppMgmtCore)
<ul>
<li><a href="https://bootybay.codeplex.com/releases/view/117747">download &amp; release note</a></li>
<li>Add, Update, Uninstall side-loading app based on the store app&rsquo;s request</li>
<li>Retrieve app package&rsquo;s local status and provide to the store app</li>
<li>it hosts a WCF service endpoint on&nbsp;<a href="https://localhost:18733/">https://localhost:18733</a>&nbsp;and requires admin privilege, otherwise we would have published it as ClickOnce</li>
<li>It helps to deploy the store app, and&nbsp;<a href="https://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx">enables it loopback for network access by &ldquo;CheckNetIsolation.exe LoopbackExempt&rdquo;</a>&nbsp;, otherwise it cannot communicate with an endpoint under localhost. - in new windows 8.1, by default a sideloading app has loopback exempt already.</li>
</ul>
</li>
</ul>
<ul>
<li>windows store app (BootyBay.PrivateStoreApp)
<ul>
<li>it will be automatically downloaded, deployed and started when the desktop agent runs.</li>
<li>List Apps by Search/Category, check app detail by consuming web services from the server.</li>
<li>Communicate with desktop agent for app package related tasks</li>
<li>We tried to&nbsp;bring a&nbsp;same or similar experience as the public Store app.</li>
</ul>
</li>
</ul>
<ul>
<li>web application (BootyBay.ServerWebApp,Bootybay.ServerCore) -
<ul>
<li><a href="https://bootybay.azurewebsites.net/Home">https://bootybaydemo.azurewebsites.net</a></li>
<li>Admin Website &amp; Web Service host as Windows Azure Webiste</li>
<li>In the demo, it uses Windows Azure SQL Database to store app package information, and Windows Azure Storage Blob to store app package and certification binary files.</li>
<li>It can automatically analyze uploaded appx package to get all necessary metadata, such as app&rsquo;s identity, publisher, icons, auto launch protocol and etc.</li>
<li>Support public store app linking</li>
</ul>
</li>
</ul>
<h4>TODOs:</h4>
<ul>
<li>so far so good. we positioned this project as prototype.</li>
</ul>
<p>&nbsp;</p>
<h4>Code name &lsquo;Booty Bay&rsquo;&nbsp; comes from:</h4>
<p><a href="https://www.wowwiki.com/Booty_Bay">https://www.wowwiki.com/Booty_Bay</a>, which is a great place to store your treasures, right?</p>
<h4>Who we are:</h4>
<ul>
<li>Team blog:&nbsp;<a href="https://aka.ms/lighthouse">https://aka.ms/lighthouse</a></li>
<li>About us:&nbsp;<a href="https://blogs.msdn.com/b/lighthouse/about.aspx">https://blogs.msdn.com/b/lighthouse/about.aspx</a></li>
<li>Contact us: Bloggers for Lighthouse&nbsp;<a href="mailto:bloglighthouse@microsoft.com">bloglighthouse@microsoft.com</a></li>
<li>Both English and Chinese are accepted&nbsp; 各位同仁欢迎使用中文同我们交流。</li>
<li>Core members:</li>
</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@<a href="https://www.codeplex.com/site/users/view/betageek">betageek</a>&nbsp; Ranger Yu;@<a href="https://www.codeplex.com/site/users/view/jazzen">jazzen</a>&nbsp;Jazzen Chen;@<a href="https://www.codeplex.com/site/users/view/wbunle">wbunle</a>&nbsp;Rocco Ren; @<a href="https://www.codeplex.com/site/users/view/qxwang">qxwang</a>&nbsp;Qixiao Wang;</p>
<p>In case you might think some of the nick name here are na&iuml;ve -&nbsp; please help vote a &lsquo;yes&rsquo; on this codeplex bug-like feature -&nbsp;&nbsp;<a href="https://codeplex.codeplex.com/workitem/15666">Add ability for users to change username</a>. Currently it is not allowed to rename the codeplex account.</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Phone 8.1 开发技术概览 （Universal APP）</title>
      <link>https://docs.microsoft.com/archive/blogs/lighthouse/windows-phone-8-1-universal-app</link>
      <pubDate>Wed, 04 Jun 2014 21:11:58 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/lighthouse/2014/06/04/windows-phone-8-1-universal-app/</guid>
      <description><![CDATA[前一阵真的比较懒 WP8.1 已经出来这么长时间了现在才更新BLOG让大家久等了，今天我先为大家介绍下 WP 8.1的开发框架，什么是微软所推崇的 Universal APP，以及我们要开发...]]></description>
      <content:encoded><![CDATA[<p>前一阵真的比较懒 WP8.1 已经出来这么长时间了现在才更新BLOG让大家久等了，今天我先为大家介绍下 WP 8.1的开发框架，什么是微软所推崇的 Universal APP，以及我们要开发 Universal APP的时候要注意哪些内容。</p>  <p>如果是您是一个刚刚接触 WP开发的朋友可以先看下我之前的文章了解一下故事背景：<a href="https://www.cnblogs.com/sonic1abc/archive/2012/12/14/2817725.html" target="_blank">Windows Phone 8 与 windows 8 开发技术概览</a></p>  <p>首先给大家完善一个概念 - 那就是 Windows Phone 8.1 和 Windows Phone 8.0 的区别</p>  <blockquote>   <p>1. WP8.0 的开发架构是基于 silverlight runtime 运行时</p>    <p>2. WP 8.1 的开发架构有两种 silverlight runtime /&#160; Windwos XMAL ( 等同于Windows 8.1 ) 运行时</p> </blockquote>  <p>今后我所说的 Universal APP 是基于 Windows XAML 运行时的 包括以后我会详细介绍 WP8.1 的新 feature 也会基于 Windows XMAL 这套框架下的内容进行主要介绍。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/4722.image_6EE017E7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/4722.image_5F00_6EE017E7.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/1538.image_thumb_651AB06F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/1538.image_5F00_thumb_5F00_651AB06F.png" width="815" height="447" /></a></p>  <p>上面这张图是我们最新的 Windows &amp; Windows Phone 8.1 的开发平台架构图在这里我们可以非常清楚的看到，蓝色部分是 universal 的 其中包括的 WinJS 、C#、VB、C++&#160; 只有 silverlight 是Windows Phone所独有的，所以说如果我们想开发一个 Universal APP 可以基于一个 Windows 8.0 /8.1的开发架构下进行扩展到 WP 8.1 上来，这个过程是非常方便的。</p>  <p>另外之前我也为大家介绍过在WP8.0中如何共享代码，在 8.1 universal app 中我们可以分享更多的代码并且非常的方便， 这个common的内容提升是一个相当大的飞跃（<font style="background-color: #ffff00">从8.0 共享 27% 提升到了 8.1 共享 77%</font>）所以我们在开发的过程中可以非常方面的share代码，并且在VS2013中可以使用universal 的应用模板进行代码分享。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/8883.image_146C25FA.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/8883.image_5F00_146C25FA.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6283.image_thumb_2B2DFE34.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6283.image_5F00_thumb_5F00_2B2DFE34.png" width="815" height="318" /></a></p>  <p>接着我跟大家介绍一下 Windows Store Universal APP 在VS2013中升级 Update 2 安装WP 8.1 的开发环境后，我们会看到 Universal Apps 的模板（<font style="background-color: #ffff00">同样在 WinIS 和 C++ 中都有universal模板</font>）</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0042.image_48A2DFF1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0042.image_5F00_48A2DFF1.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/1067.image_thumb_038A12BB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/1067.image_5F00_thumb_5F00_038A12BB.png" width="713" height="190" /></a></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3554.image_79C4AB42.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3554.image_5F00_79C4AB42.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/8304.image_thumb_055CF933.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/8304.image_5F00_thumb_5F00_055CF933.png" width="296" height="439" /></a></p>  <p>这里是universal APP 的项目结构，在一个SLN里面自动的创建了 WIN8.1 和 WP8.1 的应用project 并且 还有一个 Shared project，做过WP8.0开发的同学肯定注意到了这个Shared project 中有一个 app.xaml 和 app.xaml.cs 文件 这就意味着，<font style="background-color: #ffff00">WP的生命周期和 Win 8.1 一致了</font>,小伙伴们不用在处理墓碑化啦。（Silverlight 架构下还是有墓碑话的），并且我们在Share project 中的文件会<font style="background-color: #ffff00">自动分享</font>到 Win8.1 和 WP8.1中去 并且，在WP8.1 和Win 8.1 中有可以定义<font style="background-color: #ffff00">平台所特有的</font>内容。</p>  <p>并且universal APP 也支持 <font style="background-color: #ffff00">Windows Runtime Components</font></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/1616.image_14936200.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/1616.image_5F00_14936200.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/2337.image_thumb_71D22A42.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/2337.image_5F00_thumb_5F00_71D22A42.png" width="417" height="582" /></a></p>  <p>另外在 Windows xaml 框架下我们可以我们提供了很多基础控件的 universal ，换句话说就是<font style="background-color: #ffff00">相同的控件运行在不同的平台上的效果不样</font>，例如： Hub ，AppBar/CommandBar，Date/Time Pickers and List Pickers，ListView，Multi-select; containers, swipe selection，Flyouts，Media。</p>  <p>当然还有<font style="background-color: #ffff00">完全相同</font>的，可以更容易的 share 代码。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0647.image_37E57807.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0647.image_5F00_37E57807.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6036.image_thumb_0751FA4F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6036.image_5F00_thumb_5F00_0751FA4F.png" width="698" height="298" /></a></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3568.image_76D98953.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3568.image_5F00_76D98953.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3058.image_thumb_3B1C8151.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3058.image_5F00_thumb_5F00_3B1C8151.png" width="726" height="353" /></a></p>  <p>&#160;</p>  <p>这里肯定有朋友想问我 按我以前开发的 8.0 silverlight 应用怎么办？可不可以升级到8.1呢？ 答案当然是肯定的！ <font style="background-color: #ffff00">可以升级到8.1</font>，但是要有一些问题要注意，我也在这里给大家介绍一下。</p>  <p>首先在WP silverlight 8.1 我们可以从 8.0 的应用直接升级上来，非常的方便，这里要注意的是有一些功能目前只有在 silverlight 框架下可以使用， 在 Windows Xaml 中暂时没有的：</p>  <p>也就是说如果你的应用在8.0中使用了一下功能，<font style="background-color: #ffff00">并且你想在8.1中继续使用，那么你一定是用 silverlight 这套框架。</font></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/4478.image_3159AA8A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/4478.image_5F00_3159AA8A.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0285.image_thumb_332A0051.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0285.image_5F00_thumb_5F00_332A0051.png" width="382" height="317" /></a></p>  <p><a href="https://msdn.microsoft.com/en-us/library/windowsphone/develop/dn642084(v=vs.105).aspx" target="_blank">升级注意事项 - Breaking Changes</a></p>  <p>但是这里我有一个特别注意的地方： 如果你的WP silverlight 8.0 应用升级到8.1 用到了一下两个功能那么你就要斟酌一下，更新的方法了。</p>  <p>Background Audio 不在支持，<font style="background-color: #ffff00">在8.1中需要您从写成 background task</font></p>  <p><font style="background-color: #ffffff">Continuous background execution agent 也不再支持, </font><font style="background-color: #ffff00">同样也需要使用 background task 代替</font></p>  <p><font style="background-color: #ffffff">实现方法请参考 <a href="https://www.cnblogs.com/sonic1abc/p/3640753.html" target="_blank">Windows 8.1 应用开发后台任务概述（Windows XAML）</a></font></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/2772.image_1068C894.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/2772.image_5F00_1068C894.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/4382.image_thumb_2B34EEA0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/4382.image_5F00_thumb_5F00_2B34EEA0.png" width="781" height="91" /></a></p>  <p>所以说我们在选择升级或者全新开发一个WP8.1 应用的时候有几种选择。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/4010.image_01C0AD60.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/4010.image_5F00_01C0AD60.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/8407.image_thumb_71483C64.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/8407.image_5F00_thumb_5F00_71483C64.png" width="772" height="288" /></a></p>  <p>&#160;</p>  <p>1. 如果我们只是想做一个WP 8.1 的APP 那么任何一个开发框架都适合。</p>  <p>2. 如果我们已有一个 Windows 应用商店的应用，那么我们选择 Windows Xaml 框架开发可以最大的复用已有代码。</p>  <p>3. 如果我们的应用要使用 锁屏，lense，或者VOIP 这类功能那么我们只能选择 WP silverlight 的开发框架。</p>  <p>4. 如果是一个音乐应用并且要使用后台播放那么，只能使用 8.0的WP silverlight 框架或者 WP 8.1 Windows XAML 框架。</p>  <p>5. 如果是一个现有的 WP Silverlight 项目我们可以选择升级到 Silverlight 8.1 或者 重构到 WP 8.1 Windows XAML 框架。</p>  <p>&#160;</p>  <p>今天我先给大家接招这么多内容，后面我会继续给大家介绍 WP8.1 的新feature 敬请大家期待！</p>  <p>欢迎大家在这里和我沟通交流或者在新浪微博上 <a href="https://www.weibo.com/wangvbo">@王博_Nick</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Windows / Windows Phone 8.1 预留应用名称及应用上传</title>
      <link>https://docs.microsoft.com/archive/blogs/lighthouse/windows-windows-phone-8-1</link>
      <pubDate>Wed, 04 Jun 2014 18:41:24 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/lighthouse/2014/06/04/windows-windows-phone-8-1/</guid>
      <description><![CDATA[最近比较懒好久没有来这里跟大家聊了，WP 8.1 的 preview 发布已经有一阵子了，并且商店支持 8.1 应用也有一段时间了。我就把这篇 8.1 的应用商店预留提交作为 8.1...]]></description>
      <content:encoded><![CDATA[<blockquote>   <p>最近比较懒好久没有来这里跟大家聊了，WP 8.1 的 preview 发布已经有一阵子了，并且商店支持 8.1 应用也有一段时间了。我就把这篇 8.1 的应用商店预留提交作为 8.1 的一个开始吧。</p>    <p>1. 首先登陆 Windows Phone DevCenter <a href="https://dev.windowsphone.com">链接</a>&#160;</p>    <p>点击屏幕左侧的 <font style="background-color: #ffff00">提交应用</font> 按钮 会看到如下页面，和以前的 8.0 商店的步骤一致，我们直接进入应用信息的填写。</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/2465.image_260C6994.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/2465.image_5F00_260C6994.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0218.image_thumb_37132828.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0218.image_5F00_thumb_5F00_37132828.png" width="658" height="600" /></a></p>    <p>WP 8.1 这里和 WP 8.0 有所不同，关键是以前8.0的应用名称是从应用包中读取的，这样会造成 WP 8.0 应用名称重复的情况发生，但是 8.1解决了这个问题并且，8.1的应用商店实现了 universal （通用）的概念，换句话说就是我一个应用名称我们可以在WIN8.1 和 WP8.1 都可以使用。或者说我已有了一个Win8/8.1的应用我可以使用关联功能使用 Win 应用的名称。</p>    <p>这里总结了一下大家可能会遇到的几种场景：</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/8228.image_06823B21.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/8228.image_5F00_06823B21.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0574.image_thumb_2A3DF36C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0574.image_5F00_thumb_5F00_2A3DF36C.png" width="660" height="611" /></a></p>    <p>实际操作中来看我们既可以在这里申请一个新的应用名称也可以和现有8.0/8.1的应用名称进行关联。这个关联非常重要，微软商店目前来说是先到先得的原则，所以你心仪的应用名称有可能被抢注滴，让然微软也有正规渠道来申诉你的应用名称。</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3250.image_22B514B0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3250.image_5F00_22B514B0.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6735.image_thumb_7940D36F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6735.image_5F00_thumb_5F00_7940D36F.png" width="663" height="465" /></a></p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/8360.image_2C9F277D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/8360.image_5F00_2C9F277D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6253.image_thumb_1573ACFF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6253.image_5F00_thumb_5F00_1573ACFF.png" width="667" height="272" /></a></p>    <p>关联以后我们的应用就会在应用商店中显示 universal APP的 logo，这里对于我们的应用体验也是非常有帮助的。</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/7610.image_399B983F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/7610.image_5F00_399B983F.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6403.image_thumb_14A06877.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6403.image_5F00_thumb_5F00_14A06877.png" width="665" height="319" /></a></p>    <p>如果没有Win8应用我们也可以直接在这里保留一个新的应用名称。</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0044.image_1BE45044.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0044.image_5F00_1BE45044.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6685.image_thumb_17019C88.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6685.image_5F00_thumb_5F00_17019C88.png" width="680" height="418" /></a></p>    <p>这里会列出你的应用的一些打包信息（剩下的市场和价格部分和8.0是一致的）</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/7271.image_34767E45.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/7271.image_5F00_34767E45.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/1263.image_thumb_01A677D1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/1263.image_5F00_thumb_5F00_01A677D1.png" width="692" height="400" /></a></p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3022.image_0CD292CC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3022.image_5F00_0CD292CC.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/5444.image_thumb_75A7184D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/5444.image_5F00_thumb_5F00_75A7184D.png" width="685" height="529" /></a></p>    <p>打包一个WP8.1的应用包 这个过程和 Win8 非常相似。鼠标右键我们的项目然后选择 store – create app packages</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3817.image_3DF45E1D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3817.image_5F00_3DF45E1D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0131.image_thumb_7FFACD5E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0131.image_5F00_thumb_5F00_7FFACD5E.png" width="711" height="95" /></a></p>    <p>是否要上传到应用商店选择 YES！随后输入你的开发者账户。</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0045.image_1D6FAF1C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0045.image_5F00_1D6FAF1C.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/5270.image_thumb_06B06793.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/5270.image_5F00_thumb_5F00_06B06793.png" width="536" height="119" /></a></p>    <p>选择刚刚申请（预留的应用名称）</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/7532.image_0F33C6DD.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/7532.image_5F00_0F33C6DD.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0363.image_thumb_25F59F17.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0363.image_5F00_thumb_5F00_25F59F17.png" width="658" height="529" /></a></p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/2047.image_352C07E4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/2047.image_5F00_352C07E4.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/1616.image_thumb_4B81AD29.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/1616.image_5F00_thumb_5F00_4B81AD29.png" width="661" height="538" /></a></p>    <p>路径如下：</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/8255.image_27EAA033.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/8255.image_5F00_27EAA033.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6813.image_thumb_0E18FAB5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6813.image_5F00_thumb_5F00_0E18FAB5.png" width="662" height="212" /></a></p>    <p>选择&#160; .appxupload&#160; 文件</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/1563.image_4B3CB63A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/1563.image_5F00_4B3CB63A.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/7367.image_thumb_6C54D436.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/7367.image_5F00_thumb_5F00_6C54D436.png" width="667" height="159" /></a></p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3835.image_3BC1567E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3835.image_5F00_3BC1567E.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0245.image_thumb_1FB32844.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0245.image_5F00_thumb_5F00_1FB32844.png" width="663" height="647" /></a></p>    <p>剩下的内容就是</p>    <p>商店说明：就是我们在下载应用前看到的应用介绍。</p>    <p>更新描述：用来介绍我们的应用在这个版本更新了那些内容，来吸引用户。</p>    <p>关键词：让用户在商店搜索的时候可以通过你输入的关键字找到我们的应用。</p>    <p>应用标题图像：是显示在应用商店中的图像</p>    <p>促销图像：是我们的应用在上推荐位的时候显示的各种展示图片。</p>    <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0172.image_03A4FA0A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0172.image_5F00_03A4FA0A.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6087.image_thumb_4E9AFB8A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6087.image_5F00_thumb_5F00_4E9AFB8A.png" width="533" height="509" /></a></p>    <p>屏幕截图非常重要，这个图片可以让用户最直接的了解您的应用，并且要和您的应用的支持分辨率进行对应。 这里建议可以在模拟器中截图或者真机截图都可以。</p>    <p><img src="https://images.cnblogs.com/cnblogs_com/sonic1abc/WP8update4.png" width="573" height="374" /></p>    <p>&#160;</p>    <p>我之前还有两篇文章分别介绍&#160; (为大家提供借鉴)</p>    <p><a href="https://www.cnblogs.com/sonic1abc/archive/2012/11/19/2777151.html" target="_blank">在Windows phone store 商店中提交你的 windows phone 8 应用</a>&#160;</p>    <p><a href="https://www.cnblogs.com/sonic1abc/archive/2012/11/17/2775292.html" target="_blank">从 windows phone7 到 windows phone 8 更新 如何设配两个版本</a></p>    <p><a href="https://www.cnblogs.com/sonic1abc/p/3380819.html" target="_blank">如何在Windows应用商店中提交您的Windows 8.1 应用更新</a></p>    <p>整个流程很简单吧，我在这里先给大家做了一个介绍 有windows phone 8应用的朋友们不妨去试试。</p>    <p>欢迎大家在这里和我沟通交流，也可以在新浪微博上 <a href="https://www.weibo.com/wangvbo">@王博_Nick</a></p></blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Can’t Update Visual Studio 2013 Extensions for the Windows Library for JavaScript</title>
      <link>https://docs.microsoft.com/archive/blogs/lighthouse/cant-update-visual-studio-2013-extensions-for-the-windows-library-for-javascript</link>
      <pubDate>Mon, 21 Apr 2014 03:11:37 GMT</pubDate>
      <dc:creator><![CDATA[Jazzen.Chen]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/lighthouse/2014/04/21/cant-update-visual-studio-2013-extensions-for-the-windows-library-for-javascript/</guid>
      <description><![CDATA[WinJS shipped a new update at Apr 3rd, which we could download via...]]></description>
      <content:encoded><![CDATA[<p>WinJS shipped a new update at Apr 3rd, which we could download via <a title="https://www.microsoft.com/en-us/download/details.aspx?id=40793" href="https://www.microsoft.com/en-us/download/details.aspx?id=40793">https://www.microsoft.com/en-us/download/details.aspx?id=40793</a>, also we could see this update notification in Visual Studio. </p>  <p>But the first time I updated this extension, I still get the update notification and can’t see new project templates under JavaScript section as below:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/7658.image_7F5897F3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/7658.image_5F00_7F5897F3.png"><img title="image" style="display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3240.image_thumb_666AA886.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3240.image_5F00_thumb_5F00_666AA886.png" width="388" height="89" /></a> </p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/7875.screenshot_3D86E0E9.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/7875.screenshot_5F00_3D86E0E9.png"><img title="screenshot" style="display: inline;" border="0" alt="screenshot" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3542.screenshot_thumb_015DA5F2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3542.screenshot_5F00_thumb_5F00_015DA5F2.png" width="188" height="244" /></a> </p>  <p>After some search, I finally get the solution from connect.microsoft.com: <a href="https://connect.microsoft.com/VisualStudio/feedback/details/847258/vs2013-keep-saying-windows-library-for-javascript-needs-updating-1-0-9651-40228">VS2013 keep saying Windows Library for Javascript needs updating (1.0.9651.40228)</a>. And I followed IanG’s solution :</p>  <p>1) used the PowerShell MSI tools at <a href="https://psmsi.codeplex.com/">https://psmsi.codeplex.com/</a> and ran this command: </p>  <blockquote>   <p>get-msiproductinfo | where { $_.Name -like '*Windows Library for JavaScript*' } </p>    <p>The result reported two different IDs for the 1.0.9202.20789 version, as well as the 2.1 version: </p>    <p>{D5FEB7A1-5D0F-4CDC-8290-F52DFB53AF23} 1.0.9202.20789&#160;&#160;&#160;&#160; Visual Studio Extensions for Windows Library for JavaScript     <br /> {7CB4CF88-6C28-479F-BBD4-53065ACA4583} 2.1.30324.52&#160;&#160;&#160;&#160;&#160;&#160;&#160; Visual Studio Extensions for Windows Library for JavaScript      <br /> {23F9C27A-E520-4C87-AF99-E5A7D021F24A} 1.0.9202.20789&#160;&#160;&#160;&#160; Visual Studio Extensions for Windows Library for JavaScript </p> </blockquote>  <p>2) Run msiexec commend to remove the duplicated installation:</p>  <blockquote>   <p>msiexec /x {23F9C27A-E520-4C87-AF99-E5A7D021F24A}</p> </blockquote>  <p>For the situation I met, Visual Studio still told me to install the WinJS extension, so I run msiexec again for the 2.1 version, and re-installed the update. Now every goes fine that the update notification is gone and new JavaScript templates show up:)</p>  <p>Hope this could help those who have the same problem.</p>  <p>- Jazzen</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows 8.1 应用开发后台任务概述（Windows XAML）</title>
      <link>https://docs.microsoft.com/archive/blogs/lighthouse/windows-8-1-windows-xaml</link>
      <pubDate>Wed, 02 Apr 2014 00:19:36 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/lighthouse/2014/04/02/windows-8-1-windows-xaml/</guid>
      <description><![CDATA[说到后台任务，这是在和许多 Android 开发者聊天的时候，经常被提起的话题之一， Windows 移动平台的后台任务的形式有别与 Android 的后台 service，简单的说在 Windows...]]></description>
      <content:encoded><![CDATA[<p>说到后台任务，这是在和许多 Android 开发者聊天的时候，经常被提起的话题之一， Windows 移动平台的后台任务的形式有别与 Android 的后台 service，简单的说在 Windows RT 移动平台下只有在满足一定条件的时候才能运行一部分预先设置好的制的代码。并且 Windows 8.1 和 Windows Phone 8.0 对后台任务有些区别，今天我就为大家介绍一下 Windows 8.1 移动平台下的后台任务，以及他们的运行条件。</p>  <p>首先给大家介绍下 Windows 移动平台的应用运行后台的情景分为多种。</p>  <p>今天我只为大家介绍以下基础任务，后台任务响应系统事件 ( 后台任务的运行条件、ServicingComplete&#160; - 应用更新触发器 )、维护触发器、计时器后台任务，这些内容后面我一个一个的给大家介绍。</p>  <p>在此之前我先介绍下使用后台的应用配置。</p>  <p>手动在 Package.appxmanifest 文件中声明支持的后台任务类型</p>  <p>声明在&#160; &lt;Extensions&gt; 节点中</p>  <div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5">   <pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">Application </span><span style="color: #ff0000">Id</span><span style="color: #0000ff">=&quot;BackgroundTaskSample.App&quot;</span><span style="color: #ff0000"> Executable</span><span style="color: #0000ff">=&quot;BackgroundTaskSample.exe&quot;</span><span style="color: #ff0000"> EntryPoint</span><span style="color: #0000ff">=&quot;BackgroundTaskSample.App&quot;</span><span style="color: #0000ff">&gt;</span>
      <span style="color: #0000ff">&lt;</span><span style="color: #800000">VisualElements </span><span style="color: #ff0000">DisplayName</span><span style="color: #0000ff">=&quot;BackgroundTaskSample&quot;</span><span style="color: #ff0000"> Logo</span><span style="color: #0000ff">=&quot;Images\squareTile-sdk.png&quot;</span><span style="color: #ff0000"> SmallLogo</span><span style="color: #0000ff">=&quot;Images\smallTile-sdk.png&quot;</span><span style="color: #ff0000"> Description</span><span style="color: #0000ff">=&quot;BackgroundTaskSample&quot;</span><span style="color: #ff0000"> ForegroundText</span><span style="color: #0000ff">=&quot;dark&quot;</span><span style="color: #ff0000"> BackgroundColor</span><span style="color: #0000ff">=&quot;#222222&quot;</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">LockScreen </span><span style="color: #ff0000">Notification</span><span style="color: #0000ff">=&quot;badgeAndTileText&quot;</span><span style="color: #ff0000"> BadgeLogo</span><span style="color: #0000ff">=&quot;images\badgelogo.png&quot;</span> <span style="color: #0000ff">/&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">DefaultTile </span><span style="color: #ff0000">ShowName</span><span style="color: #0000ff">=&quot;allLogos&quot;</span><span style="color: #ff0000"> WideLogo</span><span style="color: #0000ff">=&quot;images\tile-sdk.png&quot;</span> <span style="color: #0000ff">/&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">SplashScreen </span><span style="color: #ff0000">Image</span><span style="color: #0000ff">=&quot;Images\splash-sdk.png&quot;</span><span style="color: #ff0000"> BackgroundColor</span><span style="color: #0000ff">=&quot;#FFFFFF&quot;</span> <span style="color: #0000ff">/&gt;</span>
      <span style="color: #0000ff">&lt;/</span><span style="color: #800000">VisualElements</span><span style="color: #0000ff">&gt;</span>

      <span style="color: #0000ff">&lt;</span><span style="color: #800000">Extensions</span><span style="color: #0000ff">&gt;</span>

          <span style="color: #008000">&lt;!--</span><span style="color: #008000"> TODO: Add elements here </span><span style="color: #008000">--&gt;</span>

      <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Extensions</span><span style="color: #0000ff">&gt;</span>

    <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Application</span><span style="color: #0000ff">&gt;</span></pre>
</div>

<p>例如：</p>

<div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5">
  <pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">Extension </span><span style="color: #ff0000">Category</span><span style="color: #0000ff">=&quot;windows.backgroundTasks&quot;</span><span style="color: #ff0000"> EntryPoint</span><span style="color: #0000ff">=&quot;Tasks.BackgroundTaskClass&quot;</span><span style="color: #0000ff">&gt;</span>
         <span style="color: #0000ff">&lt;</span><span style="color: #800000">BackgroundTasks</span><span style="color: #0000ff">&gt;</span>
           <span style="color: #0000ff">&lt;</span><span style="color: #800000">Task </span><span style="color: #ff0000">Type</span><span style="color: #0000ff">=&quot;systemEvent&quot;</span> <span style="color: #0000ff">/&gt;</span>
           <span style="color: #0000ff">&lt;</span><span style="color: #800000">Task </span><span style="color: #ff0000">Type</span><span style="color: #0000ff">=&quot;pushNotification&quot;</span> <span style="color: #0000ff">/&gt;</span>
         <span style="color: #0000ff">&lt;/</span><span style="color: #800000">BackgroundTasks</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Extension</span><span style="color: #0000ff">&gt;</span></pre>
</div>

<p>或者直接在 图形化界面中鼠标勾选 注意：这里要手动输入一个：Entry Point 这个字段很重要，这个字段要和后面 BackgroundTaskBuilder.TaskEntryPoint 注册任务时传入的参数一致（为了声明后台代理的权限以及要运行代理逻辑的命名空间）</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/8816.image_1F662EE2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/8816.image_5F00_1F662EE2.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/3034.image_thumb_24C2F66B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/3034.image_5F00_thumb_5F00_24C2F66B.png" width="760" height="382" /></a></p>

<p>对于后台任务代码实现部分简单的说分为<span style="background-color: #ffff00">两个部分</span>：</p>

<p>&#160;<span style="background-color: #ffff00">第一部分：</span>运行的逻辑体本身（业务逻辑部分）你需要创建一个后台任务类（具体步骤借用MSDN原话）</p>

<p>你可以通过编写用于实现 <a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.ibackgroundtask.aspx"><strong>IBackgroundTask</strong></a> 接口的类来在后台运行代码。在使用诸如 <a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.systemtriggertype.aspx"><strong>SystemTrigger</strong></a> 或 <a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.maintenancetrigger.aspx"><strong>MaintenanceTrigger</strong></a> 等触发器触发特定事件时，将运行该代码。</p>

<p>以下步骤介绍如何编写实现 <a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.ibackgroundtask.aspx"><strong>IBackgroundTask</strong></a> 接口的一个新类。开始之前，在解决方案中为后台任务创建一个新项目。为后台任务添加一个新的空类，并导入<a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.aspx">Windows.ApplicationModel.Background</a> 命名空间。</p>

<ul>
  <li>为后台任务创建一个新项目并将其添加到你的解决方案。为此，请右键单击你的解决方案并选择“添加”-&gt;“新建项目”。然后选择 Windows 运行时组件项目类型，命名项目，并单击“确定”。 </li>

  <li>从 Windows 应用商店应用引用后台任务项目。首先，右键单击你的 Windows 应用商店应用项目并选择“属性，然后转到“常见属性”并单击“添加新参考”，选中后台任务项目旁边的复选框，然后单击两个对话框中的“确定”。 </li>

  <li>
    <p>创建一个实现 <a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.ibackgroundtask.aspx"><strong>IBackgroundTask</strong></a> 接口的新类。<a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.ibackgroundtask.run.aspx"><strong>Run</strong></a> 方法是在触发指定的事件时必须调用的输入点；每个后台任务中都需要该方法。</p>

    <p><strong>注意</strong>&#160; 后台任务类本身（以及后台任务项目中的所有其他类）必须是属于 <strong>sealed</strong>的 <strong>public</strong> 类。</p>
  </li>
</ul>

<div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5">
  <pre><span style="color: #008000">//</span>
<span style="color: #008000">//</span><span style="color: #008000"> ExampleBackgroundTask.cs
</span><span style="color: #008000">//
</span>
<span style="color: #0000ff">using</span><span style="color: #000000"> Windows.ApplicationModel.Background;

</span><span style="color: #0000ff">namespace</span><span style="color: #000000"> Tasks
{
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">sealed</span> <span style="color: #0000ff">class</span><span style="color: #000000"> ExampleBackgroundTask : IBackgroundTask
    {
        </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> Run(IBackgroundTaskInstance taskInstance)
        {
                BackgroundTaskDeferral _deferral </span>=<span style="color: #000000"> taskInstance.GetDeferral();
    
                </span><span style="color: #008000">//</span>
                <span style="color: #008000">//</span><span style="color: #008000"> TODO: Insert code to start one or more asynchronous methods using the
                </span><span style="color: #008000">//</span><span style="color: #008000">       await keyword, for example:
                </span><span style="color: #008000">//</span>
                <span style="color: #008000">//</span><span style="color: #008000"> await ExampleMethodAsync();
                </span><span style="color: #008000">//
</span><span style="color: #000000">    
                _deferral.Complete();
        }        
    }
}</span></pre>
</div>

<p><span style="background-color: #ffff00">第二部分：</span>在应用程序中注册后台的代理 （在注册后台代理的时候可以 选择后台<span style="background-color: #ffff00">代理的类型以及代理的运行条件</span>）</p>

<p>步骤 1: 定义方法签名并返回类型</p>

<p>此方法包含任务入口点、任务名称、预构建的后台任务触发器以及后台任务的<a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.systemcondition.aspx"><strong>SystemCondition</strong></a>（可选）。此方法返回 <a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.backgroundtaskregistration.aspx"><strong>BackgroundTaskRegistration</strong></a> 对象。</p>

<p>下面是捕获系统事件的情况下激发后台任务，这里叫做 SystemTrigger</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/2437.image_2BF013BB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/2437.image_5F00_2BF013BB.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/8182.image_thumb_0A12920F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/8182.image_5F00_thumb_5F00_0A12920F.png" width="799" height="378" /></a></p>

<p>实际 8.1 SDK 中枚举选项会多一些。</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/1538.image_3F2D0217.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/1538.image_5F00_3F2D0217.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/8168.image_thumb_16E16DD7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/8168.image_5F00_thumb_5F00_16E16DD7.png" width="463" height="419" /></a></p>

<p>为了我们后台代理执行的有效性 例如：只有在机器联网的情况下执行后台代理，windows移动平台的后台代理 为我们提供了 后台任务的执行条件选择的机会。<span style="background-color: #ffff00">由 SystemConditionType 枚举表示，在Win8.1 SDK 中实际会比截图中的选项更多一些</span></p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0513.image_6D038A52.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0513.image_5F00_6D038A52.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/1651.image_thumb_633E22DA.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/1651.image_5F00_thumb_5F00_633E22DA.png" width="797" height="416" /></a></p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0676.image_508BB9D4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0676.image_5F00_508BB9D4.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/4263.image_thumb_0453B026.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/4263.image_5F00_thumb_5F00_0453B026.png" width="418" height="314" /></a></p>

<p>这里有一个注册后台代理的代码给大家参考下（可以直接使用。 注：这里的 condition 其实是支持添加多个的）</p>

<div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5">
  <pre><span style="color: #008000">//</span>
<span style="color: #008000">//</span><span style="color: #008000"> Register a background task with the specified taskEntryPoint, name, trigger,
</span><span style="color: #008000">//</span><span style="color: #008000"> and condition (optional).
</span><span style="color: #008000">//</span>
<span style="color: #008000">//</span><span style="color: #008000"> taskEntryPoint: Task entry point for the background task.
</span><span style="color: #008000">//</span><span style="color: #008000"> taskName: A name for the background task.
</span><span style="color: #008000">//</span><span style="color: #008000"> trigger: The trigger for the background task.
</span><span style="color: #008000">//</span><span style="color: #008000"> condition: Optional parameter. A conditional event that must be true for the task to fire.
</span><span style="color: #008000">//
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> BackgroundTaskRegistration RegisterBackgroundTask(<span style="color: #0000ff">string</span><span style="color: #000000"> taskEntryPoint,
                                                                </span><span style="color: #0000ff">string</span><span style="color: #000000"> taskName,
                                                                IBackgroundTrigger trigger,
                                                                IBackgroundCondition condition)
{
    </span><span style="color: #008000">//</span>
    <span style="color: #008000">//</span><span style="color: #008000"> Check for existing registrations of this background task.
    </span><span style="color: #008000">//
</span>
    <span style="color: #0000ff">foreach</span> (<span style="color: #0000ff">var</span> cur <span style="color: #0000ff">in</span><span style="color: #000000"> BackgroundTaskRegistration.AllTasks)
    {

        </span><span style="color: #0000ff">if</span> (cur.Value.Name ==<span style="color: #000000"> taskName)
        {
            </span><span style="color: #008000">//</span> 
            <span style="color: #008000">//</span><span style="color: #008000"> The task is already registered.
            </span><span style="color: #008000">//</span> 

            <span style="color: #0000ff">return</span><span style="color: #000000"> (BackgroundTaskRegistration)(cur.Value);
        }
    }


    </span><span style="color: #008000">//</span>
    <span style="color: #008000">//</span><span style="color: #008000"> Register the background task.
    </span><span style="color: #008000">//
</span>
    <span style="color: #0000ff">var</span> builder = <span style="color: #0000ff">new</span><span style="color: #000000"> BackgroundTaskBuilder();

    builder.Name </span>=<span style="color: #000000"> taskName;
    builder.TaskEntryPoint </span>=<span style="color: #000000"> taskEntryPoint;
    builder.SetTrigger(trigger);

    </span><span style="color: #0000ff">if</span> (condition != <span style="color: #0000ff">null</span><span style="color: #000000">)
    {

        builder.AddCondition(condition);
    }

    BackgroundTaskRegistration task </span>=<span style="color: #000000"> builder.Register();

    </span><span style="color: #0000ff">return</span><span style="color: #000000"> task;
}</span></pre>
</div>

<p><span style="background-color: #ffff00">ServicingComplete 触发器</span></p>

<p>写ServicingComplete 触发器的方法体的方法上面事件触发器的形式是一致的。这个触发器的作用顾名思义 就是当应用更新完成以后激发。</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/8738.image_7F738D1A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/8738.image_5F00_7F738D1A.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0602.image_thumb_6128D624.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0602.image_5F00_thumb_5F00_6128D624.png" width="789" height="158" /></a></p>

<p>&#160;</p>

<p>除了SystemTrigger 还有 <span style="background-color: #ffff00">MaintenanceTrigger</span> 维护触发器</p>

<p>使用维护触发器每 15 分钟运行一次任务。维护任务仅在设备插入交流电源时运行，而无需位于锁屏上。这里我还是引用一下 MSDN</p>

<p>创建新的 <a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.timetrigger.aspx"><strong>MaintenanceTrigger</strong></a> 对象。第二个参数 <em>OneShot</em> 指定维护任务是运行一次还是继续定期运行。如果 <em>OneShot</em> 被设置为 true，则第一个参数 (<em>FreshnessTime</em>) 会指定在计划后台任务之前需等待的分钟数。如果 <em>OneShot</em> 被设置为 false，则 <em>FreshnessTime</em> 会指定后台任务的运行频率。</p>

<p><strong>注意</strong>&#160; 如果 <em>FreshnessTime</em> 设置为少于 15 分钟，则在尝试注册后台任务时将引发异常。</p>

<div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5">
  <pre><span style="color: #0000ff">int</span> waitIntervalMinutes = <span style="color: #800080">60</span><span style="color: #000000">;
MaintenanceTrigger taskTrigger </span>= <span style="color: #0000ff">new</span> MaintenanceTrigger(waitIntervalMinutes, <span style="color: #0000ff">false</span><span style="color: #000000">);
SystemCondition exampleCondition </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> SystemCondition(SystemConditionType.InternetAvailable);
</span><span style="color: #0000ff">string</span> entryPoint = <span style="color: #800000">&quot;</span><span style="color: #800000">Tasks.ExampleBackgroundTaskClass</span><span style="color: #800000">&quot;</span><span style="color: #000000">;
</span><span style="color: #0000ff">string</span> taskName   = <span style="color: #800000">&quot;</span><span style="color: #800000">Maintenance background task example</span><span style="color: #800000">&quot;</span><span style="color: #000000">;
BackgroundTaskRegistration task </span>= RegisterBackgroundTask(entryPoint, taskName, taskTrigger, exampleCondition);</pre>
</div>

<p><span style="background-color: #ffff00">计时器后台任务</span> 创建方式还是与SystemTrigger十分相似。</p>

<p>创建时间触发器</p>

<ul>
  <li>
    <p>创建新的 <a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.applicationmodel.background.timetrigger.aspx"><strong>TimeTrigger</strong></a>。第二个参数 <em>OneShot</em> 指定后台任务是运行一次还是保持周期性运行。如果 <em>OneShot</em> 被设置为 true，则第一个参数 (<em>FreshnessTime</em>) 会指定在计划后台任务之前需等待的分钟数。如果 <em>OneShot</em> 被设置为 false，则<em>FreshnessTime</em> 会指定后台任务的运行频率。</p>

    <p>Windows 8 具有以 15 分钟间隔运行后台任务的内置计时器。</p>
  </li>

  <li>
    <p>如果 <em>FreshnessTime</em> 设置为 15 分钟并且 <em>OneShot</em> 为 true，则任务将从其注册之时起 0 至 <span style="background-color: #ffff00">15 分钟内</span>运行一次该任务。</p>
  </li>

  <li>
    <p>如果 <em>FreshnessTime</em> 设置为 15 分钟并且 <em>OneShot</em> 为 false，则任务将从其注册之时起 0 至 <span style="background-color: #ffff00">15 分钟内每</span><span style="background-color: #ffff00">隔 15 分钟</span>运行一次该任务。</p>
  </li>

  <li>
    <p><strong>注意</strong>&#160; 如果 <em>FreshnessTime</em> 设置为少于 15 分钟，则在尝试注册后台任务时将引发异常。</p>
  </li>
</ul>

<div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5">
  <pre>TimeTrigger hourlyTrigger = <span style="color: #0000ff">new</span> TimeTrigger(<span style="color: #800080">60</span>, <span style="color: #0000ff">false</span><span style="color: #000000">);

SystemCondition userCondition </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> SystemCondition(SystemConditionType.UserPresent);

BackgroundExecutionManager.RequestAccessAsync();

</span><span style="color: #0000ff">string</span> entryPoint =<span style="color: #000000"> “Tasks.ExampleBackgroundTaskClass”;
</span><span style="color: #0000ff">string</span> taskName   =<span style="color: #000000"> “Example hourly background task”;

BackgroundTaskRegistration task </span>= RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);</pre>
</div>

<p>&#160;</p>

<p>其他触发器参考（这里要注意的是<span style="background-color: #ffff00">使用限额</span>）：</p>

<p>&#160;</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0268.image_20891A66.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0268.image_5F00_20891A66.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/2146.image_thumb_614D8179.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/2146.image_5F00_thumb_5F00_614D8179.png" width="750" height="779" /></a></p>

<p>&#160;</p>

<p>或者你的应用对后台实时性要求非常高 可以考虑下 ：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0028.image_3E22A778.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0028.image_5F00_3E22A778.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/5125.image_thumb_2933B5B6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/5125.image_5F00_thumb_5F00_2933B5B6.png" width="762" height="168" /></a></p>

<p>MSDN 说的非常拗口，我把它翻译成人话说说，</p>

<p>PushNotificationTrigger 实际上就是在应用受到推送的时候才执行的后台代理，用来扩展推送对应用自身功能。</p>

<p>ControlChannelTrigger&#160; 是针对与一些应用无法使用 WNS 推送服务的一种解决方案，或者有关于隐私或消息服务级别协议 (SLA) 的问题时，通常需要此类。</p>

<p>详情参考： <a title="https://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj662741.aspx" href="https://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj662741.aspx">https://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj662741.aspx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>How to Use Custom Font in Windows Phone 8 Application</title>
      <link>https://docs.microsoft.com/archive/blogs/lighthouse/how-to-use-custom-font-in-windows-phone-8-application</link>
      <pubDate>Fri, 14 Mar 2014 10:08:00 GMT</pubDate>
      <dc:creator><![CDATA[Jazzen.Chen]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/lighthouse/2014/03/14/how-to-use-custom-font-in-windows-phone-8-application/</guid>
      <description><![CDATA[When building a Windows Phone app, it’s quite common that we’d like to change the font style of a...]]></description>
      <content:encoded><![CDATA[<p>When building a Windows Phone app, it’s quite common that we’d like to change the font style of a TextBlock, TextBox and etc. By default, Windows Phone 8 supports fonts for the majority of the writing systems of the world, there are many font families nested in Windows Phone OS, we could take a reference at <a href="https://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202920(v=vs.105).aspx">Font and language configuration support for Windows Phone</a>. </p>  <p>However, we might still want to use our custom font family for our applications, either in XAML or HTML, to make our applications more pleasing and beautiful. Also, our applications could be more user-friendly if user could decide which font to be downloaded and used. I will introduce how to use custom fonts in Windows Phone 8 Applications to:</p>  <p>1) Change font family at runtime for a XAML control by C#</p>  <p>2) Display a local HTML page for Web Browser control</p>  <p></p>  <h3>Change font family at runtime</h3>  <p>Introduced as MSDN library, <a href="https://msdn.microsoft.com/en-us/library/windowsphone/develop/cc189010(v=vs.105).aspx">Text and fonts for Windows Phone</a>, Windows Phone support TTF file and stream-based zip file, </p>  <p><i>“The font that you specify may not necessarily be the font that Windows Phone uses. Windows Phone chooses the font from the supported local fonts, from the fonts provided in a packaged file referenced in the <b>FontFamily</b> property, or from the stream-based zip or .ttf file passed to the <b>FontSource </b>property. “</i></p>  <p>If located in application package, there are 2 options to use custom font files, FontFamily property and FontSource property. Below is a sample for FontFamily property, FontSource will be introduced later:</p>  <div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: rgb(244, 244, 244);">   <div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">     <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: rgb(96, 96, 96);">   1:</span> text.FontFamily = <span style="color: rgb(0, 0, 255);">new</span> FontFamily(<span style="color: rgb(0, 96, 128);">@&quot;\Assets\Fonts\ALGER.TTF#Algerian&quot;</span>);</pre>
<!--CRLF--></div>
</div>

<p><a href="https://msdn.microsoft.com/en-us/library/windowsphone/develop/ms602323(v=vs.105).aspx">FontFamily</a> constructor requires a family name string, and it should be at the format of: <b>Path\[File Name]#[Font Name]</b>. Font name could be find in the first line of a TTF file.&#160; And one most import step before run the application is, we must set the <b>Build Action</b> property of a TTF file to <b>Content:</b></p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6708.image_33C3C126.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6708.image_5F00_33C3C126.png"><img title="image" style="display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/7713.image_thumb_27C1D0F2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/7713.image_5F00_thumb_5F00_27C1D0F2.png" width="244" height="170" /></a> </p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/0572.image_4536B2AF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/0572.image_5F00_4536B2AF.png"><img title="image" style="display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6523.image_thumb_594FCF38.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6523.image_5F00_thumb_5F00_594FCF38.png" width="427" height="116" /></a> </p>

<p>Another situation is, we might want the TTF files to be downloaded by users instead of published within the package. But after font files to be downloaded to app’s isolated storage, we would need to read the font file to stream and pass it to FontSource. FontFamily does not work for local stored font files. See code below:</p>

<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: rgb(244, 244, 244);">
  <div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">
    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: rgb(96, 96, 96);">   1:</span> <span style="color: rgb(0, 0, 255);">using</span> (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())</pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span id="lnum2" style="color: rgb(96, 96, 96);">   2:</span> {</pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum3" style="color: rgb(96, 96, 96);">   3:</span>     IsolatedStorageFileStream stream = <span style="color: rgb(0, 0, 255);">new</span> IsolatedStorageFileStream(filename, System.IO.FileMode.Open, storage);</pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span id="lnum4" style="color: rgb(96, 96, 96);">   4:</span>&#160; </pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum5" style="color: rgb(96, 96, 96);">   5:</span>     text.FontSource = <span style="color: rgb(0, 0, 255);">new</span> System.Windows.Documents.FontSource(stream);</pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span id="lnum6" style="color: rgb(96, 96, 96);">   6:</span>     text.FontFamily = <span style="color: rgb(0, 0, 255);">new</span> FontFamily(fontname);</pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum7" style="color: rgb(96, 96, 96);">   7:</span> }</pre>
<!--CRLF--></div>
</div>

<p>Filename here shall be the full path name in isolated storage. </p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6505.wp_ss_20140315_00011_647BEA33.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6505.wp_5F00_ss_5F00_20140315_5F00_00011_5F00_647BEA33.png"><img title="wp_ss_20140315_0001[1]" style="display: inline;" border="0" alt="wp_ss_20140315_0001[1]" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/1273.wp_ss_20140315_00011_thumb_1E8D47C4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/1273.wp_5F00_ss_5F00_20140315_5F00_00011_5F00_thumb_5F00_1E8D47C4.png" width="292" height="484" /></a> </p>

<p></p>

<h3>Use local custom font in WebBrowser Control</h3>

<p>If we want to use local custom fonts in WebBrowser control, it turns out to be much more complicated than XAML. Refering to an online TTF file works fine, on the contrary for local files.</p>

<p>I used to believe that it is impossible for Windows Phone application to use a local custom font in WebBrowser, until I read this StackOverflow post: <a href="https://stackoverflow.com/questions/14558331/getting-a-web-font-to-work-on-an-html5-windows-phone-app/20573678#20573678">Getting a web-font to work on an HTML5 Windows Phone App?</a> Solution provided by <a href="https://github.com/thomasforth">Thomas Forth</a> based on if the conditions listed below are matched, </p>

<p>1. Windows Phone 8 device should be&#160; GDR2 or greater</p>

<p>2. Font file’s Build Action property must be Content</p>

<p>3. Font file’s embeddable flag must be set to 0</p>

<p>For more detail about embeddable flag, <a href="https://en.wikipedia.org/wiki/TrueType#Embedding_protection">Wikipedia has a good explanation</a>, as mentioned by Tomas Forth, there is an open-source <a href="https://ttfedit.sourceforge.net/">TTFEdit</a> could be used to change embeddable flag: View&gt;Show&gt;Advanced&gt;Legal rights for embedding. But keep in mind that, such change has potential copyright issues.</p>

<p>There is also a good sample created by <a href="https://github.com/gabrielmaldi">Gabriel</a>, that built a project using <a href="https://fontawesome.io/">Font Awesome</a>: <a href="https://github.com/gabrielmaldi/windows-phone-8-local-font-face">A barebones example of using CSS3 @font-face with embedded fonts in Windows Phone 8</a>.</p>

<p>After the most difficult part is solved, it becomes quite easy to browser local HTML with local custom font, see sample below:</p>

<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: rgb(244, 244, 244);">
  <div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">
    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: rgb(96, 96, 96);">   1:</span> @<span style="color: rgb(0, 0, 255);">font</span>-face {</pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span id="lnum2" style="color: rgb(96, 96, 96);">   2:</span>     <span style="color: rgb(0, 0, 255);">font-family</span>: <span style="color: rgb(0, 96, 128);">'ALGER';</span></pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum3" style="color: rgb(96, 96, 96);">   3:</span>     src: url('ALGER<span style="color: rgb(204, 102, 51);">.ttf</span>') format('truetype'), url('Fonts/ALGER<span style="color: rgb(204, 102, 51);">.ttf</span>') format('truetype');</pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span id="lnum4" style="color: rgb(96, 96, 96);">   4:</span> }</pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum5" style="color: rgb(96, 96, 96);">   5:</span>&#160; </pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span id="lnum6" style="color: rgb(96, 96, 96);">   6:</span> <span style="color: rgb(0, 0, 255);">p</span> {</pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum7" style="color: rgb(96, 96, 96);">   7:</span>     <span style="color: rgb(0, 0, 255);">font-family</span>: <span style="color: rgb(0, 96, 128);">'ALGER';</span></pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span id="lnum8" style="color: rgb(96, 96, 96);">   8:</span>     <span style="color: rgb(0, 0, 255);">font-size</span>: <span style="color: rgb(0, 96, 128);">18px;</span></pre>
<!--CRLF-->

    <pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum9" style="color: rgb(96, 96, 96);">   9:</span> }</pre>
<!--CRLF--></div>
</div>

<p>Such CSS works for the HTML and font files located in either application package or isolated storage.</p>

<p>Last but not least, the local HTML file must have the HTML doctype declaration, as @font-face is only support in CSS2 or CSS3, no mather whether the declaration is HTML 4.01 or HTML 5, we just have to use one. </p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/6428.wp_ss_20140315_00021_0BDADEBE.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/6428.wp_5F00_ss_5F00_20140315_5F00_00021_5F00_0BDADEBE.png"><img title="wp_ss_20140315_0002[1]" style="display: inline;" border="0" alt="wp_ss_20140315_0002[1]" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/38/metablogapi/5228.wp_ss_20140315_00021_thumb_246D0CBF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-38-metablogapi/5228.wp_5F00_ss_5F00_20140315_5F00_00021_5F00_thumb_5F00_246D0CBF.png" width="292" height="484" /></a> </p>

<p></p>

<p>- Jazzen</p>]]></content:encoded>
    </item>
  </channel>
</rss>