<?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>Express for UAP and Win10 Dev</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/express_for_uap_and_win10_dev/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/express_for_uap_and_win10_dev/feed.xml</link>
    <description />
    <lastBuildDate>Wed, 17 Apr 2019 04:14:15 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>发布适用于iOS的Windows bridge</title>
      <link>https://docs.microsoft.com/archive/blogs/express_for_uap_and_win10_dev/ioswindows-bridge</link>
      <pubDate>Sun, 16 Aug 2015 19:19:33 GMT</pubDate>
      <dc:creator><![CDATA[yanwei0429@gmail.com]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/express_for_uap_and_win10_dev/2015/08/16/ioswindows-bridge/</guid>
      <description><![CDATA[7月29日，微软在全球超过190个国家和地区发布了Windows 10，并提供免费升级，向着Windows通用平台和10亿Windows...]]></description>
      <content:encoded><![CDATA[<p><span style="font-family: Calibri; font-size: small;">7</span><span style="font-size: small;">月</span><span style="font-family: Calibri; font-size: small;">29</span><span style="font-size: small;">日，微软在全球超过</span><span style="font-family: Calibri; font-size: small;">190</span><span style="font-size: small;">个国家和地区发布了</span><a href="https://blogs.windows.com/bloggingwindows/2015/07/28/windows-10-free-upgrade-available-in-190-countries-today/"><span style="color: #0563c1; font-family: Calibri; font-size: small;">Windows 10</span><span style="color: #0563c1; font-size: small;">，并提供免费升级</span></a><span style="font-size: small;">，向着</span><span style="font-family: Calibri; font-size: small;">Windows</span><span style="font-size: small;">通用平台和</span><span style="font-family: Calibri; font-size: small;">10</span><span style="font-size: small;">亿</span><span style="font-family: Calibri; font-size: small;">Windows 10</span><span style="font-size: small;">升级用户的目标又迈进了一大步。与此同时，微软也发布了</span><span style="font-family: Calibri; font-size: small;">Windows SDK</span><span style="font-size: small;">和附带的工具，用来支持开发者创建和提交</span><span style="font-family: Calibri; font-size: small;">Windows</span><span style="font-size: small;">通用应用。</span><span style="font-family: Calibri; font-size: small;">Windows 10 </span><span style="font-size: small;">提供了新的</span><span style="font-family: Calibri; font-size: small;">API</span><span style="font-size: small;">，并且在自适应用户体验、自然人机交互以及云服务等方面做了大量工作，使应用更加个性化。微软也提供了一系列的</span><span style="font-family: Calibri; font-size: small;">&rdquo;bridging&rdquo;</span><span style="font-size: small;">技术，使开发者可以将他们已经开发的</span><span style="font-family: Calibri; font-size: small;">iOS</span><span style="font-size: small;">应用，安卓应用，</span><span style="font-family: Calibri; font-size: small;">Web</span><span style="font-size: small;">应用以及桌面应用的代码和现有的开发技术在</span><span style="font-family: Calibri; font-size: small;">Windows</span><span style="font-size: small;">平台上利用起来。</span></p>
<p><span style="font-size: small;">微软先发布一个适用于</span><span style="font-family: Calibri; font-size: small;">iOS</span><span style="font-size: small;">的</span><span style="font-family: Calibri; font-size: small;">Windows bridge</span><span style="font-size: small;">的早期版本（以前称为</span><span style="font-family: Calibri; font-size: small;">Project Islandwood</span><span style="font-size: small;">）。</span><span style="font-size: small;">最终版本将在这个秋天发布，届时将允许</span><span style="font-family: Calibri; font-size: small;">bridge</span><span style="font-size: small;">技术使用</span><span style="font-family: Calibri; font-size: small;">VS2015</span><span style="font-size: small;">更新后新的开发功能。现在当前版本的</span><span style="font-family: Calibri; font-size: small;">bridge</span><span style="font-size: small;">已经加入开源社区，供大家使用。在正式版本发布之前，微软希望得到更多开发者对于代码的关注，期待更多的反馈和参与，来帮助微软更好地开发</span><span style="font-family: Calibri; font-size: small;">bridge</span><span style="font-size: small;">技术。</span></p>
<p><span style="font-size: small;">微软基于</span><span style="font-family: Calibri; font-size: small;">MIT</span><span style="font-size: small;">许可将开源项目</span><span style="font-family: Calibri; font-size: small;">iOS bridge</span><span style="font-size: small;">发布出来。为了更加方便</span><span style="font-family: Calibri; font-size: small;">iOS</span><span style="font-size: small;">开发者在</span><span style="font-family: Calibri; font-size: small;">Windows</span><span style="font-size: small;">平台上开发和运行应用，开发者需要注意的很重要的一点就是微软目前发布的工具的开发仍在进行中，</span><span style="font-family: Calibri; font-size: small;">Build</span><span style="font-size: small;">大会上提出的一些功能点还没有成熟或者刚刚在初始阶段。</span><span style="font-size: small;">微软期待更多开发者对于</span><span style="font-family: Calibri; font-size: small;">bridge</span><span style="font-size: small;">的兴趣和关注，对比微软正在开发的工作和开发者的应用需求。微软真诚期待各位开发者的帮助，包括源代码、测试、</span><span style="font-family: Calibri; font-size: small;">bug</span><span style="font-size: small;">报告以及评论。微软欢迎任何形式的参与，共建</span><span style="font-family: Calibri; font-size: small;">Windows </span><span style="font-family: Calibri; font-size: small;">&nbsp;</span><span style="font-family: Calibri; font-size: small;">bridge</span><span style="font-size: small;">。</span></p>
<p><span style="font-family: Calibri; font-size: small;">Salmaan Ahmed </span><span style="font-size: small;">发表了一篇</span><a href="https://blogs.windows.com/buildingapps/2015/08/06/windows-bridge-for-ios-lets-open-this-up/"><span style="color: #0563c1; font-size: small;">深入分析适用于</span><span style="color: #0563c1; font-family: Calibri; font-size: small;">iOS</span><span style="color: #0563c1; font-size: small;">的</span><span style="color: #0563c1; font-family: Calibri; font-size: small;">Windows bridge</span><span style="color: #0563c1; font-size: small;">的文章</span></a><span style="font-size: small;">，他讨论了编译、运行时间、</span><span style="font-family: Calibri; font-size: small;">IDE</span><span style="font-size: small;">集成以及</span><span style="font-family: Calibri; font-size: small;">Windows bridge</span><span style="font-size: small;">的本质。</span><span style="font-size: small;">更好的是，</span><span style="text-decoration: underline;"><span style="color: #0563c1; font-size: small;">适用于</span></span><a href="https://github.com/Microsoft/WinObjC/"><span style="color: #0563c1; font-family: Calibri; font-size: small;">iOS</span><span style="color: #0563c1; font-size: small;">的</span><span style="color: #0563c1; font-family: Calibri; font-size: small;">Windows bridge</span><span style="color: #0563c1; font-size: small;">的源代码</span></a><span style="font-size: small;">已经放在</span><span style="font-family: Calibri; font-size: small;">GitHub</span><span style="font-size: small;">上面供开发者使用。适用于</span><span style="font-family: Calibri; font-size: small;">iOS</span><span style="font-size: small;">的</span><span style="font-family: Calibri; font-size: small;">Windows bridge</span><span style="font-size: small;">支持</span><span style="font-family: Calibri; font-size: small;">x86</span><span style="font-size: small;">和</span><span style="font-family: Calibri; font-size: small;">x64</span><span style="font-size: small;">处理器下的</span><span style="font-family: Calibri; font-size: small;">Windows 8.1</span><span style="font-size: small;">和</span><span style="font-family: Calibri; font-size: small;">Windows 10</span><span style="font-size: small;">应用。在不久的将来，还会增加编译器优化和对</span><span style="font-family: Calibri; font-size: small;">ARM</span><span style="font-size: small;">的支持，以用来增加移动设备的支持。</span></p>
<p><span style="font-size: small;">下面也有一些在</span><span style="font-family: Calibri; font-size: small;">Build</span><span style="font-size: small;">大会上报告的其他</span><span style="font-family: Calibri; font-size: small;">bridge</span><span style="font-size: small;">的更新。</span><span style="font-size: small;">适用于</span><span style="font-family: Calibri; font-size: small;">Web</span><span style="font-size: small;">应用的</span><span style="font-family: Calibri; font-size: small;">Windows bridge</span><span style="font-size: small;">，即</span><span style="font-family: Calibri; font-size: small;">Project Westminster</span><span style="font-size: small;">，</span><span style="font-size: small;">随着</span><span style="font-family: Calibri; font-size: small;">Windows 10 </span><span style="font-size: small;">和</span><span style="font-family: Calibri; font-size: small;"> VS2015</span><span style="font-size: small;">一同发布，供开发者使用。</span><span style="font-family: Calibri; font-size: small;">Kiril Seksenov </span><span style="font-size: small;">最近的一篇博客是</span><a href="https://blogs.windows.com/buildingapps/2015/07/06/project-westminster-in-a-nutshell/"><span style="color: #0563c1; font-size: small;">关于适用于</span><span style="color: #0563c1; font-family: Calibri; font-size: small;">Web</span><span style="color: #0563c1; font-size: small;">应用的</span><span style="color: #0563c1; font-family: Calibri; font-size: small;">Windows bridge</span></a><span style="font-size: small;">。文中详细介绍了适用于</span><span style="font-family: Calibri; font-size: small;">Web</span><span style="font-size: small;">应用的</span><span style="font-family: Calibri; font-size: small;">Windows bridge</span><span style="font-size: small;">在</span><span style="font-family: Calibri; font-size: small;">Windows</span><span style="font-size: small;">层级的运行过程，</span><span style="font-family: Calibri; font-size: small;">bridge</span><span style="font-size: small;">的工作原理以及开发者如何使用</span><span style="font-family: Calibri; font-size: small;">Web</span><span style="font-size: small;">应用</span><span style="font-family: Calibri; font-size: small;">bridge</span><span style="font-size: small;">来创建</span><span style="font-family: Calibri; font-size: small;">&rdquo;Hosted Web Apps&rdquo;</span><span style="font-size: small;">，并解答一些共同的问题。</span></p>
<p><span style="font-size: small;">适用于安卓的</span><span style="font-family: Calibri; font-size: small;">Windows bridge</span><span style="font-size: small;">，即</span><span style="font-family: Calibri; font-size: small;">Project Astoria</span><span style="font-size: small;">，目前作为预览版，需要开发者经过邀请来使用。每周微软将逐渐邀请更多的开发者使用预览版，并且将继续扩大这个预览版的使用规模，最终目标是在</span><span style="font-family: Calibri; font-size: small;">8</span><span style="font-size: small;">月底之前让目前在候选名单里面的每个开发者都能够参与其中，并且在秋天之前将安卓</span><span style="font-family: Calibri; font-size: small;">Windows bridge</span><span style="font-size: small;">作为公共测试版发布出去。开发者如果希望提前使用安卓</span><span style="font-family: Calibri; font-size: small;">Windows bridge</span><span style="font-size: small;">，请在</span><a href="https://dev.windows.com/zh-cn/uwp-bridges/android"><span style="color: #0563c1; font-size: small;">这里</span></a><span style="text-decoration: underline;"><span style="color: #0563c1; font-size: small;">注册您的信息</span></span><span style="font-size: small;">。</span></p>
<p><span style="font-size: small;">就像微软在安卓</span><span style="font-family: Calibri; font-size: small;">Windows bridge</span><span style="font-size: small;">上面付出的努力一样，微软也致力于开源项目。</span><span style="font-size: small;">针对开源项目，微软提交了一些修改，来帮助提升</span><span style="font-family: Calibri; font-size: small;">ANGLE</span><span style="font-size: small;">性能</span><span style="font-family: Calibri; font-size: small;">(</span><a href="https://blogs.windows.com/buildingapps/2015/08/04/angle-for-windows-now-available-on-nuget/"><span style="color: #0563c1; font-family: Calibri; font-size: small;">ANGLE</span><span style="color: #0563c1; font-size: small;">提供了</span><span style="color: #0563c1; font-family: Calibri; font-size: small;">OpenGL</span><span style="color: #0563c1; font-size: small;">到</span><span style="color: #0563c1; font-family: Calibri; font-size: small;">DirectX</span><span style="color: #0563c1; font-size: small;">的转换</span></a><span style="text-decoration: underline;"><span style="color: #0563c1; font-family: Calibri; font-size: small;">)</span></span><span style="font-size: small;">。</span><span style="font-size: small;">这些修改已经被谷歌采纳，通过</span><span style="font-family: Calibri; font-size: small;">DirectX</span><span style="font-size: small;">的特征级别</span><span style="font-family: Calibri; font-size: small;">9.3</span><span style="font-size: small;">，提升了</span><span style="font-family: Calibri; font-size: small;">ANGLE</span><span style="font-size: small;">的性能以及兼容性。</span></p>
<p><span style="font-size: small;">适用于传统</span><span style="font-family: Calibri; font-size: small;">Windows</span><span style="font-size: small;">应用的</span><span style="font-family: Calibri; font-size: small;">Windows bridge</span><span style="font-size: small;">，即</span><span style="font-family: Calibri; font-size: small;">Project Centennial</span><span style="font-size: small;">，将在明年进行公开测试。该</span><span style="font-family: Calibri; font-size: small;">bridge</span><span style="font-size: small;">将使开发者将他们目前的</span><span style="font-family: Calibri; font-size: small;">.NET</span><span style="font-size: small;">和基于</span><span style="font-family: Calibri; font-size: small;">Win32</span><span style="font-size: small;">的</span><span style="font-family: Calibri; font-size: small;">Windows </span><span style="font-size: small;">应用打包发布到</span><span style="font-family: Calibri; font-size: small;">Windows</span><span style="font-size: small;">应用商店。</span></p>
<p><span style="font-size: small;">希望每一位开发者都能够使用</span><a href="https://github.com/Microsoft/WinObjC/"><span style="color: #0563c1; font-size: small;">适用于</span><span style="color: #0563c1; font-family: Calibri; font-size: small;">iOS</span><span style="color: #0563c1; font-size: small;">的</span><span style="color: #0563c1; font-family: Calibri; font-size: small;">Windows bridge</span></a><span style="font-size: small;">，并安装</span><span style="font-family: Calibri; font-size: small;">Windows 10 </span><span style="font-size: small;">和开发者工具。</span><span style="font-size: small;">如果您感觉目前有些功能还欠缺，微软的团队很愿意在</span><a href="https://wpdev.uservoice.com/forums/110705-dev-platform"><span style="color: #0563c1; font-family: Calibri; font-size: small;">User Voice</span></a><span style="font-size: small;">上听到反馈的声音。同时，微软期望通过</span><a href="https://twitter.com/windowsdev"><span style="color: #0563c1; font-family: Calibri; font-size: small;">@WindowsDev</span></a><span style="font-size: small;">看到您在</span><span style="font-family: Calibri; font-size: small;">Windows</span><span style="font-size: small;">应用商店中的应用程序。</span></p>]]></content:encoded>
    </item>
    <item>
      <title>NFC 与 Windows Phone 的那点事儿</title>
      <link>https://docs.microsoft.com/archive/blogs/express_for_uap_and_win10_dev/nfc-windows-phone</link>
      <pubDate>Sun, 18 Jan 2015 01:03:10 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/express_for_uap_and_win10_dev/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/68/22/metablogapi/5287.image_4EC4207A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5287.image_5F00_4EC4207A.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/68/22/metablogapi/8662.image_thumb_53CB7F8B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8662.image_5F00_thumb_5F00_53CB7F8B.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/68/22/metablogapi/3288.image_3FD70E57.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3288.image_5F00_3FD70E57.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/68/22/metablogapi/4274.image_thumb_1835B38F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4274.image_5F00_thumb_5F00_1835B38F.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/68/22/metablogapi/7245.image_6BAF1459.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7245.image_5F00_6BAF1459.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/68/22/metablogapi/8231.image_thumb_06119822.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8231.image_5F00_thumb_5F00_06119822.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/68/22/metablogapi/5282.image_3C16172F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5282.image_5F00_3C16172F.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 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/68/22/metablogapi/1452.image_thumb_33B9F3EB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1452.image_5F00_thumb_5F00_33B9F3EB.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/68/22/metablogapi/4812.image_39972835.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4812.image_5F00_39972835.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/68/22/metablogapi/1780.image_thumb_6C8BD9FE.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1780.image_5F00_thumb_5F00_6C8BD9FE.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 支持中国移动官方支付</title>
      <link>https://docs.microsoft.com/archive/blogs/express_for_uap_and_win10_dev/windows-phone</link>
      <pubDate>Mon, 08 Dec 2014 06:36:00 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/express_for_uap_and_win10_dev/2014/12/08/windows-phone/</guid>
      <description><![CDATA[今天在这里与大家分享一个好消息，Windows Phone 官方支付支持中国移动（MO Payment），在此之前无论是 Windows Phone 的用户还是开发者，都知道在Windows...]]></description>
      <content:encoded><![CDATA[<p>今天在这里与大家分享一个好消息，Windows Phone 官方支付支持中国移动（MO Payment），在此之前无论是 Windows Phone 的用户还是开发者，都知道在Windows Phone 上购买应用或者在进行应用内付费（IAP）的时候微软官方只支持支付宝一种支付方式，这对一些没有支付宝账户的朋友来说，付费流程就会相对复杂一些（因为还需要注册账户），但是现在<font style="background-color: #ffff00">中国移动的用户</font>，在使用大家手中的Windows Phone 进行购买应用或应用内付费（IAP）时大家会惊喜的发现我们可以使用全新的中国移动的支付方式进行购买。</p>  <p>操作步骤如下：</p>  <p>1. 打开支付页面的时候我们会看到熟悉的支付页面，我们在页面中通过点击<font style="background-color: #ffff00">添加或切换付款方式</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/68/22/metablogapi/5873.image_31BB8DE3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5873.image_5F00_31BB8DE3.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/68/22/metablogapi/0523.image_thumb_439AB261.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0523.image_5F00_thumb_5F00_439AB261.png" width="243" height="399" /></a></p>  <p>2. 在打开的选择付款方式页面我们会发现中国移动的付款方式已经在列表中了我们选择即可</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/2133.image_35CAFD17.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2133.image_5F00_35CAFD17.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/68/22/metablogapi/5277.image_thumb_5E69691E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5277.image_5F00_thumb_5F00_5E69691E.png" width="242" height="398" /></a></p>  <p>3. 返回到支付信息页面点击购买继续完成支持</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/3173.image_0E27119E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3173.image_5F00_0E27119E.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/68/22/metablogapi/3060.image_thumb_591D131E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3060.image_5F00_thumb_5F00_591D131E.png" width="253" height="427" /></a></p>  <p>4. 系统会自动进行支付并且返回支付结果</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/7610.wp_ss_20141208_0008_57DB0AF0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7610.wp_5F00_ss_5F00_20141208_5F00_0008_5F00_57DB0AF0.png"><img title="wp_ss_20141208_0008" 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="wp_ss_20141208_0008" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/3240.wp_ss_20141208_0008_thumb_55A112E5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3240.wp_5F00_ss_5F00_20141208_5F00_0008_5F00_thumb_5F00_55A112E5.png" width="266" height="440" /></a></p>  <p>5. 随后我们会收到移动支付的通知短信</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/7080.wp_ss_20141208_0009_629AF2F6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7080.wp_5F00_ss_5F00_20141208_5F00_0009_5F00_629AF2F6.png"><img title="wp_ss_20141208_0009" 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="wp_ss_20141208_0009" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/8400.wp_ss_20141208_0009_thumb_3FD9BB39.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8400.wp_5F00_ss_5F00_20141208_5F00_0009_5F00_thumb_5F00_3FD9BB39.png" width="268" height="444" /></a></p>  <p>整个流程非常简便快捷有效率。</p>  <p>&#160;</p>  <p>相信说到这里大家一定有一个疑问就是关于官方支付渠道商店分成问题，其实无论是支付宝还是中国移动的支付都遵循统一的商店分成原则（既三七分成）请参考 <a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/hh694058.aspx" target="_blank">应用开发人员协议</a> 。当然的应用内商品和应用本身在上商店之前是需要进行审核的只要符合标准就可以了详细内容请参考&#160; <a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/dn764944.aspx" target="_blank">Windows 和 Windows Phone 应用商店策略</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/68/22/metablogapi/1581.image_166579F9.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1581.image_5F00_166579F9.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/68/22/metablogapi/4657.image_thumb_260815BB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4657.image_5F00_thumb_5F00_260815BB.png" width="603" height="64" /></a></p>  <p>以上介绍的是用户体验，这里相信开发者朋友会站出来问这里多了一种支付方式那么我们已经开发好的应用程序，或者今后开发的应用程序如何针对中国移动的支付方式进行适配呢？</p>  <p>其实答案非常简单，我们<font style="background-color: #ffff00">不需要对这种支付方式进行特殊的配置</font>，也就是说之前已经提交在应用商店中的应用内商品和应用本身<font style="background-color: #ffff00">无需进行任何修改就可以支持中国移动的支付方式</font>，此外如果是一个全新的应用或应用内商品只需要按照之前 Windows Phone 应用内商品和应用提交的审核流程操作既可以支持中国移动的支付方式。 </p>  <p>如果您需要是使用微软的中国移动官方支付，您需要将商品提交到应用商店进行审核后，在配合客户端的代码编写及您应用本身或和您自己的服务器进行验证交互来完成应用内商品购买。我之前有一篇详细介绍应用内购买的文章请参考： <a href="https://www.cnblogs.com/sonic1abc/archive/2013/02/01/2883001.html" target="_blank">Windows Phone 8 In app purchase 应用内购买 / 应用内支付</a></p>  <p>大致内容如下：</p>  <p>微软的支付流程如下</p>  <p><img src="https://images.cnitblog.com/blog/33251/201301/30115251-e2c2ecc5ed8a4276ac408d75db906bb2.png" width="633" height="486" /></p>  <p>在进行Coding之前我们需要现在应用商店中提交我们的应用内商品</p>  <p><img src="https://images.cnitblog.com/blog/33251/201301/30132509-11344efef3804d35b0dfbf74ece99cc7.png" width="736" height="442" /></p>  <p>随后我们要在应用中配置好应用的详细信息，否则我们是无法再应用中拿到商品列表的。（下图是Silverlight应用的配置方法）</p>  <p><img src="https://images.cnitblog.com/blog/33251/201301/30132721-956cd07e1df74c26a08aa5b65f43995e.png" width="651" height="398" /></p>  <p>Universal 应用需要直接与应用相关联 （参考：<a href="https://www.cnblogs.com/sonic1abc/p/3380819.html" target="_blank">如何在Windows应用商店中提交您的Windows 8.1 应用更新</a>）</p>  <p><img alt="image" src="https://images.cnitblog.com/blog/33251/201310/21164030-85be502aa3b34653aafb1bb3b2df7b57.png" /></p>  <p>随后我们就可以进行支付部分的 Coding 工作，这里常用的 loadlistingInformationAsync() 来获取所有的商品。</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">private</span> <span style="color: #0000ff">async</span> <span style="color: #0000ff">void</span> btnListIAPProducts_Tap(<span style="color: #0000ff">object</span><span style="color: #000000"> sender, System.Windows.Input.GestureEventArgs e)
        {
            </span><span style="color: #0000ff">try</span><span style="color: #000000">
            {
                </span><span style="color: #0000ff">var</span> ProdList = <span style="color: #0000ff">await</span><span style="color: #000000"> CurrentApp.LoadListingInformationAsync();
                lbProductsList.Items.Clear();
                </span><span style="color: #0000ff">string</span> t = <span style="color: #800000">&quot;&quot;</span><span style="color: #000000">;

                </span><span style="color: #0000ff">foreach</span> (<span style="color: #0000ff">var</span> item <span style="color: #0000ff">in</span><span style="color: #000000"> ProdList.ProductListings)
                {
                    t </span>= <span style="color: #0000ff">string</span>.Format(<span style="color: #800000">&quot;</span><span style="color: #800000">{0}, {1}, {2},{3}, {4}</span><span style="color: #800000">&quot;</span><span style="color: #000000">,
                                        item.Key,
                                        item.Value.Name,
                                        item.Value.FormattedPrice,
                                        item.Value.ProductType,
                                        item.Value.Description);

                    lbProductsList.Items.Insert(</span><span style="color: #800080">0</span><span style="color: #000000">, t);
                }
            }
            </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception ex)
            {
                MessageBox.Show(</span><span style="color: #800000">&quot;</span><span style="color: #800000">Error: </span><span style="color: #800000">&quot;</span> +<span style="color: #000000"> ex.Message);
            }
        }</span></pre>
</div>

<p>完成支付功能 （详细内容还是建议阅读一下：<a href="https://www.cnblogs.com/sonic1abc/archive/2013/02/01/2883001.html" target="_blank">Windows Phone 8 In app purchase 应用内购买 / 应用内支付</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">private</span> <span style="color: #0000ff">async</span> <span style="color: #0000ff">void</span> btnOrderProduct_Tap(<span style="color: #0000ff">object</span><span style="color: #000000"> sender, System.Windows.Input.GestureEventArgs e)
        {
            </span><span style="color: #0000ff">var</span> ProdList = <span style="color: #0000ff">await</span><span style="color: #000000"> CurrentApp.LoadListingInformationAsync();
            </span><span style="color: #0000ff">var</span> Prod = ProdList.ProductListings.FirstOrDefault(p =&gt; p.Value.ProductType ==<span style="color: #000000"> ProductType.Consumable);
            </span><span style="color: #0000ff">try</span><span style="color: #000000">
            {
                </span><span style="color: #0000ff">var</span> Receipt = <span style="color: #0000ff">await</span> CurrentApp.RequestProductPurchaseAsync(Prod.Value.ProductId, <span style="color: #0000ff">true</span><span style="color: #000000">);

                </span><span style="color: #0000ff">if</span><span style="color: #000000"> (CurrentApp.LicenseInformation.ProductLicenses[Prod.Value.ProductId].IsActive)
                {
                    </span><span style="color: #008000">//</span><span style="color: #008000"> do someting with this license...

                    </span><span style="color: #008000">//</span><span style="color: #008000"> Notify the marketplace that the application has delivered the paid-for goods to the user. </span>
<span style="color: #000000">                    CurrentApp.ReportProductFulfillment(Prod.Value.ProductId);
                }
                MessageBox.Show(Receipt, </span><span style="color: #800000">&quot;</span><span style="color: #800000">Fatura</span><span style="color: #800000">&quot;</span><span style="color: #000000">, MessageBoxButton.OK);
            }
            </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception ex)
            {
                MessageBox.Show(ex.Message, </span><span style="color: #800000">&quot;</span><span style="color: #800000">Fatura</span><span style="color: #800000">&quot;</span><span style="color: #000000">, MessageBoxButton.OK);
            }
        }</span></pre>
</div>

<p>此外如果你如果需要将你的应用进行打包上传发布到 Windows Store 请参考：<a href="https://www.cnblogs.com/sonic1abc/p/3769679.html" target="_blank">Windows / Windows Phone 8.1 预留应用名称及应用上传</a></p>

<p>其实整个流程也比较简单，首先填写一些应用的一些基本信息，例如应用名称，类别，销售价格，分发市场等内容。</p>

<p><img alt="image" src="https://images.cnitblog.com/blog/33251/201406/050944254278263.png" width="588" height="454" /></p>

<p>然后提交您的应用程序包到商店中进行审核即可，待审核通过后Windows 用户就可以在商店下载（购买）您的应用了。</p>

<p><img alt="image" src="https://images.cnitblog.com/blog/33251/201406/050944460994448.png" width="590" height="576" /></p>

<p>希望上的总结可以帮助到大家, 同时欢迎大家在这里和我沟通交流或者在新浪微博上 <a href="https://www.weibo.com/wangvbo">@王博_Nick</a></p>]]></content:encoded>
    </item>
    <item>
      <title>使用 Portable Class Library（可移植类库）开发 Universal Windows App</title>
      <link>https://docs.microsoft.com/archive/blogs/express_for_uap_and_win10_dev/portable-class-library-universal-windows-app</link>
      <pubDate>Sun, 30 Nov 2014 02:12:50 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/express_for_uap_and_win10_dev/2014/11/30/portable-class-library-universal-windows-app/</guid>
      <description><![CDATA[今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题，首先Universal Windows App的定义相信大家已经有所了解了（如果你是一个刚刚接触 Universal...]]></description>
      <content:encoded><![CDATA[<p>今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题，首先Universal Windows App的定义相信大家已经有所了解了（如果你是一个刚刚接触 Universal APP 的开发这个请先阅读一下我之前的文章 <a href="https://www.cnblogs.com/sonic1abc/p/3772693.html" target="_blank">Windows Phone 8.1 开发技术概览 [Universal APP]</a>）, 相信大家在这里最苦恼的事情莫过于在不同开发架构下分享代码了，今天我在这里给大家推荐一个解决方案使用可移植类库（Portable Class Library）在不同的Windows项目之间分享代码。（Windows 8.1 / Windows Phone 8.1 ）这里还包括Silverlight开发的 Windows Phone 8.1 应用。</p>  <p>首先介绍一下什么是 Portable Class Library，称之为‘可移植类库’（简称PCL）支持 C# 语言开发，并且在开发 Universal 类库时支持UI呈现。 这里在次强调一下目前只支持C#开发，C# 的语法可以在 PCL 中使用，方便C# 的开发人员快速上手，并且支持调用 Windows Runtime 的 SDK 例如，网络访问，JSON 处理，内容分享等功能。 也非常适合三方SDK开发和功能集成。</p>  <p>如何创建一个 PCL 的类库呢非常简单只需要打开我们的VS2013（update 2 及以上版本）选择Universal 应用模板 选择PCL的项目模板即可，（<font style="background-color: #ffff00">Component支持 Universal 应用。 DLL 支持Silverlight以及 Windows XAML C# 应用</font>）这里最大的区别是 <font style="background-color: #ffff00">DLL 的类库不允许类库中使用UI内容</font>。（原因非常简单 Universal 应用和 SL的应用架构不同）</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/3833.image_78418FB0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3833.image_5F00_78418FB0.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/68/22/metablogapi/8037.image_thumb_509DA437.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8037.image_5F00_thumb_5F00_509DA437.png" width="764" height="432" /></a></p>  <p>通过项目属性 我们还可以通过 Output Type 来切换项目的输出类型（Component 或 DLL）</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/6811.image_200CB730.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6811.image_5F00_200CB730.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/68/22/metablogapi/1488.image_thumb_2F431FFD.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1488.image_5F00_thumb_5F00_2F431FFD.png" width="583" height="322" /></a></p>  <p>另外 我们还可以是通过 Targets 属性来适配应用的应用适配平台，这里要注意的是如果应用跨 Universal 和 Silverlight 平台 （8.0 和 8.1）类库内容会受到很大的影响（<font style="background-color: #ffff00">类库版本越旧我们在PCL中可以使用的WinRT feature 也就越少</font>），并且PCL 将不能支持<font style="background-color: #ffff00">UI控件</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/68/22/metablogapi/3581.image_6EA3643E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3581.image_5F00_6EA3643E.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/68/22/metablogapi/0552.image_thumb_1DF4D9C9.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0552.image_5F00_thumb_5F00_1DF4D9C9.png" width="407" height="436" /></a></p>  <p>&#160;</p>  <p>上面提到各种限制肯能有些复杂，我用一张图来给大家说明一下。（这里针对Universal 8.1 APP 和 Silverlight 应用架构）</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/8358.image_00A73412.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8358.image_5F00_00A73412.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/68/22/metablogapi/4617.image_thumb_791E5555.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4617.image_5F00_thumb_5F00_791E5555.png" width="834" height="464" /></a></p>  <blockquote>   <p>1.如果你的类库只想被Universal 应用调用，那么你需要选择 Windows Runtime Component 进行输出，你的PCL将支持大部分 Windows RT的 Feature 并且支持UI控件的分享，<font style="background-color: #ffff00">但是WinJS项目不支持 UI 控件的展示，这里原因很简单 XAML上层渲染和 HTML是不同的。</font></p>    <p><font style="background-color: #ffffff">2.如果你需要你的PCL支持 Silverlight 项目的调用，那么你需要选择 Class Library （DLL）进行输出，你的PCL也可以支持大部分 Windows RT的 Feature 。</font><font style="background-color: #ffff00">但是不可以进行 UI控件的分享，并且你输出的DLL将不能被 Universal APP的 C++ XAML 和 HTML WinJS 项目调用。</font></p> </blockquote>  <p>这里最好的建议就是相同的类库，如果想让它同时兼容 Universal 架构（XAML C++/C#&#160; 和 HTML WinJS）Silverlight架构，只需要将PCL的输出类型切换在编译一次就可。（三方SDK建议这样做：））</p>  <p>我这里给大家一个测试代码是使用 WinRT中的Share Contract 进行应用间分享。（因为没有 UI 内容可以直接 Target 到 Universal 和 Silverlight 项目中去，当然是两次编译）</p>  <p>项目结构（为了方便这里我做了 Component 和 DLL 的项目但是项目中的代码是相同的，当然在开发的时候用link的形势也可以）</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/3007.image_6EEF4B99.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3007.image_5F00_6EEF4B99.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/68/22/metablogapi/0652.image_thumb_37A8C45E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0652.image_5F00_thumb_5F00_37A8C45E.png" width="564" height="268" /></a></p>  <p>PCL 分享类库代码如下</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">sealed</span> <span style="color: #0000ff">class</span><span style="color: #000000"> ShareText
    {
        </span><span style="color: #0000ff">private</span><span style="color: #000000"> DataTransferManager dataTransferManager;

        </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> DataContent { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span><span style="color: #000000">; }

        </span><span style="color: #0000ff">public</span><span style="color: #000000"> ShareText()
        {
            </span><span style="color: #0000ff">this</span>.dataTransferManager =<span style="color: #000000"> DataTransferManager.GetForCurrentView();
            </span><span style="color: #0000ff">this</span>.dataTransferManager.DataRequested += <span style="color: #0000ff">new</span> TypedEventHandler&lt;DataTransferManager, DataRequestedEventArgs&gt;(<span style="color: #0000ff">this</span><span style="color: #000000">.OnDataRequested);
            DataContent </span>= <span style="color: #800000">&quot;</span><span style="color: #800000">Share Text From PCL</span><span style="color: #800000">&quot;</span><span style="color: #000000">;
        }
        </span><span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span><span style="color: #000000"> OnDataRequested(DataTransferManager sender, DataRequestedEventArgs e)
        {
            </span><span style="color: #008000">//</span><span style="color: #008000"> Call the scenario specific function to populate the datapackage with the data to be shared.</span>
            <span style="color: #0000ff">if</span><span style="color: #000000"> (GetShareContent(e.Request))
            {
                </span><span style="color: #008000">//</span><span style="color: #008000"> Out of the datapackage properties, the title is required. If the scenario completed successfully, we need
                </span><span style="color: #008000">//</span><span style="color: #008000"> to make sure the title is valid since the sample scenario gets the title from the user.</span>
                <span style="color: #0000ff">if</span><span style="color: #000000"> (String.IsNullOrEmpty(e.Request.Data.Properties.Title))
                {
                    </span><span style="color: #0000ff">return</span><span style="color: #000000">;
                }
            }
        }
        </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">bool</span><span style="color: #000000"> GetShareContent(DataRequest request)
        {
            </span><span style="color: #0000ff">bool</span> succeeded = <span style="color: #0000ff">false</span><span style="color: #000000">;

            </span><span style="color: #0000ff">string</span> dataPackageText =<span style="color: #000000"> DataContent;
            </span><span style="color: #0000ff">if</span> (!<span style="color: #000000">String.IsNullOrEmpty(dataPackageText))
            {
                DataPackage requestData </span>=<span style="color: #000000"> request.Data;
                requestData.Properties.Title </span>= <span style="color: #800000">&quot;</span><span style="color: #800000">Share Text</span><span style="color: #800000">&quot;</span><span style="color: #000000">;
                requestData.Properties.Description </span>= <span style="color: #800000">&quot;</span><span style="color: #800000">Share Description</span><span style="color: #800000">&quot;</span>; <span style="color: #008000">//</span><span style="color: #008000"> The description is optional.
                </span><span style="color: #008000">//</span><span style="color: #008000">requestData.Properties.ContentSourceApplicationLink = GetType().Name;</span>
<span style="color: #000000">                requestData.SetText(dataPackageText);
                succeeded </span>= <span style="color: #0000ff">true</span><span style="color: #000000">;
            }
            </span><span style="color: #0000ff">else</span><span style="color: #000000">
            {
                request.FailWithDisplayText(</span><span style="color: #800000">&quot;</span><span style="color: #800000">Enter the text you would like to share and try again.</span><span style="color: #800000">&quot;</span><span style="color: #000000">);
            }
            </span><span style="color: #0000ff">return</span><span style="color: #000000"> succeeded;
        }
        </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> ShowShareUI()
        {
            </span><span style="color: #008000">//</span><span style="color: #008000"> If the user clicks the share button, invoke the share flow programatically.</span>
<span style="color: #000000">            DataTransferManager.ShowShareUI();
        }
    }</span></pre>
</div>

<p>C# 项目调用 </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">private</span> <span style="color: #0000ff">void</span> Button_Click(<span style="color: #0000ff">object</span><span style="color: #000000"> sender, RoutedEventArgs e)
        {
            UniversalComponent.ShareText st </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> UniversalComponent.ShareText();

            st.DataContent </span>= <span style="color: #800000">&quot;</span><span style="color: #800000">Hello PCL form C#</span><span style="color: #800000">&quot;</span><span style="color: #000000">;

            st.ShowShareUI();
</span>        }</pre>
</div>

<p>C++&#160; 项目调用</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">void</span> UniversalC__App::BlankPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^<span style="color: #000000"> e)
{
    UniversalPCL::ShareText</span>^ ST = <span style="color: #0000ff">ref</span> <span style="color: #0000ff">new</span><span style="color: #000000"> UniversalPCL::ShareText;
    ST</span>-&gt;DataContent = <span style="color: #800000">&quot;</span><span style="color: #800000">Hello PCL from C++</span><span style="color: #800000">&quot;</span><span style="color: #000000">;
    ST</span>-&gt;<span style="color: #000000">ShowShareUI();
}</span></pre>
</div>

<p>HTML + WinJS项目调用</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">function</span><span style="color: #000000"> callComponent() {
</span></pre>

  <pre><span style="color: #000000">    </span><span style="color: #0000ff">var</span> component = <span style="color: #0000ff">new</span><span style="color: #000000"> UniversalPCL.ShareText();
    component.dataContent </span>= &quot;Hello form JS&quot;<span style="color: #000000">;
    component.showShareUI();
}</span></pre>
</div>

<p>Silverlight C# 调用</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">private</span> <span style="color: #0000ff">void</span> Button_Click(<span style="color: #0000ff">object</span><span style="color: #000000"> sender, RoutedEventArgs e)
        {
            UniversalComponent.ShareText st </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> UniversalComponent.ShareText();

            st.DataContent </span>= <span style="color: #800000">&quot;</span><span style="color: #800000">Hello PCL form SL</span><span style="color: #800000">&quot;</span><span style="color: #000000">;

            st.ShowShareUI();
        }</span></pre>
</div>

<p>我们可以在 VS 中测试任意一个平台的调用情况</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/2350.image_6BDF7E55.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2350.image_5F00_6BDF7E55.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/68/22/metablogapi/1184.image_thumb_1AC4C0EB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1184.image_5F00_thumb_5F00_1AC4C0EB.png" width="858" height="506" /></a></p>

<p>这里我就不逐一展示测试效果了，贴一张 C++ 调用的截图让大家过过瘾也好 ：） </p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/8054.image_4C554FE2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8054.image_5F00_4C554FE2.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/68/22/metablogapi/4544.image_thumb_623EC232.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4544.image_5F00_thumb_5F00_623EC232.png" width="298" height="472" /></a>&#160;&#160;&#160; <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/0207.image_5402D9F3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0207.image_5F00_5402D9F3.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/68/22/metablogapi/3324.image_thumb_77C122EF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3324.image_5F00_thumb_5F00_77C122EF.png" width="295" height="473" /></a>&#160; <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/7411.image_496A2DF3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7411.image_5F00_496A2DF3.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/68/22/metablogapi/5340.image_thumb_7132C4C1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5340.image_5F00_thumb_5F00_7132C4C1.png" width="300" height="472" /></a></p>

<p>希望上的总结可以帮助到大家, 同时欢迎大家在这里和我沟通交流或者在新浪微博上 <a href="https://www.weibo.com/wangvbo">@王博_Nick</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft Azure Mobile Service添加第三方用户认证服务(LinkedIn为例)</title>
      <link>https://docs.microsoft.com/archive/blogs/express_for_uap_and_win10_dev/microsoft-azure-mobile-servicelinkedin</link>
      <pubDate>Wed, 19 Nov 2014 02:13:00 GMT</pubDate>
      <dc:creator><![CDATA[Shijun Liu]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/express_for_uap_and_win10_dev/2014/11/19/microsoft-azure-mobile-servicelinkedin/</guid>
      <description><![CDATA[Azure官方支持Microsoft、Google、Twitter、Facebook、Windows Azure Active...]]></description>
      <content:encoded><![CDATA[<p><span style="font-size: small;">　　Azure官方支持Microsoft、Google、Twitter、Facebook、Windows Azure Active Directory五种账户登录。但是很多情况下，开发者希望配置其他账户登录功能，比如LinkedIn、微信、微博等等。这篇博</span><span style="font-size: small;">客将介绍如何通过加载扩展身份认证SDK，实现LinkedIn登录功能。</span></p>
<p><span style="font-size: small;"><span style="background-color: #ffff00;"><strong>第一步</strong></span>，新建Azure Mobile Service，后端采用.Net实现(因为只有.Net支持添加新的第三方账户认证)。</span></p>
<p><span style="font-size: small;"><span style="background-color: #ffff00;"><strong>第二步</strong></span>，在Portal下载的Mobile Service工程中，在后端Service工程中添加Owin.Security.Providers包。</span></p>
<p>&nbsp;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/5100.1.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22/5100.1.jpg"><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/5100.1.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22/5100.1.jpg" alt="" width="374" height="213" border="0" /></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/68/22/4061.2.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22/4061.2.jpg"><img style="display: block; margin-left: auto; margin-right: auto;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/4061.2.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22/4061.2.jpg" alt="" border="0" /></a></p>
<p align="left"><span style="font-size: small;"><span style="background-color: #ffff00;"><strong>第三步</strong></span>，在后端工程中创建LoginProvider，以实现LinkedIn为例。</span></p>
<p align="left"><span style="font-size: small;">1. 创建一个基于LoginProvider的实现，包括三点：</span></p>
<p align="left"><span style="font-size: small;">　1)&nbsp;&nbsp;&nbsp;&nbsp;注册LinkedIn OWIN中间件以配置身份认证内容；</span></p>
<p align="left"><span style="font-size: small;">　2)&nbsp;&nbsp;&nbsp;&nbsp;将从LinkedIn获得的登录token序列化；</span></p>
<p align="left"><span style="font-size: small;">　3)&nbsp;&nbsp;&nbsp;&nbsp;解析获得的登录token，获取内部信息；</span></p>
<p align="left"><span style="font-size: small;">　具体实现：</span><span style="font-size: small;">为了便于分类，可以在后端工程中创建一个新的文件夹，起名LinkedInLogin，在其中添加一个类文件LinkedInLoginProvider.cs</span></p>
<table style="margin-right: auto; margin-left: auto;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="553">
<p align="left">using System.Linq;</p>
<p align="left">using System.Threading.Tasks;</p>
<p align="left">using System.Web.Http;</p>
<p align="left">using System.Web.Http.Controllers;</p>
<p align="left">using System.Web.Http.OData;</p>
<p align="left">using Microsoft.WindowsAzure.Mobile.Service;</p>
<p align="left">using Owin.Security.Providers;</p>
<p align="left">using Microsoft.WindowsAzure.Mobile.Service.Security;</p>
<p align="left">using Owin;</p>
<p align="left">using System.Security.Claims;</p>
<p align="left">using Newtonsoft.Json.Linq;</p>
<p align="left">using Owin.Security.Providers.LinkedIn;</p>
<p align="left">using LiusjMobileforLinkedinService.LinkedInLogin; //&lt;后段工程名&gt;.&lt;新建文件夹名&gt;，即引用该文件夹</p>
<p align="left">&nbsp;</p>
<p align="left">namespace LiusjMobileforLinkedinService</p>
<p align="left">{</p>
<p align="left">&nbsp;&nbsp;&nbsp; public class LinkedInLoginProvider : LoginProvider</p>
<p align="left">&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; internal const string ProviderName = "LinkedIn";</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public LinkedInLoginProvider(IServiceTokenHandler tokenHandler)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : base(tokenHandler)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override string Name</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return ProviderName; }</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override void ConfigureMiddleware(IAppBuilder appBuilder,</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceSettingsDictionary settings)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinkedInAuthenticationOptions options = new LinkedInAuthenticationOptions</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClientId = settings["LinkedInClientId"],</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClientSecret = settings["LinkedInClientSecret"],</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AuthenticationType = this.Name,</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Provider = new LinkedInLoginAuthenticationProvider()</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appBuilder.UseLinkedInAuthentication(options);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override ProviderCredentials CreateCredentials(</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClaimsIdentity claimsIdentity)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Claim name = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Claim providerAccessToken = claimsIdentity</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .FindFirst(ServiceClaimTypes.ProviderAccessToken);</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinkedInCredentials credentials = new LinkedInCredentials</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserId = this.TokenHandler.CreateUserId(this.Name, name != null ?</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name.Value : null),</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AccessToken = providerAccessToken != null ?</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; providerAccessToken.Value : null</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return credentials;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override ProviderCredentials ParseCredentials(JObject serialized)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return serialized.ToObject&lt;LinkedInCredentials&gt;();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="font-size: small;">2. 要求获取LinkedIn登录token</span></p>
<p><span style="font-size: small;">　具体实现：</span><span style="font-size: small;">创建一个新的类文件LinkedInLoginAuthenticationProvider.cs</span></p>
<table style="margin-right: auto; margin-left: auto;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="553">
<p align="left">using System.Linq;</p>
<p align="left">using System.Threading.Tasks;</p>
<p align="left">using System.Web.Http;</p>
<p align="left">using System.Web.Http.Controllers;</p>
<p align="left">using System.Web.Http.OData;</p>
<p align="left">using Microsoft.WindowsAzure.Mobile.Service;</p>
<p align="left">using Owin.Security.Providers;</p>
<p align="left">using Microsoft.WindowsAzure.Mobile.Service.Security;</p>
<p align="left">using Owin;</p>
<p align="left">using System.Security.Claims;</p>
<p align="left">using Newtonsoft.Json.Linq;</p>
<p align="left">using Owin.Security.Providers.LinkedIn;</p>
<p align="left">&nbsp;</p>
<p align="left">namespace LiusjMobileforLinkedinService</p>
<p align="left">{</p>
<p align="left">&nbsp;&nbsp;&nbsp; public class LinkedInLoginAuthenticationProvider : LinkedInAuthenticationProvider</p>
<p align="left">&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override Task Authenticated(LinkedInAuthenticatedContext context)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Identity.AddClaim(</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Claim(ServiceClaimTypes.ProviderAccessToken, context.AccessToken));</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return base.Authenticated(context);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">3. 定义一个ProviderCredentials类，将登录token作为一个公共属性</span></p>
<p><span style="font-size: small;">　具体实现：</span><span style="font-size: small;">创建一个新的类文件LinkedInCredentials.cs</span></p>
<table style="margin-right: auto; margin-left: auto;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="553">
<p align="left">using Owin.Security.Providers;</p>
<p align="left">using Microsoft.WindowsAzure.Mobile.Service.Security;</p>
<p align="left">using Owin;</p>
<p align="left">using System.Security.Claims;</p>
<p align="left">using Newtonsoft.Json.Linq;</p>
<p align="left">using Owin.Security.Providers.LinkedIn;</p>
<p align="left">&nbsp;</p>
<p align="left">namespace LiusjMobileforLinkedinService.LinkedInLogin</p>
<p align="left">{</p>
<p align="left">&nbsp;&nbsp;&nbsp; public class LinkedInCredentials : ProviderCredentials</p>
<p align="left">&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public LinkedInCredentials()</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : base(LinkedInLoginProvider.ProviderName)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string AccessToken { get; set; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="font-size: small; background-color: #ffff00;">　　在完成前三步后，LinedInLogin中实现了上述的三个文件，实际上LinkedInLoginAuthenticationProvider和LinkedInCredentials都是为LinkedInLoginProvider这个对象服务的。</span></p>
<p><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/2555.3.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22/2555.3.jpg" alt="" width="234" height="197" border="0" /></p>
<p>&nbsp;</p>
<p><span style="font-size: small;">4. 在后台中注册新实现的LoginProvider，具体来说通过WebApiConfig类中的Register方法实现</span></p>
<table style="margin-right: auto; margin-left: auto;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="553">
<p align="left">public static void Register()</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConfigOptions options = new ConfigOptions();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.LoginProviders.Add(typeof(LinkedInLoginProvider));</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpConfiguration config = ServiceConfig.Initialize(new ConfigBuilder(options));</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Database.SetInitializer(new LiusjMobileforLinkedinInitializer());</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.SetIsHosted(true);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align: center;">&nbsp;</p>
<p><span style="font-size: small;">5. 在web.config文件中添加ClientID和ClientSecret的设置</span></p>
<table style="margin-right: auto; margin-left: auto;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="553">
<p>&lt;add key="LinkedInClientId" value="your value here" /&gt;</p>
<p>&lt;add key="LinkedInClientSecret" value="your value here" /&gt;</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align: center;">&nbsp;</p>
<p><span style="font-size: small; background-color: #ffff00;">注：获取客户端ID和密钥的具体方法</span></p>
<p><span style="font-size: small;">　1)　通过网址<span style="color: #3366ff;"><a href="https://developer.linkedin.com/"><span style="color: #3366ff;">https://developer.linkedin.com/</span></a></span>，登录LinkedIn开发者网站；</span></p>
<p><span style="font-size: small;">　2)　要想通过LinkedIn登录，需要首先注册新应用。点击页面上方<strong>Support --&gt; API keys --&gt; Add New Application</strong>。</span></p>
<p><span style="font-size: small;">　3)&nbsp;&nbsp;&nbsp;&nbsp;在出现的注册应用的表格中，特别注意在<strong>OAuth User Agreement</strong>一栏:</span></p>
<p><span style="font-size: small;">　　a.&nbsp;通过勾选<strong>Default Scope</strong>来确认返回Token中包含的信息；</span></p>
<p><span style="font-size: small;">　　b.&nbsp;在<strong>OAuth2.0 Redirect URLs</strong>中填写指向Azure Mobile Service后台服务的登录URL：</span></p>
<p style="text-align: center;"><span style="font-size: small;"><span style="text-decoration: underline;"><a href="https://%3Cmobile/">https://&lt;Mobile</a> Service后台服务地址&gt;/signin-linkedin</span></span></p>
<p><span style="font-size: small;">　4) &nbsp;确认后，可以获得该应用的密钥信息，<span style="background-color: #ffff00;">其中API key就是ClientID，Secret Key就是ClientSecret</span>。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span style="background-color: #ffff00;"><strong>第四步</strong></span>，将该后台服务发布到Azure Mobile Service上，此时可以在浏览器中通过访问REST API去检查登录配置是否成功：</span><span style="font-size: small;">REST API为<span style="color: #3366ff;"><span><a href="https://liusjmobileforlinkedin.azure-mobile.net/login/linkedin">https://liusjmobileforlinkedin.azure-mobile.net/login/linkedin</a></span></span></span><span style="font-size: small;">，</span><span style="font-size: small;">登</span><span style="font-size: small;">录后就可以访问后台服务了</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/68/22/0511.6.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22/0511.6.jpg"><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/0511.6.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22/0511.6.jpg" alt="" width="202" height="231" border="0" /></a></p>
<p><span style="font-size: small;"><span style="background-color: #ffff00;"><strong>第五步</strong></span>，如果希望在客户端使用LoginProvider，只需要通过字符串&rdquo;linkedin&rdquo;标示。</span></p>
<p><span style="font-size: small;">　　具体实现：在MainPage.cs中添加登录函数AuthenticateAsync，并在首页导航函数中调用它。</span></p>
<table style="margin-right: auto; margin-left: auto;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="553">
<p align="left">protected override async void OnNavigatedTo(NavigationEventArgs e)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await AuthenticateAsync();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await RefreshTodoItems();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private async Task AuthenticateAsync()</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.WindowsAzure.MobileServices.MobileServiceUser user = null;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (user == null)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string message;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user = await App.MobileService.LoginAsync("linkedin");</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message = string.Format("You are now logged in - {0}", user.UserId);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (InvalidOperationException)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message = "You must log in. Login Required";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dialog = new MessageDialog(message);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dialog.Commands.Add(new UICommand("OK"));</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await dialog.ShowAsync();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align: center;">&nbsp;</p>
<p><span style="font-size: small;">　　这时就可以在客户端实现LinkedIn登录，登陆后程度设置显示LinkedIn的用户ID</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/68/22/3603.7.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22/3603.7.jpg"><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/3603.7.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22/3603.7.jpg" alt="" width="286" height="167" border="0" /></a></p>
<p>&nbsp;</p>
<p><span style="font-size: small; background-color: #ffff00;"><strong>最后说几个特别需要注意的事</strong>：</span></p>
<p><span style="font-size: small;">　1.&nbsp;　当采用LinkedIn身份认证时，一定不要在Azure Portal的身份认证一栏配置其他账户认证(比如Microsoft Live ID)，否则就无法成功了。</span></p>
<p><span style="font-size: small;">　2.&nbsp;　在开启客户端时，别忘了将App.xaml.cs中的Mobile Service连接URL和密钥加上哦。</span></p>
<p style="text-align: center;" align="left"><span style="font-size: small;">public static MobileServiceClient MobileService = new MobileServiceClient( "&lt;Mobile Service URL&gt;", "&lt;Mobile Service密钥&gt;" );</span></p>]]></content:encoded>
    </item>
    <item>
      <title>如何使用 App Studio 快速定制你自己的 Universal Windows App</title>
      <link>https://docs.microsoft.com/archive/blogs/express_for_uap_and_win10_dev/app-studio-universal-windows-app</link>
      <pubDate>Fri, 14 Nov 2014 17:29:17 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/express_for_uap_and_win10_dev/2014/11/14/app-studio-universal-windows-app/</guid>
      <description><![CDATA[之前我为大家介绍过 App Studio 这只神器可以帮助大家快速制作一个 Windows Phone 8 的应用，今天之所以在写一篇关于 App Studio 的文章是因为，App Studio...]]></description>
      <content:encoded><![CDATA[<p>之前我为大家<a href="https://www.cnblogs.com/sonic1abc/p/3259407.html" target="_blank">介绍过 App Studio</a> 这只神器可以帮助大家快速制作一个 Windows Phone 8 的应用，今天之所以在写一篇关于 App Studio 的文章是因为，App Studio 经过了几次升级功能得到了明显提升还可以调用系统功能了，并且可以更方便的和应用商店关联发布 Universal Windows 应用（<span style="background-color: #ffff00">注：这是指 Windows 8.1 和 Windows Phone 8.1应用</span>）以及 Windows Phone 8.0应用，接下来我为大家在介绍一下这升级后的 Universal Windows App Studio</p>  <p>使用 App Studio 的意义在于你有一个好的创意，但是由于时间或者技术等方面因素的制约 App Studio 可以帮你在有限的资源和时间情况下帮助你快速生成和发布一个高质量 Universal Windows 平台应用。并且用App Studio 制作的应用我们还可以拿到源代码方便我们学习和升级更高级的功能。</p>  <p>如果你还没有使用过 App Studio 那就赶快注册成为 App Studio的开发者吧请参考 <a href="https://www.cnblogs.com/sonic1abc/p/3259407.html" target="_blank">我之前的文章介绍</a>， 今天我主要介绍一下更新后的App Studio 如何使用，感兴趣的朋友可以跟我一起尝试做一个应用。</p>  <p>用IE打开 App Studio 的首页： <a href="https://appstudio.windows.com">https://appstudio.windows.com</a></p>  <p>首先我们点击首页上的 Start New 开始创建一个新的项目。（这里完成一个应用只需要4步，我们一步一步来~）</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/5127.image_11BB456D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5127.image_5F00_11BB456D.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/68/22/metablogapi/2043.image_thumb_0A9E99A6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2043.image_5F00_thumb_5F00_0A9E99A6.png" width="621" height="320" /></a></p>  <p>点击 Start New 之后我们会看到 选择模板 页面在这里我们可以根据我们要做的应用类型选择一个合适的模板，例如这里有 音乐 视频 旅行 爱好 等等非常丰富的模板类型，当我们选择一个模板后页面都会有一个页面的预览如果喜欢 我们就可以选择 创建，就会使用这个模板创建我们的应用了。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/5661.image_6E243876.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5661.image_5F00_6E243876.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/68/22/metablogapi/6835.image_thumb_46A78903.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6835.image_5F00_thumb_5F00_46A78903.png" width="248" height="437" /></a><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/2744.image_6F6D3110.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2744.image_5F00_6F6D3110.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/68/22/metablogapi/7573.image_thumb_75BD88BB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7573.image_5F00_thumb_5F00_75BD88BB.png" width="657" height="428" /></a></p>  <p>随后我们需要设置我们应用的内容和名称，在首页中我们最多添加六个Section 我们可以针对这个六个Section进行编辑。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/1778.image_6C44089E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1778.image_5F00_6C44089E.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/68/22/metablogapi/7608.image_thumb_210BA0E0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7608.image_5F00_thumb_5F00_210BA0E0.png" width="897" height="473" /></a></p>  <p>App Studio 为我们提供了 7种基数页面数据源，如下 这里最常用的是 RSS、HTML、以及Bing。</p>  <p>RSS 可以用来展示一些 Blog，相关频道，的内容有些类似于RSS阅读器的功能，可以做一个RSS聚合器。</p>  <p>HTML比较灵活一些我们可以嵌入一些HTML的页面或代码来自定义里面的内容。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/8713.image_4418BFF8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8713.image_5F00_4418BFF8.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/68/22/metablogapi/0726.image_thumb_1EAECC8A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0726.image_5F00_thumb_5F00_1EAECC8A.png" width="653" height="112" /></a></p>  <p>此外还有两个高级功能的Section 分别是Menu 和 Collection。</p>  <p>首先说说 Menu 是一个自定义选项的页面除了可以添加上面7种基础页面的链接外还可以添加一个 MenuAction 这里包含了丰富的功能例如访问 Http/Https/FTP 的链接，调用系统功能打电话，地图导航，以及发邮件等功能。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/3817.image_551F7E8C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3817.image_5F00_551F7E8C.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/68/22/metablogapi/1033.image_thumb_0719AFC8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1033.image_5F00_thumb_5F00_0719AFC8.png" width="654" height="280" /></a></p>  <p>接着在说一下Collection，数据集合这里的数据集合可以分两种，静态数据集和动态数据集。所谓静态数据集合就是最终将我们显示的资源文件打包在应用程序中，用户需要一次性下载这些资源到手机中，好处是只要应用安装在手机上后不需要依赖网络流量就可以浏览这些资源。动态资源的意思是我们将展示资源上传到云端服务器中用户，需要网络访问这些远程资源，但是好处是我们可以随时动态调整这些内容而不用从新部署应用。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/6763.image_24225E90.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6763.image_5F00_24225E90.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/68/22/metablogapi/5810.image_thumb_561C8FCB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5810.image_5F00_thumb_5F00_561C8FCB.png" width="769" height="472" /></a></p>  <p>并且当我们在导入较多数据的时候 APP Studio 还支持 CSV 文件的导入，也就是使用分号（；）分割数据内容来自动填充数据内容。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/1055.image_0EC9CA8A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1055.image_5F00_0EC9CA8A.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/68/22/metablogapi/6201.image_thumb_77321D16.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6201.image_5F00_thumb_5F00_77321D16.png" width="786" height="213" /></a></p>  <p>当我们设置完成应用内容后我们可以选择下一步设置应用的主题。在这里我们可以选择应用使用默认的亮或者暗主题，更可以自定义应用的背景图，背景颜色，字体颜色，以及Application Bar的颜色。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/5164.image_4294518C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5164.image_5F00_4294518C.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/68/22/metablogapi/5543.image_thumb_7DC76BB0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5543.image_5F00_thumb_5F00_7DC76BB0.png" width="823" height="519" /></a></p>  <p>接着我们可以在Tile选项卡中设置我们应用的 Tile图标效果以及闪屏和锁屏界面。</p>  <p>Tile 图标其实就是我们的应用在手机上显示的应用图标这里可以有三种选择</p>  <p><span style="background-color: #ffff00">Flip Template</span> 这种图标有正反两面，系统会自动翻转他，我们可以在正反面都设置一张图片（或只设置正面），以及显示的文字。</p>  <p><span style="background-color: #ffff00">Cycle Template</span> 这种图标可以一直自动翻转，最多支持九张图片的轮换，当然我们也可以设置他的数据源。</p>  <p><span style="background-color: #ffff00">Iconic Template</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/68/22/metablogapi/8032.image_5140CC7B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8032.image_5F00_5140CC7B.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/68/22/metablogapi/6330.image_thumb_033AFDB7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6330.image_5F00_thumb_5F00_033AFDB7.png" width="842" height="546" /></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/68/22/metablogapi/4544.image_1AF7567F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4544.image_5F00_1AF7567F.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/68/22/metablogapi/1832.image_thumb_53385E48.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1832.image_5F00_thumb_5F00_53385E48.png" width="842" height="388" /></a></p>  <p>剩下的就是最好一步填写应用的发布信息（<span style="background-color: #ffff00">非常重要，如果我们想把应用上传到应用商店供小伙伴儿们下载使用这里一定要好好看</span>）</p>  <p>首先你要拥有一个Windows应用商店的开发者账号请登录 <a href="https://dev.windows.com">https://dev.windows.com</a> 注册成为 Windows Store App的开发者后登陆 仪表板 并且参考我之前的帖子 <a href="https://www.cnblogs.com/sonic1abc/p/3769679.html" target="_blank">Windows / Windows Phone 8.1 预留应用名称及应用上传</a> 注意这里先做到应用名称预留这一步。后面的步骤要等我们使用 App Studio 生成应用上传包以后继续完成。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/0714.image_05328F84.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0714.image_5F00_05328F84.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/68/22/metablogapi/1323.image_thumb_34F03803.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1323.image_5F00_thumb_5F00_34F03803.png" width="857" height="182" /></a></p>  <p>我们需要在账户的配置文件中找到 <span style="background-color: #ffff00">Publisher Display Name 和 Publisher ID 另外我们还需要一个隐私声明的链接这里要说明一下我们的应用不会收集或上传用户的资料信息（这个链接可以是自己的一个Blog地址，只要在公网上可以访问到就可以）。</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/68/22/metablogapi/1777.image_240B9413.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1777.image_5F00_240B9413.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/68/22/metablogapi/3223.image_thumb_5605C54E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3223.image_5F00_thumb_5F00_5605C54E.png" width="866" height="395" /></a></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/68/22/metablogapi/0027.image_559C230A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0027.image_5F00_559C230A.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/68/22/metablogapi/4263.image_thumb_771B5299.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4263.image_5F00_thumb_5F00_771B5299.png" width="205" height="197" /></a>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/7343.image_74752799.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7343.image_5F00_74752799.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/68/22/metablogapi/3173.image_thumb_2AE5D99C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3173.image_5F00_thumb_5F00_2AE5D99C.png" width="462" height="193" /></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/68/22/metablogapi/1778.image_5CE00AD7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1778.image_5F00_5CE00AD7.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/68/22/metablogapi/3056.image_thumb_5EB0609E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3056.image_5F00_thumb_5F00_5EB0609E.png" width="193" height="226" /></a>&#160; <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/68/22/metablogapi/7115.image_7BB90F66.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7115.image_5F00_7BB90F66.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/68/22/metablogapi/4760.image_thumb_58F7D7A9.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4760.image_5F00_thumb_5F00_58F7D7A9.png" width="853" height="188" /></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/68/22/metablogapi/8004.image_0D2E91A1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8004.image_5F00_0D2E91A1.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/68/22/metablogapi/4743.image_thumb_611194AF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4743.image_5F00_thumb_5F00_611194AF.png" width="420" height="143" /></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/68/22/metablogapi/2548.image_130BC5EB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2548.image_5F00_130BC5EB.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/68/22/metablogapi/7608.image_thumb_301474B3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7608.image_5F00_thumb_5F00_301474B3.png" width="423" height="445" /></a></p>  <p>随后我们保存并点击生成应用按钮 这里会弹出生成应用的对话框，问我们是要生成 Windows Universal App 8.1 （包括Windows 8.1 和 windows Phone 8.1 的安装包）或者是 Windows Phone 8.0 的应用。</p>  <p>注意：我们也可以生成 Windows Universal App 8.1 和 Windows Phone 8.0 的应用不过我们要生成两次，也就是说分开生成。 这里还有一点要特别强调的是要选择生成 安装包和<span style="background-color: #ffff00">发布包</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/68/22/metablogapi/8713.image_01BD7FB7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8713.image_5F00_01BD7FB7.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/68/22/metablogapi/6102.image_thumb_661B8471.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6102.image_5F00_thumb_5F00_661B8471.png" width="877" height="484" /></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/68/22/metablogapi/6562.image_5BE9EA04.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6562.image_5F00_5BE9EA04.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/68/22/metablogapi/2352.image_thumb_7FCF6F06.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2352.image_5F00_thumb_5F00_7FCF6F06.png" width="875" height="607" /></a></p>  <p>如果我们自需要在自己的手机上使用这个应用那么先用手机或者PC安装证书一个安装包即可使用，如果我们希望有更多的用户使用您的应用那么你需要下载 publish package 在应用商店中上传审核您的应用。</p>  <p>如果你具备一定的Code能力可以考虑下载 源码进行学习，当然也可以在源码的基础上进行修改编辑使得应用功能更多样丰富。现在的代码已经是 Windows Universal 了，大家赶快试试发布一个自己 Windows 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/68/22/metablogapi/5432.image_2440B0F1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5432.image_5F00_2440B0F1.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/68/22/metablogapi/2605.image_thumb_219A85F1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2605.image_5F00_thumb_5F00_219A85F1.png" width="406" height="443" /></a></p>  <p>希望上的总结可以帮助到大家, 同时欢迎大家在这里和我沟通交流或者在新浪微博上 <a href="https://www.weibo.com/wangvbo">@王博_Nick</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/express_for_uap_and_win10_dev/cortana-windows-phone-8-1-voice-command-natural-language-recognition</link>
      <pubDate>Fri, 14 Nov 2014 17:16:17 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/express_for_uap_and_win10_dev/2014/11/14/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/68/22/metablogapi/8030.Cortana1_68C73F17.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8030.Cortana1_5F00_68C73F17.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/68/22/metablogapi/7737.Cortana1_thumb_29493FED.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7737.Cortana1_5F00_thumb_5F00_29493FED.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/68/22/metablogapi/2781.Cortana2_5B23258E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2781.Cortana2_5F00_5B23258E.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/68/22/metablogapi/5340.Cortana2_thumb_5B9648EF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5340.Cortana2_5F00_thumb_5F00_5B9648EF.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/68/22/metablogapi/6562.image_781509D9.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6562.image_5F00_781509D9.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/68/22/metablogapi/6175.image_thumb_50077C1C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6175.image_5F00_thumb_5F00_50077C1C.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/68/22/metablogapi/8255.image_072DB7BE.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8255.image_5F00_072DB7BE.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/68/22/metablogapi/3515.image_thumb_76B546C2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3515.image_5F00_thumb_5F00_76B546C2.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/68/22/metablogapi/7343.image_76DC82C8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7343.image_5F00_76DC82C8.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/68/22/metablogapi/2018.image_thumb_5B3A8783.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2018.image_5F00_thumb_5F00_5B3A8783.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>Windows / Windows Phone 8.1 预留应用名称及应用上传</title>
      <link>https://docs.microsoft.com/archive/blogs/express_for_uap_and_win10_dev/windows-windows-phone-8-1</link>
      <pubDate>Fri, 14 Nov 2014 17:08:33 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/express_for_uap_and_win10_dev/2014/11/14/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>点击屏幕左侧的 <span style="background-color: #ffff00">提交应用</span> 按钮 会看到如下页面，和以前的 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/68/22/metablogapi/7418.image_6672EFBF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7418.image_5F00_6672EFBF.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/68/22/metablogapi/2063.image_thumb_7CC89504.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2063.image_5F00_thumb_5F00_7CC89504.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/68/22/metablogapi/7318.image_00694093.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7318.image_5F00_00694093.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/68/22/metablogapi/2402.image_thumb_18FB6E94.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2402.image_5F00_thumb_5F00_18FB6E94.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/68/22/metablogapi/6574.image_33CA2551.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6574.image_5F00_33CA2551.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/68/22/metablogapi/2728.image_thumb_30B7C75C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2728.image_5F00_thumb_5F00_30B7C75C.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/68/22/metablogapi/5808.image_77374815.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5808.image_5F00_77374815.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/68/22/metablogapi/6740.image_thumb_7FBAA75F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6740.image_5F00_thumb_5F00_7FBAA75F.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/68/22/metablogapi/3286.image_7831C8A3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3286.image_5F00_7831C8A3.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/68/22/metablogapi/1411.image_thumb_3072D06D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1411.image_5F00_thumb_5F00_3072D06D.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/68/22/metablogapi/8765.image_16A12AEF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8765.image_5F00_16A12AEF.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/68/22/metablogapi/6661.image_thumb_7F75B070.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6661.image_5F00_thumb_5F00_7F75B070.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/68/22/metablogapi/4477.image_316FE1AC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4477.image_5F00_316FE1AC.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/68/22/metablogapi/1185.image_thumb_4831B9E6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1185.image_5F00_thumb_5F00_4831B9E6.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/68/22/metablogapi/6332.image_32D6952F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6332.image_5F00_32D6952F.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/68/22/metablogapi/8546.image_thumb_5455C4BE.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8546.image_5F00_thumb_5F00_5455C4BE.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/68/22/metablogapi/7801.image_21884EFB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7801.image_5F00_21884EFB.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/68/22/metablogapi/1563.image_thumb_5C6F81C4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1563.image_5F00_thumb_5F00_5C6F81C4.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/68/22/metablogapi/4544.image_5C721275.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4544.image_5F00_5C721275.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/68/22/metablogapi/7217.image_thumb_77AA6B76.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7217.image_5F00_thumb_5F00_77AA6B76.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/68/22/metablogapi/1307.image_4DC9F741.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1307.image_5F00_4DC9F741.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/68/22/metablogapi/1667.image_thumb_3227FBFC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1667.image_5F00_thumb_5F00_3227FBFC.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/68/22/metablogapi/8055.image_3CE7E402.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8055.image_5F00_3CE7E402.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/68/22/metablogapi/8831.image_thumb_40F4C285.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8831.image_5F00_thumb_5F00_40F4C285.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/68/22/metablogapi/5153.image_7935CA4E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5153.image_5F00_7935CA4E.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/68/22/metablogapi/8322.image_thumb_619E1CDB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8322.image_5F00_thumb_5F00_619E1CDB.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/68/22/metablogapi/8360.image_0F21CD50.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8360.image_5F00_0F21CD50.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/68/22/metablogapi/8228.image_thumb_50BC099C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/8228.image_5F00_thumb_5F00_50BC099C.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/68/22/metablogapi/4863.image_0DDFC522.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4863.image_5F00_0DDFC522.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/68/22/metablogapi/7485.image_thumb_42167F19.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7485.image_5F00_thumb_5F00_42167F19.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/68/22/metablogapi/5344.image_21259D23.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5344.image_5F00_21259D23.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/68/22/metablogapi/0435.image_thumb_3BF1C32F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0435.image_5F00_thumb_5F00_3BF1C32F.png" width="533" height="509" /></a></p>    <p>屏幕截图非常重要，这个图片可以让用户最直接的了解您的应用，并且要和您的应用的支持分辨率进行对应。 这里建议可以在模拟器中截图或者真机截图都可以。</p>    <p><img alt="" 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>Windows Phone 8.1 开发技术概览 （Universal APP）</title>
      <link>https://docs.microsoft.com/archive/blogs/express_for_uap_and_win10_dev/windows-phone-8-1-universal-app</link>
      <pubDate>Fri, 14 Nov 2014 17:06:23 GMT</pubDate>
      <dc:creator><![CDATA[Nick.WangBo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/express_for_uap_and_win10_dev/2014/11/14/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/68/22/metablogapi/7380.image_55589779.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7380.image_5F00_55589779.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/68/22/metablogapi/0726.image_thumb_1B6BE53E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0726.image_5F00_thumb_5F00_1B6BE53E.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的内容提升是一个相当大的飞跃（<span style="background-color: #ffff00">从8.0 共享 27% 提升到了 8.1 共享 77%</span>）所以我们在开发的过程中可以非常方面的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/68/22/metablogapi/6521.image_020672B5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/6521.image_5F00_020672B5.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/68/22/metablogapi/7140.image_thumb_7F6047B4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7140.image_5F00_thumb_5F00_7F6047B4.png" width="815" height="318" /></a></p>  <p>接着我跟大家介绍一下 Windows Store Universal APP 在VS2013中升级 Update 2 安装WP 8.1 的开发环境后，我们会看到 Universal Apps 的模板（<span style="background-color: #ffff00">同样在 WinIS 和 C++ 中都有universal模板</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/68/22/metablogapi/2625.image_036D2638.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2625.image_5F00_036D2638.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/68/22/metablogapi/7357.image_thumb_5E0332C9.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7357.image_5F00_thumb_5F00_5E0332C9.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/68/22/metablogapi/2514.image_16B06D88.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/2514.image_5F00_16B06D88.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/68/22/metablogapi/3630.image_thumb_41F79540.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3630.image_5F00_thumb_5F00_41F79540.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 文件 这就意味着，<span style="background-color: #ffff00">WP的生命周期和 Win 8.1 一致了</span>,小伙伴们不用在处理墓碑化啦。（Silverlight 架构下还是有墓碑话的），并且我们在Share project 中的文件会<span style="background-color: #ffff00">自动分享</span>到 Win8.1 和 WP8.1中去 并且，在WP8.1 和Win 8.1 中有可以定义<span style="background-color: #ffff00">平台所特有的</span>内容。</p>  <p>并且universal APP 也支持 <span style="background-color: #ffff00">Windows Runtime Components</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/68/22/metablogapi/5460.image_0157D982.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5460.image_5F00_0157D982.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/68/22/metablogapi/7674.image_thumb_5E96A1C4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7674.image_5F00_thumb_5F00_5E96A1C4.png" width="417" height="582" /></a></p>  <p>另外在 Windows xaml 框架下我们可以我们提供了很多基础控件的 universal ，换句话说就是<span style="background-color: #ffff00">相同的控件运行在不同的平台上的效果不样</span>，例如： Hub ，AppBar/CommandBar，Date/Time Pickers and List Pickers，ListView，Multi-select; containers, swipe selection，Flyouts，Media。</p>  <p>当然还有<span style="background-color: #ffff00">完全相同</span>的，可以更容易的 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/68/22/metablogapi/7522.image_220133D8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/7522.image_5F00_220133D8.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/68/22/metablogapi/0647.image_thumb_1188C2DD.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0647.image_5F00_thumb_5F00_1188C2DD.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/68/22/metablogapi/3125.image_7C99D11A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3125.image_5F00_7C99D11A.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/68/22/metablogapi/1018.image_thumb_72D469A2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1018.image_5F00_thumb_5F00_72D469A2.png" width="726" height="353" /></a></p>  <p>&#160;</p>  <p>这里肯定有朋友想问我 按我以前开发的 8.0 silverlight 应用怎么办？可不可以升级到8.1呢？ 答案当然是肯定的！ <span style="background-color: #ffff00">可以升级到8.1</span>，但是要有一些问题要注意，我也在这里给大家介绍一下。</p>  <p>首先在WP silverlight 8.1 我们可以从 8.0 的应用直接升级上来，非常的方便，这里要注意的是有一些功能目前只有在 silverlight 框架下可以使用， 在 Windows Xaml 中暂时没有的：</p>  <p>也就是说如果你的应用在8.0中使用了一下功能，<span style="background-color: #ffff00">并且你想在8.1中继续使用，那么你一定是用 silverlight 这套框架。</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/68/22/metablogapi/4670.image_44E9A79B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4670.image_5F00_44E9A79B.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/68/22/metablogapi/5040.image_thumb_625E8958.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/5040.image_5F00_thumb_5F00_625E8958.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 不在支持，<span style="background-color: #ffff00">在8.1中需要您从写成 background task</span></p>  <p><span style="background-color: #ffffff">Continuous background execution agent 也不再支持, </span><span style="background-color: #ffff00">同样也需要使用 background task 代替</span></p>  <p><span style="background-color: #ffffff">实现方法请参考 <a href="https://www.cnblogs.com/sonic1abc/p/3640753.html" target="_blank">Windows 8.1 应用开发后台任务概述（Windows XAML）</a></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/68/22/metablogapi/0842.image_736547EC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/0842.image_5F00_736547EC.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/68/22/metablogapi/1616.image_thumb_2A422CE4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/1616.image_5F00_thumb_5F00_2A422CE4.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/68/22/metablogapi/4370.image_207CC56C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/4370.image_5F00_207CC56C.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/68/22/metablogapi/3348.image_thumb_5DA080F1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-68-22-metablogapi/3348.image_5F00_thumb_5F00_5DA080F1.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>
  </channel>
</rss>