<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Blog do desenvolvedor de aplicativos do Windows 8</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/windowsappdev_br/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/feed.xml</link>
    <description>Ideias sobre a criação de aplicativos com o estilo Metro para o Windows 8, da equipe de engenharia do Windows 8</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:28:41 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Tudo sobre promessas (para aplicativos da Windows Store escritos em JavaScript).</title>
      <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/tudo-sobre-promessas-para-aplicativos-da-windows-store-escritos-em-javascript</link>
      <pubDate>Wed, 26 Jun 2013 15:55:14 GMT</pubDate>
      <dc:creator><![CDATA[Windows 8 Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windowsappdev_br/2013/06/26/tudo-sobre-promessas-para-aplicativos-da-windows-store-escritos-em-javascript/</guid>
      <description><![CDATA[Ao imprimir aplicativos da Windows Store no JavaScript, você encontra construções chamadas de...]]></description>
      <content:encoded><![CDATA[<div class="PostContent"> <p>Ao imprimir aplicativos da Windows Store no JavaScript, você encontra construções chamadas de <i><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/Hh700339.aspx">promessas</a> </i>assim que você faz algo que envolva uma API assíncrona. E também não leva muito tempo para que cadeias de promessa de gravação para operações assíncronas sequenciais se tornem algo como uma segunda pele.</p>  <p>No entanto, durante seu trabalho de desenvolvimento, você provavelmente encontrará outros usos de promessas em que não ficará totalmente claro o que está acontecendo. Um bom exemplo disso é a otimização de funções de renderização de item para o controle de um ListView como mostrado na <a href="http://code.msdn.microsoft.com/windowsapps/ListView-performance-39fb71f0">amostra de desempenho de otimização do ListView em HTML</a>. Exploraremos isso em uma postagem subsequente. Ou considere essa joia que Josh Williams mostrou em sua palestra <a href="https://channel9.msdn.com/Events/Build/2012/4-101">Deep Dive into WinJS</a> em //build 2012 (ligeiramente modificada):</p>  <blockquote>   <div id="codeSnippetWrapper">     <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">list.reduce(<span style="color: rgb(0, 0, 255);">function</span> callback (prev, item, i) {<br />    <span style="color: rgb(0, 0, 255);">var</span> result = doOperationAsync(item);<br />    <span style="color: rgb(0, 0, 255);">return</span> WinJS.Promise.join({ prev: prev, result: result}).then(<span style="color: rgb(0, 0, 255);">function</span> (v) {<br />        console.log(i + <span style="color: rgb(0, 96, 128);">&quot;, item: &quot;</span> + item+ <span style="color: rgb(0, 96, 128);">&quot;, &quot;</span> + v.result);<br />    });<br />})<br /></pre>
  </div>
</blockquote>

<p>Este trecho reúne as promessas de operações assíncronas paralelas e fornece seus resultados sequencialmente, de acordo com a ordem na <i>lista</i>. Se você puder olhar para esse código e entender imediatamente sua função, fique à vontade para ignorar esta postagem! Caso contrário, vamos observar melhor o funcionamento de promessas e sua expressão no WinJS (a Biblioteca do Windows para JavaScript) para que possamos compreender esses tipos de padrão.</p>

<h2>O que é uma promessa? Os relacionamentos entre promessas</h2>

<p>Vamos começar por uma verdade fundamental: uma promessa nada mais é do que uma construção de código ou, se você achar melhor, uma convenção de chamadas de função. Como tal, as promessas não têm relacionamentos inerentes com as operações assíncronas, elas só são muito <i>úteis </i>nesse aspecto! Uma promessa é simplesmente um objeto que representa um valor que pode estar disponível em algum momento no futuro, se já não estiver. Dessa forma, uma promessa tem o mesmo significado do uso da palavra em relacionamentos humanos. Se eu disser, “Prometo te dar uma dúzia de donuts”, com certeza não preciso ter esses donuts no momento, mas certamente suponho que <i>terei </i>em algum momento no futuro. E quando tiver, vou te dar.</p>

<p>Portanto, uma promessa indica um relacionamento entre dois agentes: a <i>origem</i> que faz a promessa de fornecer algumas mercadorias e o <i>consumidor, </i>que é o destinatário dessa promessa e das mercadorias. A maneira como obterá essas mercadorias é de responsabilidade da origem. Da mesma maneira, o consumidor pode fazer o que quiser com a própria promessa e as mercadorias fornecidas. Ele pode até compartilhar a promessa com outros consumidores.</p>

<p>Entre a origem e o consumidor também há dois estágios desse relacionamento: <i>criação</i> e <i>cumprimento</i>. Tudo isso é mostrado no diagrama a seguir.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/0844.promise_diagram_577C7B9B.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0844.promise_5F00_diagram_5F00_577C7B9B.png"><img title="promise_diagram" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="promise_diagram" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/0458.promise_diagram_thumb_0FBAF2B4.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0458.promise_5F00_diagram_5F00_thumb_5F00_0FBAF2B4.png" width="700" height="341" /></a></p>

<p>Esses dois estágios do relacionamento são o motivo pelo qual as promessas funcionam bem com o fornecimento assíncrono, como podemos ver se seguirmos o fluxo do diagrama. A parte principal é que uma vez que o consumidor obtiver a confirmação da solicitação, a promessa, ele poderá seguir sua vida (de forma assíncrona) em vez de esperar (de forma síncrona). Isso significa que o consumidor pode realizar outras tarefas enquanto espera a promessa ser cumprida, como responder a outras solicitações, que é o principal objetivo das APIs assíncronas. E se as mercadorias já estiverem disponíveis? Então a promessa será imediatamente cumprida, fazendo com que todo o processo se torne um tipo de convenção de chamadas de função.</p>

<p>Obviamente, esse relacionamento é composto por outros elementos que devemos considerar. Com certeza você já fez promessas na sua vida e já fizeram promessas para você também. Embora muitas dessas promessas tenham sido cumpridas, a realidade é que muitas promessas não são. É possível que o entregador de pizza sofra um acidente no caminho para a sua casa! Promessas que não são cumpridas são mais um fato da vida e temos que aceitar isso em nossas vidas pessoais e de programação assíncrona.</p>

<p>No relacionamento de promessas, portanto, isso significa que a origem precisa de uma forma de dizer “desculpe, mas não vou conseguir cumprir essa promessa” e o cliente precisa de uma maneira de saber quando esse for o caso. Em segundo lugar, como consumidores podemos, às vezes, ser um pouco impacientes com promessas feitas para nós. Portanto, se a origem puder controlar seu progresso no cumprimento da promessa, o consumidor também precisará de uma maneira de receber essas informações. Em terceiro lugar, o consumidor também pode cancelar o pedido e dizer para a origem que não precisa mais da mercadoria.</p>

<p>Adicionando esses requisitos ao diagrama, podemos ver o relacionamento completo:</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/4251.promise_diagram_2_23D40F3D.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/4251.promise_5F00_diagram_5F00_2_5F00_23D40F3D.png"><img title="promise_diagram_2" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="promise_diagram_2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/0550.promise_diagram_2_thumb_1CB4D2C5.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0550.promise_5F00_diagram_5F00_2_5F00_thumb_5F00_1CB4D2C5.png" width="700" height="432" /></a></p>

<p>Vamos ver como esses relacionamentos são manifestados em códigos.</p>

<h2>A construção da promessa e cadeias de promessa</h2>

<p>Na verdade, existem várias propostas ou especificações diferentes para promessas. As usadas no Windows e WinJS são chamadas de <a href="http://wiki.commonjs.org/wiki/Promises/A">Common JS/Promessas A</a>, que dizem que uma promessa (o que é retornado por uma origem para representar um valor a ser fornecido no futuro) é um objeto com uma função chamada de <b>then</b>. Os consumidores se inscrevem para o cumprimento da promessa chamando <b>then</b>. (As promessas no Windows também dão suporte a uma função similar chamada de <b>done</b> usada em cadeias de promessas, como veremos em breve.)</p>

<p>Para essa função, o consumidor passa até três funções opcionais como argumentos, nesta ordem:</p>

<ol>
  <li>Um <i>manipulador completo</i>. A origem chama esta função quando o valor da promessa está disponível e se esse valor já <i>estiver </i>disponível, o manipulador completo será chamado imediatamente (sincronamente) de dentro da função <b>then</b>.</li>

  <li>Um <i>manipulador de erros</i> opcional chamado em caso de falhas para adquirir o valor prometido. Para qualquer promessa, o manipulador completo nunca será chamado se o manipulador de erros tiver sido chamado.</li>

  <li>Um <i>manipulador de progresso</i> opcional chamado periodicamente com resultados intermediários, se a operação der suporte. (No WinRT, isso significa que a API tem um valor de retorno de <b>IAsync[Action | Operation]WithProgress</b>; aquelas com <b>IAsync[Action | Operation]</b> são diferentes.)</li>
</ol>

<p>Observe que você pode passar como <i>nulo</i> para qualquer um desses argumentos, como quando você quiser anexar somente um manipulador de erros e não um manipulador completo. </p>

<p>Em outro aspecto do relacionamento, um consumidor pode inscrever quantos manipuladores quiser para a mesma promessa chamando <b>then</b> várias vezes. Ele também pode compartilhar a promessa com outros consumidores que também podem chamar <b>then</b> quando quiserem. Isso é totalmente permitido.</p>

<p>Isso significa que uma promessa precisa gerenciar listas dos manipuladores recebidos e invocá-los nos momentos apropriados. As promessas também precisam permitir o cancelamento, como descrito no relacionamento completo.</p>

<p>O outro requisito da especificação <i>Promessas A</i> é que o próprio método <b>then</b> retorna uma promessa. A segunda promessa é cumprida quando o manipulador completo dado para o primeiro <b>promise.then</b> é retornado, com o valor de retorno fornecido como resultado dessa segunda promessa. Considere este trecho do código:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> promise1 = someOperationAsync();<br /><span style="color: rgb(0, 0, 255);">var</span> promise2 = promise1.then(<span style="color: rgb(0, 0, 255);">function</span> completedHandler1 (result1) { <span style="color: rgb(0, 0, 255);">return</span> 7103; } );<br />promise2.then(<span style="color: rgb(0, 0, 255);">function</span> completedHandler2 (result2) { });<br /></pre>
  </div>
</blockquote>

<p>A cadeia de execução aqui é o início de <b>someOperationAsync</b>, retornando a <i>promise1</i>. Enquanto a operação estiver em andamento, chamaremos a <b>promise1.then</b>, que retornará a <i>promise2</i> imediatamente. Esteja ciente de que o <b>completedHandler1</b> não será chamado a menos que o resultado da operação assíncrona já esteja disponível. Vamos supor que ainda estamos esperando, então seguimos diretamente para a chamada da <b>promise2.then</b> e, novamente, o completedHandler2 <i>não </i>será chamado nesse momento.</p>

<p>Algum tempo depois, a <b>someOperationAsync</b> será concluída com um valor de, digamos, 14618. A <i>promise1 </i>já foi cumprida, portanto, chamará o <b>completedHandler1</b> com esse valor, de forma que o <i>result1</i> seja 14618. Agora, o <b>completedHandler1</b> será executado, retornando o valor 7103. Neste momento, a <i>promise2 </i>é cumprida, portanto, chama o <b>completedHandler2</b> com <i>result2 </i>equivalente a 7103.</p>

<p>E se um manipulador completo retornar outra promessa? Esse caso é resolvido de forma diferente. Digamos que o <b>completedHandler1</b> do código acima retorne esta promessa:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> promise2 = promise1.then(<span style="color: rgb(0, 0, 255);">function</span> completedHandler1 (result1) {<br />    <span style="color: rgb(0, 0, 255);">var</span> promise2a = anotherOperationAsync();<br />    <span style="color: rgb(0, 0, 255);">return</span> promise2a;<br />});<br /></pre>
  </div>
</blockquote>

<p>Nesse caso, o <i>result2 </i>no <b>completedHandler2 </b>não será a própria <i>promise2a</i>, mas o valor de <u>cumprimento</u> da <i>promise2a</i>. Ou seja, como o manipulador completo retorna uma promessa, a <i>promise2</i> como retornada da <b>promise1.then</b>, será cumprida com os resultados da <i>promise2a</i>.</p>

<p>Essa característica é exatamente o que torna possível o encadeamento de operações assíncronas sequenciais, em que os resultados de cada operação na cadeia é alimentado na próxima. Sem variáveis intermediárias ou manipuladores nomeados, normalmente, você encontra esse padrão para cadeias de promessas:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">operation1().then(<span style="color: rgb(0, 0, 255);">function</span> (result1) {<br />    <span style="color: rgb(0, 0, 255);">return</span> operation2(result1)<br />}).then(<span style="color: rgb(0, 0, 255);">function</span> (result2) {<br />    <span style="color: rgb(0, 0, 255);">return</span> operation3(result2);<br />}).then(<span style="color: rgb(0, 0, 255);">function</span> (result3) {<br />    <span style="color: rgb(0, 0, 255);">return</span> operation4(result3);<br />}).then(<span style="color: rgb(0, 0, 255);">function</span> (result4) {<br />    <span style="color: rgb(0, 0, 255);">return</span> operation5(result4)<br />}).then(<span style="color: rgb(0, 0, 255);">function</span> (result5) {<br />    <span style="color: rgb(0, 128, 0);">//And so on</span><br />});<br /></pre>
  </div>
</blockquote>

<p>Cada manipulador completo, claro, provavelmente fará mais com os resultados recebidos, mas essa estrutura principal é comum a todas as cadeias. O que também acontece é que todos os métodos <b>then</b> aqui são executados em sequência, já que tudo que estão fazendo é economizar o manipulador completo e retornar outra promessa. Portanto, até chegarmos ao final desse código, somente a <i>operation1 </i>terá sido iniciada e nenhum manipulador completo terá sido chamado. Mas várias promessas intermediárias de todas as chamadas <b>then</b> foram criadas e ligadas umas as outras para gerenciar a cadeia como o progresso de operações sequenciais.</p>

<p>Vale a pena observar que a mesma sequência pode ser obtida pelo aninhamento de cada operação subsequente dentro do manipulador completo. Nesse caso, você não terá todas as declarações de <i>returno</i>. No entanto, esses aninhamentos se tornam um pesadelo de recuo, principalmente se você começar a adicionar manipuladores de progresso e erros a cada chamada para <b>then</b>.</p>

<p>Falando nisso, um dos recursos das promessas no WinJS é que os erros que ocorrem em qualquer parte da cadeia são automaticamente para o final da cadeia. Isso significa que você pode simplesmente anexar um único manipulador de erros na última chamada para <b>then</b> em vez de ter manipuladores em todos os níveis. O problema, no entanto, é que por vários motivos sutis, esses erros são engolidos se o último link na cadeia for uma chamada para <b>then</b>. Por isso, o WinJS fornece um método <b>done</b> nas promessas. Este método aceita os mesmos argumentos de <b>then</b>, mas indica que a cadeia está completa (ele retorna <i>indefinido </i>em vez de outra promessa). Qualquer manipulador de erros anexado ao <b>done</b> será chamado em caso de erros em toda a cadeia. Além disso, sem um manipulador de erros, o <b>done</b> enviará uma exceção para o nível do aplicativo, onde poderá ser manipulado pelo <b>window.onerror</b> de eventos <b>WinJS.Application.onerror</b>. Resumindo, todas as cadeiras deveriam terminar, idealmente, em <b>done</b> para garantir que exceções sejam exibidas e manipuladas corretamente.</p>

<p>É claro que se você escrever uma função com <i>objetivo</i> de retornar a última promessa de uma longa cadeia de chamadas <b>then</b>, você ainda usará <b>then </b>ao final: a responsabilidade de manipulação de erros, então, pertence ao chamados que pode usar essa promessa em outra cadeia totalmente diferente.</p>

<h2>Criação de promessas: a classe WinJS.Promise</h2>

<p>Embora você sempre possa criar suas próprias cadeias de promessa com base na especificação <i>Promessas A</i>, na verdade, isso é muito trabalhoso e pode ser realizado melhor por uma biblioteca. Por isso, o WinJS fornece uma classe de promessas eficiente, bem testadas e flexíveis chamada de <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211867.aspx"><b>WinJS.Promise</b></a>. Isso permite que você crie facilmente promessas com base em valores e operações diferentes sem precisar gerenciar os detalhes dos relacionamentos de origem/consumidor ou o comportamento de <b>then</b>.</p>

<p>Quando necessário, você pode (e deve) usar <b>o novo WinJS.Promise</b>, ou uma função de ajuda adequada, como observado na próxima seção, para criar promessas com base em operações e valores existentes (síncronos) da mesma maneira. Lembre-se de que uma promessa é apenas uma construção de código: não há requisitos que exijam que uma promessa tenha que englobar uma operação assíncrona ou <i>qualquer outro aspecto</i> assíncrono. Da mesma maneira, o simples ato de englobar alguma parte de código em uma promessa não faz com que ele <i>seja </i>executado assincronamente<i>. </i>Você ainda precisa fazer esse trabalho.</p>

<p>Como um exemplo simples do uso direto de <b>WinJS.Promise</b>, digamos que queremos executar uma longa computação (adição de vários números de um para algum valor máximo), mas de forma assíncrona. Poderíamos inventar nosso próprio mecanismo de retorno de chamada para essa rotina, mas se englobarmos isso dentro de uma promessa, permitiremos que ela seja encadeada ou combinada a outras promessas de outras APIs. (Parecido com isso, a função <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br229787.aspx"><b>WinJS.xhr</b></a> engloba a <b>XmlHttpRequest</b> assíncrona do JavaScript dentro de uma promessa para que você não precise lidar com a estrutura de eventos dela.)</p>

<p>Também podemos usar um trabalho do JavaScript para uma computação longa, é claro, mas devido à ilustração, vamos mantê-lo no thread da interface e usar o <b>setImmediate</b> para dividir a operação em etapas. Veja como podemos implementá-lo em uma estrutura de promessas usando <b>WinJS.Promise</b>:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">function</span> calculateIntegerSum(max, step) {<br />    <span style="color: rgb(0, 128, 0);">//The WinJS.Promise constructor's argument is an initializer function that receives </span><br />    <span style="color: rgb(0, 128, 0);">//dispatchers for completed, error, and progress cases.</span><br />    <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 255);">new</span> WinJS.Promise(<span style="color: rgb(0, 0, 255);">function</span> (completeDispatch, errorDispatch, progressDispatch) {<br />        <span style="color: rgb(0, 0, 255);">var</span> sum = 0;<br /><br />        <span style="color: rgb(0, 0, 255);">function</span> iterate(args) {<br />            <span style="color: rgb(0, 0, 255);">for</span> (<span style="color: rgb(0, 0, 255);">var</span> i = args.start; i &lt; args.end; i++) {<br />                sum += i;<br />            };<br /><br />            <span style="color: rgb(0, 0, 255);">if</span> (i &gt;= max) {<br />                <span style="color: rgb(0, 128, 0);">//Complete--dispatch results to completed handlers</span><br />                completeDispatch(sum);<br />            } <span style="color: rgb(0, 0, 255);">else</span> {<br />                <span style="color: rgb(0, 128, 0);">//Dispatch intermediate results to progress handlers</span><br />                progressDispatch(sum);<br />                setImmediate(iterate, { start: args.end, end: Math.min(args.end + step, max) });<br />            }<br />        }<br />            <br />        setImmediate(iterate, { start: 0, end: Math.min(step, max) });<br />    });<br />}<br /></pre>
  </div>
</blockquote>

<p>Ao chamar o <b>novo WinJS.Promise</b>, o único argumento para sua construção em uma função de <i>inicializador</i> (nesse caso, anônimo). O inicializador encapsula a operação a ser executada, mas esteja ciente de que esta função sozinha é executada <i>de forma síncrona </i>no thread de interface. Então se executarmos um longo cálculo aqui sem usar o <b>setImmediate,</b> bloquearíamos o thread de interface para todo esse tempo. Novamente, a colocação de um código dentro de uma promessa não<i> </i>faz com que ela seja automaticamente síncrona, a função de inicializador precisa configurar isso.</p>

<p>Para argumentos, a função de inicializador recebe três <i>distribuidores</i> para os casos completos, de erro e progresso que recebem suporte das promessas. Como você pode ver, chamamos esses distribuidores em momentos apropriados durante a operação com os argumentos apropriados.</p>

<p>Chamo eles de “distribuidores” de função, porque eles não são iguais aos manipuladores que os consumidores inscrevem no método <b>then</b> da promessa (ou <b>done</b>, mas já falei sobre isso). Nos bastidores, o WinJS está gerenciando matrizes desses manipuladores, que é o que permite que qualquer número de consumidores se inscreva em qualquer número de manipuladores. Quando você invoca um desses distribuidores, o WinJS reitera por meio de sua lista interna e invoca todos esses manipuladores em seu nome. O <b>WinJS.Promise</b> também garante que seu <b>then</b> retorne outra promessa, como exigido para o encadeamento.</p>

<p>Resumindo, o <b>WinJS.Promise</b> fornece todos os detalhes ao redor de uma promessa. Isso permite que você se concentre na operação principal representada pela promessa, que é incorporada na função do inicializador.</p>

<h2>Ajuda na criação de promessas</h2>

<p>A função principal da ajuda para criar uma promessa é o método estático <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211664.aspx"><b>WinJS.Promise.as</b></a>, que engloba <i>qualquer</i> valor em uma promessa. Esse wrapper em um valor já existente simplesmente volta ao início e chama qualquer manipulador completo para <b>then</b>. Especificamente, isso permite que você trate valores conhecidos arbitrários como promessas de tal forma que você possa fazer misturas e composições (juntando ou encadeando) com outras promessas. Usando <b>da mesma forma</b> que uma promessa existente apenas retorna essa promessa.</p>

<p>A outra função de ajuda estática é <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br229729.aspx"><b>WinJS.Promise.timeout</b></a>, que fornece um wrapper conveniente com base em <b>setTimeout</b> e <b>setImmediate</b>. Você também pode criar uma promessa que cancele uma segunda promessa se essa segunda não tiver sido cumprida em um determinado número de milissegundos.</p>

<p>Observe que as promessas <b>tempo de espera</b> com base em <b>setTimeout</b> e <b>setImmediate</b> são cumpridas com <i>indefinido</i>. Uma pergunta comum é “como elas podem ser usadas para fornecer um resultado diferente após o tempo de espera?” A resposta usa o fato de que <b>then</b> retorna outra promessa cumprida com o valor de retorno do manipulador completo. Esta linha de código, por exemplo:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> p = WinJS.Promise.timeout(1000).then(<span style="color: rgb(0, 0, 255);">function</span> () { <span style="color: rgb(0, 0, 255);">return</span> 12345; });</pre>
  </div>
</blockquote>

<p>cria a promessa <i>p</i> que será cumprida com o valor 12345 depois de um segundo. Em outras palavras, <b>WinJS.Promise.timeout(…).then(function () { return &lt;value>} )</b> é um padrão para fornecer <i>&lt;value></i> após o determinado tempo de espera. E se o próprio <i>&lt;value></i> for outra promessa, isso significa fornecer o valor de cumprimento dessa promessa em algum momento após o tempo de espera.</p>

<h2>Cancelamento e geração de erros de promessa</h2>

<p>No código que acabamos de ver, você deve ter percebido duas deficiências. A primeira é que não há como cancelar a operação depois que ela é iniciada. A segunda é que não fazemos um trabalho muito bom lidando com erros.</p>

<p>O truque nesses dois casos são funções de produção de promessa, como a função <b>calculateIntegerSum</b> que deve sempre retornar uma promessa. Se uma operação não for concluída ou não for iniciada em primeiro lugar, essa promessa fica no que chamamos de <i>estado de erro</i>. Isso significa que a promessa não tem e nunca <i>terá</i> um resultado que possa passar para qualquer manipulador completo: só sempre chamará seus manipuladores de erros. De fato, se um consumidor chamar <b>then</b> em uma promessa, que já está no estado de erro, a promessa invocará imediatamente (de forma síncrona) o manipulador de erro fornecido para <b>then</b>.</p>

<p>Um <b>WinJS.Promise</b> insere o estado de erro por dois motivos: o consumidor chama seu método <b>cancelar</b> ou o código na função de inicializador chama o distribuidor de erros. Quando isso acontece, os manipuladores de erro recebem qualquer valor de erro que tenha sido pego ou propagado na promessa. Se você estiver criando uma operação em uma <b>WinJS.Promise</b>, também pode usar uma instância de <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211689.aspx"><b>WinJS.ErrorFromName</b></a>. Esse é apenas um objeto do JavaScript que contém uma propriedade <i>name</i> que identifica o erro e uma propriedade <i>message</i> com mais informações. Por exemplo, quando uma promessa é cancelada, os manipuladores de erros recebem um objeto de erro com nome <i>name</i> e <i>message</i> configurado para “Cancelado”.</p>

<p>Mas e se você não conseguir nem iniciar a operação? Por exemplo, se você chamar <b>calculateIntegerSum</b> com argumentos ruins (como 0, 0), ele não deve nem tentar iniciar a contagem e, em vez disso, deve retornar a promessa no estado de erro. Esse é o objetivo do método estático <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br229784.aspx"><b>WinJS.Promise.wrapError</b></a>. Isso exige uma instância de <b>WinJS.ErrorFromName</b> e retorna uma promessa no estado de erro, que retornaríamos nesse caso, em vez de uma nova instância <b>WinJS.Promise</b>.</p>

<p>O outro lado disso tudo é que embora uma chamada para o método <b>cancelar</b> da promessa coloque-a no estado de erro, como interrompemos a operação assíncrona que está em andamento? Na implementação de <b>calculateIntegerSum</b> anterior, ele continuará chamando <b>setImmediate</b> até que a operação seja concluída, independentemente do estado da promessa criada. Na verdade, se a operação chamar o distribuidor completo depois que a promessa tiver sido cancelada, ela ignorará essa conclusão.</p>

<p>O necessário, então, é uma maneira de a promessa dizer para a operação que não precisa mais continuar seu trabalho. Por isso, a construção <b>WinJS.Promise</b> precisa de um segundo argumento de função que será chamado se a promessa for cancelada. Nesse exemplo, uma chamada para essa função precisaria evitar a próxima chamada para <b>setImmediate</b>, interrompendo a computação. Veja como isso ocorre, juntamente com a manipulação de erro adequada:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">function</span> calculateIntegerSum(max, step) {<br />    <span style="color: rgb(0, 128, 0);">//Return a promise in the error state for bad arguments</span><br />    <span style="color: rgb(0, 0, 255);">if</span> (max &lt; 1 || step &lt; 1) {<br />        <span style="color: rgb(0, 0, 255);">var</span> err = <span style="color: rgb(0, 0, 255);">new</span> WinJS.ErrorFromName(<span style="color: rgb(0, 96, 128);">&quot;calculateIntegerSum&quot;</span>, <span style="color: rgb(0, 96, 128);">&quot;max and step must be 1 or greater&quot;</span>);<br />        <span style="color: rgb(0, 0, 255);">return</span> WinJS.Promise.wrapError(err);<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">var</span> _cancel = <span style="color: rgb(0, 0, 255);">false</span>;<br /><br />    <span style="color: rgb(0, 128, 0);">//The WinJS.Promise constructor's argument is an initializer function that receives </span><br />    <span style="color: rgb(0, 128, 0);">//dispatchers for completed, error, and progress cases.</span><br />    <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 255);">new</span> WinJS.Promise(<span style="color: rgb(0, 0, 255);">function</span> (completeDispatch, errorDispatch, progressDispatch) {<br />        <span style="color: rgb(0, 0, 255);">var</span> sum = 0;<br /><br />        <span style="color: rgb(0, 0, 255);">function</span> iterate(args) {<br />            <span style="color: rgb(0, 0, 255);">for</span> (<span style="color: rgb(0, 0, 255);">var</span> i = args.start; i &lt; args.end; i++) {<br />                sum += i;<br />            };<br /><br />            <span style="color: rgb(0, 128, 0);">//If for some reason there was an error, create the error with WinJS.ErrorFromName</span><br />            <span style="color: rgb(0, 128, 0);">//and pass to errorDispatch</span><br />            <span style="color: rgb(0, 0, 255);">if</span> (<span style="color: rgb(0, 0, 255);">false</span> <span style="color: rgb(0, 128, 0);">/* replace with any necessary error check -- we don’t have any here */</span>) {<br />                errorDispatch(<span style="color: rgb(0, 0, 255);">new</span> WinJS.ErrorFromName(<span style="color: rgb(0, 96, 128);">&quot;calculateIntegerSum (scenario 7)&quot;</span>, <span style="color: rgb(0, 96, 128);">&quot;error occurred&quot;</span>));<br />            }<br /><br />            <span style="color: rgb(0, 0, 255);">if</span> (i &gt;= max) {<br />                <span style="color: rgb(0, 128, 0);">//Complete--dispatch results to completed handlers</span><br />                completeDispatch(sum); <br />            } <span style="color: rgb(0, 0, 255);">else</span> {<br />                <span style="color: rgb(0, 128, 0);">//Dispatch intermediate results to progress handlers</span><br />                progressDispatch(sum);<br /><br />                <span style="color: rgb(0, 128, 0);">//Interrupt the operation if canceled</span><br />                <span style="color: rgb(0, 0, 255);">if</span> (!_cancel) {<br />                    setImmediate(iterate, { start: args.end, end: Math.min(args.end + step, max) });<br />                }<br />            }<br />        }<br />            <br />        setImmediate(iterate, { start: 0, end: Math.min(step, max) });<br />    },<br />    <span style="color: rgb(0, 128, 0);">//Cancellation function for the WinJS.Promise constructor</span><br />    <span style="color: rgb(0, 0, 255);">function</span> () {<br />        _cancel = <span style="color: rgb(0, 0, 255);">true</span>;<br />    });<br />}<br /></pre>
  </div>
</blockquote>

<p>De forma geral, a criação de instâncias de <b>WinJS.Promise</b> tem muitas utilidades. Por exemplo, se você tiver uma biblioteca que interaja com um serviço da Web por meio de outro método assíncrono, você pode englobar essas operações dentro de promessas. Você também pode usar uma nova promessa para combinar várias operações assíncronas (ou outras promessas!) de fontes diferentes em uma única promessa onde você queira controlar todos os relacionamentos envolvidos. Dentro do código de um inicializador de <b>WinJS.Promise</b>, você pode ter seus próprios manipuladores para outras operações assíncronas e suas promessas. Você pode usá-los para encapsular mecanismos de nova tentativa automáticos para tempos de espera e rede e afins, depender de uma interface de atualizador de progresso genérico ou adicionar registros ou análises dos bastidores. De todas essas formas, o resto do código nunca precisa saber os detalhes e pode lidar apenas com promessas do lado do cliente.</p>

<p>Parecido com isso, é relativamente direto encapsular um trabalho do JavaScript em uma promessa de forma que ela tenha a aparência e se comporte como outras operações assíncronas no WinRT. Os trabalhos, como você deve saber, fornecem seus resultados por meio de uma chamada de <b>postMessage</b> que cria um evento <b>message</b> no objeto de trabalho do aplicativo. Portanto, o código a seguir vincula esse evento a uma promessa que será cumprida com os resultados fornecidos nessa mensagem:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 128, 0);">// This is the function variable we're wiring up.</span><br /><span style="color: rgb(0, 0, 255);">var</span> workerCompleteDispatch = <span style="color: rgb(0, 0, 255);">null</span>;<br /><br /><span style="color: rgb(0, 0, 255);">var</span> promiseJS = <span style="color: rgb(0, 0, 255);">new</span> WinJS.Promise(<span style="color: rgb(0, 0, 255);">function</span> (completeDispatch, errorDispatch, progressDispatch) {<br />    workerCompleteDispatch = completeDispatch;<br />});<br /><br /><span style="color: rgb(0, 128, 0);">// Worker is created here and stored in the 'worker' variable</span><br /><br /><span style="color: rgb(0, 128, 0);">// Listen for worker events</span><br />worker.onmessage = <span style="color: rgb(0, 0, 255);">function</span> (e) {<br />    <span style="color: rgb(0, 0, 255);">if</span> (workerCompleteDispatch != <span style="color: rgb(0, 0, 255);">null</span>) {<br />        workerCompleteDispatch(e.data.results); <span style="color: rgb(0, 128, 0);">/* event args depends on the worker */</span><br />    }<br />}<br /><br />promiseJS.done(<span style="color: rgb(0, 0, 255);">function</span> (result) {<br />    <span style="color: rgb(0, 128, 0);">// Output for JS worker</span><br />});<br /></pre>
  </div>
</blockquote>

<p>Para expandir esse código para lidar com erros do trabalho, você precisaria salvar o distribuidor do erro em outra variável, fazer com que o manipulador de eventos da <b>mensagem</b> busque por informações do erro em seus argumentos de evento e chamar o distribuidor de erros em vez do distribuidor completo, como seria apropriado.</p>

<h2>Combinação de promessas paralelas</h2>

<p>Como as promessas normalmente são usadas para englobar operações assíncronas, é totalmente possível ter várias operações ocorrendo em paralelo. Nesses casos, talvez você queira saber quando um grupo ou uma promessa é cumprida ou quando todas as promessas no grupo são cumpridas. As funções estáticas <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br229660.aspx"><b>WinJS.Promise.any</b></a> e <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211774.aspx"><b>WinJS.Promise.join</b></a> fornecem isso.</p>

<p>Ambas as funções aceitam uma variedade de valores ou um objeto com propriedades de valores. Esses valores podem ser promessas, e todos os valores que não são de promessas são englobados com <b>WinJS.Promise.as</b>, de forma que toda a matriz ou objeto é composto de promessas.</p>

<p>Veja as características de <b>any</b>:</p>

<ul>
  <li><b>any</b> cria uma única promessa que é cumprida quando uma das outras é cumprida ou quando ocorrem falhas com um erro (um OU lógico). Em essência, o <b>any</b><i> </i>anexa manipuladores completos a todas essas promessas, e assim que um manipulador completo é chamado, ele chama todos os manipuladores completos que a própria promessa de <b>any</b><i> </i>recebeu.</li>

  <li>Depois que a promessa de <b>any</b><i> </i>tiver sido cumprida (ou seja, depois que a primeira promessa na lista tiver sido cumprida), as outras operações na lista continuarão sendo executadas, chamando quaisquer manipuladores completos, de erros ou progresso atribuídos a essas promessas individualmente.</li>

  <li>Se você cancelar a promessa de <b>any</b>, todas as promessas na lista serão canceladas.</li>
</ul>

<p>Já no caso de <b>join</b>:</p>

<ul>
  <li><b>join</b> cria uma única promessa que é cumprida quando <i>todas</i> as outras são cumpridas ou quando ocorrem falhas com um erro (um E lógico). Em essência, <b>join</b><i> </i>anexa manipuladores completos e de erros a todas essas promessas e aguarda até que eles sejam chamados antes de chamar todos os manipuladores completos que ele mesmo recebe.</li>

  <li>A promessa de <b>join</b> também relata progressos para todos os manipuladores de progresso fornecidos. O resultado intermediário nesse caso é uma gama de resultados dessas promessas individuais que já foram cumpridas até o momento.</li>

  <li>Se você cancelar a promessa de <b>join</b>, todas as outras promessas ainda pendentes serão canceladas.</li>
</ul>

<p>Além de <b>any</b> e <b>join</b>, existem dois outros métodos estáticos do <b>WinJS.Promise</b> a serem considerados que podem ser úteis:</p>

<ul>
  <li><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211765.aspx"><b>is</b></a> determina se um valor arbitrário é uma promessa, retornando um booliano. Ele basicamente garante que seja um objeto com uma função chamada de “then”; não faz testes para “done”.</li>

  <li><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br229727.aspx"><b>theneach</b></a><i> </i>aplica manipuladores completos, de erros e progresso a um grupo de promessas (usando <b>then</b>), retornando os resultados como outro grupo de valores dentro de uma promessa. Todos os manipuladores podem ser <i>nulos</i>.</li>
</ul>

<h2>Promessas paralelas com resultados sequenciais</h2>

<p>Com <b>WinJS.Promise.join</b> e <b>WinJS.Promise.any</b>, temos a capacidade de trabalhar com promessas paralelas, isto é, com operações assíncronas paralelas. A promessa retornada por <b>join</b>, novamente, são cumpridas quando todas as promessas em uma matriz são cumpridas. No entanto, essas promessas provavelmente serão concluídas de forma aleatória. E se você tiver um conjunto de operações que possam ser executadas dessa maneira, mas quer processar seus resultados de forma bem definida, isto é, a ordem em que suas promessas são exibidas em uma matriz?</p>

<p>Para fazer isso, você precisa combinar todas as promessas subsequentes ao <b>join</b> de todas as anteriores, e a parte do código com que iniciamos esta postagem faz exatamente isso. Veja o código novamente, mas reescrito para explicitar as promessas. (Suponha que a <i>lista</i><b> </b>seja uma matriz de valores de algum tipo usada como argumentos para uma chamada assíncrona de produção de promessas hipotética <b>doOperationAsync</b>):</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">list.reduce(<span style="color: rgb(0, 0, 255);">function</span> callback (prev, item, i) {<br />    <span style="color: rgb(0, 0, 255);">var</span> opPromise = doOperationAsync(item);<br />    <span style="color: rgb(0, 0, 255);">var</span> join = WinJS.Promise.join({ prev: prev, result: opPromise});<br /><br />    <span style="color: rgb(0, 0, 255);">return</span> join.then(<span style="color: rgb(0, 0, 255);">function</span> completed (v) {<br />        console.log(i + <span style="color: rgb(0, 96, 128);">&quot;, item: &quot;</span> + item+ <span style="color: rgb(0, 96, 128);">&quot;, &quot;</span> + v.result);<br />    });<br />})<br /></pre>
  </div>
</blockquote>

<p>Para compreender este código, primeiro precisamos entender como o método <a href="http://msdn.microsoft.com/pt-br/library/ie/ff679975(v=vs.94).aspx"><b>reduce</b></a> da matriz funciona. Para cada item na matriz, <b>reduce</b> chama o argumento da função, chamado aqui de <b>callback</b>, que recebe quatro argumentos (e apenas três deles são usados no código):</p>

<ul>
  <li><i>prev</i> O valor retornado da chamada <i>previous</i> para <b>callback</b> (este é <i>nulo</i> para o primeiro item).</li>

  <li><i>item</i> O valor atual da matriz.</li>

  <li><i>i</i> O índice de itens na lista.</li>

  <li><i>source</i> A matriz original.</li>
</ul>

<p>Para o primeiro item da lista, obteremos uma promessa que chamarei de <b>opPromise<sub>1</sub></b>. Como <b>o anterior</b> ainda está <i>nulo</i>, combinaremos <b>[WinJS.Promise.as(null), opPromise<sub>1</sub>]</b>. Mas observe que não retornaremos <b>join</b>. Em vez disso, anexaremos um manipulador completo (que chamei de <b>completo</b>) à este join e ele retornará a promessa de seu <b>then</b>.</p>

<p>Lembre-se de que a promessa retornada de <b>then</b> será cumprida quando o manipulador completo retornar. Isso significa que estamos retornando de <b>callback</b> uma promessa que não será concluída até que o manipulador <b>completo</b> do primeiro item tenha processado os resultados de <b>opPromise<sub>1</sub></b>. E se você observar o resultado de uma combinação, ele terá sido cumprido com um objeto que contém os resultados de promessas da lista original. Isso significa que o valor de cumprimento <i>v</i> conterá uma propriedade <i>prev</i> e uma propriedade <i>result</i>, em que a última é o resultado de <b>opPromise<sub>1</sub></b>.</p>

<p>Com o próximo item na <i>lista</i>, <b>callback</b> recebe um <i>prev</i> que contém uma promessa do <b>join.then</b> anterior. Depois disso, criaremos uma combinação de <b>opPromise<sub>1</sub>.then</b> com <b>opPromise<sub>2</sub></b>. Como resultado, essa combinação não será concluída até que as duas <b>opPromise<sub>2</sub></b> tenham sido cumpridas <i>e</i> o manipulador completo de <b>opPromise<sub>1</sub></b> tenha sido retornado. Pronto! O manipulador <b>completo<sub>2</sub></b> que anexaremos agora a esta <b>combinação</b> não será chamado até que <b>completed<sub>1</sub></b> tenha sido retornado.</p>

<p>As mesmas dependências continuam sendo criadas para cada item na lista, a promessa de <b>join.then</b> para o item <i>n </i>não será cumprida até que o <b>completed<i><sub>n</sub></i></b> seja retornado. Isso garante que os manipuladores completos sejam chamados na mesma sequência que a <i>lista</i>.</p>

<h2>Resumo</h2>

<p>Nesta postagem vimos que as promessas são apenas uma construção de código ou convenção de chamadas de função, embora muito eficiente, para representar um relacionamento específico entre uma origem, que tem os valores a serem fornecidos em um momento posterior arbitrário e um consumidor que precisa saber quando esses valores estarão disponíveis. Como tal, as promessas trabalham muito bem para representar resultados de operações assíncronas e são usadas extensivamente em aplicativos da Windows Store escritos em JavaScript. A especificações de promessas também permite que operações assíncronas sejam encadeadas juntas, com cada resultado intermediário fluindo de um link para o próximo.</p>

<p>A Biblioteca do Windows para JavaScript, WinJS, fornece uma implementação eficiente de promessas que você pode usar para englobar qualquer tipo de operação. Ela também fornece ajuda para cenários comuns, como a combinação de promessas para operações paralelas. Com elas, o WinJS possibilita o trabalho com operações assíncronas de forma eficiente e eficaz.</p>

<p>Kraig Brockschmidt 
  <br />Gerente de programas, equipe de ecossistema do Windows 

  <br />Autor, <a href="http://blogs.msdn.com/b/microsoft_press/archive/2012/10/29/free-ebook-programming-windows-8-apps-with-html-css-and-javascript.aspx"><i>Programming Windows 8 Apps in HTML, CSS, and JavaScript (Programando aplicativos do Windows 8 em HTML, CSS e JavaScript)</i></a></p>

<!-- Title: “Tudo sobre promessas (para aplicativos da Windows Store escritos em JavaScript).” Tags: “JavaScript, aplicativos da Windows Store, promessas” --></div>]]></content:encoded>
    </item>
    <item>
      <title>Otimizar a renderização de item do ListView</title>
      <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/otimizar-a-renderizao-de-item-do-listview</link>
      <pubDate>Tue, 25 Jun 2013 14:31:06 GMT</pubDate>
      <dc:creator><![CDATA[Windows 8 Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windowsappdev_br/2013/06/25/otimizar-a-renderizao-de-item-do-listview/</guid>
      <description><![CDATA[Para muitos aplicativos da Windows Store escritos em JavaScript , que trabalham com coleções,...]]></description>
      <content:encoded><![CDATA[<div class="PostContent"> <p>Para muitos <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211385.aspx" target="_blank">aplicativos da Windows Store escritos em JavaScript</a> , que trabalham com coleções, colaborar bem com o <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211837.aspx" target="_blank">controle WinJS ListView</a> é essencial para o bom desempenho do aplicativo. Isto não é nenhuma surpresa: quando se está lidando com o gerenciamento e a exibição de, possivelmente, milhares de itens, qualquer otimização que você fizer com esses itens conta. Ainda mais importante é como cada um desses itens é renderizado, o que significa, como — e quando — cada item no controle ListView é construído no DOM e se torna uma parte visível do aplicativo. Na verdade, a parte <i>quando </i>dessa equação se torna um fator crucial quando um usuário realiza uma panorâmica com rapidez em uma lista e espera que aquela lista mantenha o ritmo.</p>  <p>A renderização de itens em um ListView acontece por meio de um modelo declarativo, definido em HTML ou por meio de uma <i>função de renderização</i> personalizada do JavaScript que é exigida para cada item na lista. Embora o modelo declarativo seja o método mais simples, ele não oferece muita margem para o controle específico sobre o processo. Por outro lado, uma função de renderização o permite personalizar a renderização por cada item e possibilita diversas otimizações demonstradas na <a href="http://code.msdn.microsoft.com/windowsapps/ListView-performance-39fb71f0" target="_blank">amostra de desempenho de otimização do ListView em HTML</a>. Essas otimizações são:</p>  <ul>   <li>A possibilidade de entregas assíncronas de dados dos itens e um elemento renderizado, com o suporte das funções básicas de renderização.</li>    <li>Separação da criação do formato de um item dos seus elementos internos, o que é necessário para o layout geral de um ListView. Este processo é possível por meio de um renderizador de espaço reservado.</li>    <li>Reutilização de um elemento de item previamente criado (e dos seus filhos) substituindo os seus dados, evitando a maioria das etapas de criação de elemento, possibilitado por meio de um renderizador de reciclagem de espaço reservado.</li>    <li>Adiar operações visuais caras, como carregamento e animação de imagens, até que um item se torne visível e um ListView não esteja sendo pesquisado panoramicamente, o que é realizado por meio de um renderizador de várias etapas.</li>    <li>Agrupar essas mesmas operações visuais para minimizar a novas renderizações do DOM, por meio de um renderizador de agrupamento de várias etapas.</li> </ul>  <p>Nesta postagem analisaremos todas essas etapas e aprenderemos como elas cooperam com o processo de renderização de item do ListView. Como você pode imaginar, otimizações relacionadas a <i>quando</i> renderizar um item envolvem muitas operações assíncronas e, portanto, muitas promessas. Portanto, durante o processo, também aprenderemos muito sobre as próprias promessas, adicionando ao artigo anterior <a href="http://blogs.msdn.com/b/windowsappdev/archive/2013/06/10/all-about-promises-for-windows-store-apps-written-in-javascript.aspx" target="_blank">All about promises</a> (Tudo sobre promessas) neste blog.</p>  <p>Uma observação geral, que se aplica a todos os renderizadores: é sempre importante manter o tempo de renderização do seu item principal (sem contar as operações adiadas) ao mínimo. Como o desempenho final do ListView depende muito de como as suas atualizações estão alinhadas com os intervalos de atualização da tela, uns poucos milissegundos gastos em um renderizador de item pode aumentar o tempo geral de renderização do ListView no curso do intervalo de atualização seguinte, resultando em quadros eliminados e falhas na imagem. Em outras palavras, os renderizadores de item são um lugar onde otimizar o seu código JavaScript realmente conta.</p>  <h2>Renderizadores básicos</h2>  <p>Vamos começar com rápida análise do que é uma função de renderização de item — que chamarei simplesmente de <i>renderizador</i>. Um renderizador é uma função designada por você à propriedade <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh700705.aspx" target="_blank">itemTemplate</a> do ListView, em vez de um nome do modelo, e essa função será utilizada, conforme necessário, para itens que o ListView quer incluir no DOM. (Observe que as informações básicas para renderizadores podem ser encontradas na página <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh700705.aspx" target="_blank">itemTemplate</a>, mas é a amostra que realmente apresenta as otimizações.)</p>  <p>Você pode esperar que uma função de renderização de item seria simplesmente designada a um item a partir da fonte de dados do ListView. Ela, então, criaria os elementos HTML necessários para aquele item específico e retornaria o elemento raiz que o ListView pode adicionar ao DOM. Basicamente, é isto que acontece, mas existem duas considerações adicionais. Primeiro, os próprios dados do item podem ser carregados de forma assíncrona, portanto, faz sentido associar a criação do elemento à disponibilidade daqueles dados. Além disso, o próprio processo de renderização do item pode envolver trabalhos assíncronos, como carregar imagens de URIs remotos ou a leitura de dados em outros arquivos identificados nos dados do item. Os diferentes níveis de otimização que analisaremos, na verdade, permitem um volume arbitrário de trabalho assíncrono entre a solicitação dos elementos do item e a entrega, de fato, desses elementos.</p>  <p>Portanto, repito, você pode confiar que promessas estarão envolvidas! Primeiro porque o ListView não fornece ao renderizador apenas os dados do item diretamente, ele fornece uma promessa para esses dados. Em vez da função retornar diretamente ao elemento raiz do item, ela retorna uma promessa para aquele elemento. Isto permite que o ListView agrupe diversas promessas de renderização de item e aguarde (de forma assíncrona) até que a página inteira de itens tenha sido renderizada. Na verdade, ele faz isso para gerenciar, de maneira inteligente, como ele constrói as diferentes páginas. Primeiro, construindo a página de itens visíveis. Depois, construindo duas páginas não exibidas na tela, para frente e para trás, onde é mais provável que os usuários façam uma panorâmica para avançar. Além disso, ter todas estas promessas nos devidos lugares significa que o ListView pode cancelar facilmente a renderização de itens inacabados, caso o usuário deixe de fazer a panorâmica, evitando assim, a criação desnecessária de elementos.</p>  <p>Podemos ver como essas promessas são usadas na função <b>simpleRenderer</b> da amostra:</p>  <p> </p>  <blockquote>   <div id="codeSnippetWrapper">     <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">function</span> simpleRenderer(itemPromise) {<br />    <span style="color: rgb(0, 0, 255);">return</span> itemPromise.then(<span style="color: rgb(0, 0, 255);">function</span> (item) {<br />        <span style="color: rgb(0, 0, 255);">var</span> element = document.createElement(<span style="color: rgb(0, 96, 128);">&quot;div&quot;</span>);<br />        element.className = <span style="color: rgb(0, 96, 128);">&quot;itemTempl&quot;</span>;<br />        element.innerHTML = <span style="color: rgb(0, 96, 128);">&quot;&lt;img src='&quot;</span> + item.data.thumbnail +<br />            <span style="color: rgb(0, 96, 128);">&quot;' alt='Databound image' /&gt;&lt;div class='content'&gt;&quot;</span> + item.data.title + <span style="color: rgb(0, 96, 128);">&quot;&lt;/div&gt;&quot;</span>;<br />        <span style="color: rgb(0, 0, 255);">return</span> element;<br />    });<br />}<br /></pre>
  </div>
</blockquote>

<p>Este código primeiro anexa um manipulador concluído ao <b>itemPromise</b>. O manipulador é chamado quando os dados do item estão disponíveis e efetivamente cria os elementos em resposta. Observe, novamente, que não estamos retornando o elemento diretamente. Estamos retornando uma promessa que é cumprida com esse elemento. Ou seja, o valor de retorno do <b>itemPromise.then()</b> é uma promessa que é cumprida com o <i>element </i>se e quando o ListView precisar dele.</p>

<p>Retornar uma promessa nos permite realizar outras tarefas assíncronas, se necessário. Neste caso, o renderizador pode simplesmente encadear estas promessas intermediárias, retornando a promessa da última <b>then</b> na cadeia. Por exemplo:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">function</span> someRenderer(itemPromise) {<br />    <span style="color: rgb(0, 0, 255);">return</span> itemPromise.then(<span style="color: rgb(0, 0, 255);">function</span> (item) {<br />        <span style="color: rgb(0, 0, 255);">return</span> doSomeWorkAsync(item.data);<br />    }).then(<span style="color: rgb(0, 0, 255);">function</span> (results) {<br />        <span style="color: rgb(0, 0, 255);">return</span> doMoreWorkAsync(results1);<br />    }).then(<span style="color: rgb(0, 0, 255);">function</span> (results2) {<br />        <span style="color: rgb(0, 0, 255);">var</span> element = document.createElement(<span style="color: rgb(0, 96, 128);">&quot;div&quot;</span>);<br />        <span style="color: rgb(0, 128, 0);">// use results2 to configure the element</span><br />        <span style="color: rgb(0, 0, 255);">return</span> element;<br />    });<br />}<br /></pre>
  </div>
</blockquote>

<p>Observe que, o dele é um caso onde <i>não</i> usamos <b>done</b> no final da cadeia, porque estamos retornando uma promessa da última chamada <b>then</b>. O ListView se responsabiliza por lidar com qualquer erro que possa surgir.</p>

<h2>Renderizadores de espaço reservado</h2>

<p>A próxima etapa da otimização do ListView utiliza um <i>renderizador de espaço reservado</i> que divide a construção do elemento em duas etapas. Isto permite que o ListView solicite apenas as partes de um elemento que são necessárias para definir o layout geral da lista, sem ter que construir todos os elementos dentro de cada item. Consequentemente, o ListView pode completar o seu cálculo de layout rapidamente e continuar a responder eficazmente a mais entradas. Ele pode, então, solicitar o restante do elemento mais tarde.</p>

<p>Um renderizador de espaço reservado retorna um objeto com duas propriedades, em vez de apenas uma promessa:</p>

<ul>
  <li><i>element</i> O elemento de nível superior na estrutura do item, que basta para definir o seu tamanho e forma, e que não depende dos dados do item.</li>

  <li><i>renderComplete</i> Uma promessa que é cumprida quando o restante dos conteúdos do elemento são construídos, ou seja, retorna a promessa de qualquer cadeia que você tenha iniciado com o <b>itemPromise.then</b>, como anteriormente.</li>
</ul>

<p>O ListView é inteligente o bastante para verificar se o seu renderizador retornou uma promessa (o caso básico anterior) ou um objeto com propriedades <i>element</i> e <i>renderComplete</i> (casos mais avançados). Portanto, o renderizador de espaço reservado equivalente (na amostra) para o <b>simpleRenderer</b> anterior é o seguinte:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">function</span> placeholderRenderer(itemPromise) {<br />    <span style="color: rgb(0, 128, 0);">// create a basic template for the item that doesn't depend on the data</span><br />    <span style="color: rgb(0, 0, 255);">var</span> element = document.createElement(<span style="color: rgb(0, 96, 128);">&quot;div&quot;</span>);<br />    element.className = <span style="color: rgb(0, 96, 128);">&quot;itemTempl&quot;</span>;<br />    element.innerHTML = <span style="color: rgb(0, 96, 128);">&quot;&lt;div class='content'&gt;...&lt;/div&gt;&quot;</span>;<br /><br />    <span style="color: rgb(0, 128, 0);">// return the element as the placeholder, and a callback to update it when data is available</span><br />    <span style="color: rgb(0, 0, 255);">return</span> {<br />        element: element,<br /><br />        <span style="color: rgb(0, 128, 0);">// specifies a promise that will be completed when rendering is complete</span><br />        <span style="color: rgb(0, 128, 0);">// itemPromise will complete when the data is available</span><br />        renderComplete: itemPromise.then(<span style="color: rgb(0, 0, 255);">function</span> (item) {<br />            <span style="color: rgb(0, 128, 0);">// mutate the element to include the data</span><br />            element.querySelector(<span style="color: rgb(0, 96, 128);">&quot;.content&quot;</span>).innerText = item.data.title;<br />            element.insertAdjacentHTML(<span style="color: rgb(0, 96, 128);">&quot;afterBegin&quot;</span>, <span style="color: rgb(0, 96, 128);">&quot;&lt;img src='&quot;</span> +<br />                item.data.thumbnail + <span style="color: rgb(0, 96, 128);">&quot;' alt='Databound image' /&gt;&quot;</span>);<br />        })<br />    };<br />}<br /></pre>
  </div>
</blockquote>

<p>Observe que a atribuição <i>element.innerHTML</i> pode ser movida dentro do <b>renderComplete</b> porque a classe <i>itemTempl</i> no arquivo de amostra css/scenario1.css especificou diretamente a largura e a altura do item. A razão para ela estar incluída na propriedade <i>element</i> é porque ela fornece o padrão de texto “…” no espaço reservado. Você também poderia facilmente utilizar um elemento <i>img</i> que se refira a um pequeno recurso no pacote que é compartilhado por todos os itens e, portanto, seja renderizado rapidamente.</p>

<h2>Reciclar renderizadores de espaço reservado</h2>

<p>A próxima otimização, <i>reciclar renderizadores de espaço reservado</i> não adiciona nada de novo no que se refere às promessas. Ela adiciona o reconhecimento de um segundo parâmetro para o renderizador chamado <i>recycled</i>, que é o elemento raiz de um item que foi anteriormente renderizado, mas não está mais visível. Ou seja, o elemento reciclado já possui os seus elementos filho nos devidos lugares, para que você possa substituir os dados ou talvez alterar alguns desses elementos. Isto evita a maioria das solicitações caras de criação de elementos, necessárias para um item totalmente novo, economizando um tempo significativo no processo de renderização.</p>

<p>O ListView pode fornecer um elemento reciclado quando o seu <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211835.aspx" target="_blank">loadingBehavior</a><b></b> estiver configurado para "randomaccess". Se <i>recycled</i> for fornecido, você pode simplesmente limpar dados do elemento (e dos seus filhos), retorná-lo ao seu espaço reservado e, então, preencher os dados e criar filhos adicionais (se necessário) dentro do <i>renderComplete</i>. Se um elemento reciclado não for fornecido (como acontece quando o ListView é criado pela primeira vez ou quando o <b>loadingBehavior</b> for "incremental"), você criará o elemento novamente. Aqui está o código da amostra para esta variação:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">function</span> recyclingPlaceholderRenderer(itemPromise, recycled) {<br />    <span style="color: rgb(0, 0, 255);">var</span> element, img, label;<br />    <span style="color: rgb(0, 0, 255);">if</span> (!recycled) {<br />        <span style="color: rgb(0, 128, 0);">// create a basic template for the item that doesn't depend on the data</span><br />        element = document.createElement(<span style="color: rgb(0, 96, 128);">&quot;div&quot;</span>);<br />        element.className = <span style="color: rgb(0, 96, 128);">&quot;itemTempl&quot;</span>;<br />        element.innerHTML = <span style="color: rgb(0, 96, 128);">&quot;&lt;img alt='Databound image' style='visibility:hidden;'/&gt;&quot;</span> +<br />            <span style="color: rgb(0, 96, 128);">&quot;&lt;div class='content'&gt;...&lt;/div&gt;&quot;</span>;<br />    }<br />    <span style="color: rgb(0, 0, 255);">else</span> {<br />        <span style="color: rgb(0, 128, 0);">// clean up the recycled element so that we can reuse it </span><br />        element = recycled;<br />        label = element.querySelector(<span style="color: rgb(0, 96, 128);">&quot;.content&quot;</span>);<br />        label.innerHTML = <span style="color: rgb(0, 96, 128);">&quot;...&quot;</span>;<br />        img = element.querySelector(<span style="color: rgb(0, 96, 128);">&quot;img&quot;</span>);<br />        img.style.visibility = <span style="color: rgb(0, 96, 128);">&quot;hidden&quot;</span>;<br />    }<br />    <span style="color: rgb(0, 0, 255);">return</span> {<br />        element: element,<br />        renderComplete: itemPromise.then(<span style="color: rgb(0, 0, 255);">function</span> (item) {<br />            <span style="color: rgb(0, 128, 0);">// mutate the element to include the data</span><br />            <span style="color: rgb(0, 0, 255);">if</span> (!label) {<br />                label = element.querySelector(<span style="color: rgb(0, 96, 128);">&quot;.content&quot;</span>);<br />                img = element.querySelector(<span style="color: rgb(0, 96, 128);">&quot;img&quot;</span>);<br />            }<br />            label.innerText = item.data.title;<br />            img.src = item.data.thumbnail;<br />            img.style.visibility = <span style="color: rgb(0, 96, 128);">&quot;visible&quot;</span>;<br />        })<br />    };<br />}<br /></pre>
  </div>
</blockquote>

<p>Na opção <i>renderComplete</i>, certifique-se de verificar a existência de elementos não criados para um novo espaço reservado, como por exemplo <i>label</i>, e crie-os aqui, se necessário.</p>

<p>Se você deseja livrar-se de itens reciclados de forma mais generalizada, é possível fornecer uma função à propriedade <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211846.aspx" target="_blank">resetItem</a><b></b> do ListView. Esta função pode conter código similar ao mostrado acima. O mesmo vale para a propriedade <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh700726.aspx" target="_blank">resetGroupHeader</a><b></b> , já que você pode usar funções modelo para cabeçalhos de grupo e também para itens. Não nos referimos muito a isto porque os cabeçalhos de grupos são em número muito menor e, normalmente, não têm as mesmas implicações no desempenho. Não obstante, a funcionalidade existe.</p>

<h2>Renderizadores de várias etapas</h2>

<p>Isto nos trás à penúltima otimização, o <i>renderizador de várias etapas</i>. Ele estende o renderizador de reciclagem de espaço reservado para atrasar o carregamento de imagens e outras mídias, até que o resto do item esteja completamente presente no DOM. Ele também atrasa efeitos, como animações, até que o item esteja realmente na tela. Isto reconhece que os usuários frequentemente fazem panorâmica bem rápidas no ListView. Portanto, faz sentido adiar as operações mais caras até o ListView ter chegado a uma posição estável.</p>

<p>O ListView fornece os ganchos necessários conforme os membros no <b>item</b> resultem do <b>itemPromise</b>: uma propriedade chamada <b>ready</b> (uma promessa) e dois métodos, o <b>loadImage</b> e o <b>isOnScreen</b>, retornam (ainda mais!) promessas. Ou seja:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">renderComplete: itemPromise.then(<span style="color: rgb(0, 0, 255);">function</span> (item) {<br />    <span style="color: rgb(0, 128, 0);">// item.ready, item.loadImage, and item.isOnScreen available</span><br />})<br /></pre>
  </div>
</blockquote>

<p>Aqui está como usá-los:</p>

<ul>
  <li><b>ready</b> Retorna esta promessa a partir do primeiro manipulador concluído na sua cadeia. Essa promessa é cumprida quando a estrutura completa do elemento foi renderizada e está visível. Isto significa que você pode encadear um outro <b>then</b> com um manipulador concluído no qual você executa tarefas após a visibilidade, como, por exemplo carregar imagens.</li>

  <li><b>loadImage</b> Baixa uma imagem de um URI e a exibe no elemento <i>img</i> designado, retornando uma promessa que é cumprida com esse mesmo elemento. Você anexa um manipulador concluído à esta promessa e ele mesmo retorna a promessa da <b>isOnScreen</b>. Observe que o <b>loadImage</b> criará um elemento <i>img</i> caso ele não seja fornecido e entregue a seu manipulador concluído.</li>

  <li><b>isOnScreen</b> Retorna uma promessa cujo valor de cumprimento é uma parâmetro booliano indicando se o item está visível ou não. Nas implementações correntes, este é um valor conhecido, portanto, a promessa é cumprida de forma síncrona. Entretanto, encapsulando-o em uma promessa, ele pode ser usado em uma cadeia mais longa.</li>
</ul>

<p>Pode-se observar tudo isto na função <b>multistageRenderer</b> da amostra, onde a conclusão do carregamento da imagem é usada para dar início a uma animação de fade-in. Aqui estou apenas mostrando o que foi retornado da promessa <i>renderComplete</i>:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">renderComplete: itemPromise.then(<span style="color: rgb(0, 0, 255);">function</span> (item) {<br />    <span style="color: rgb(0, 128, 0);">// mutate the element to update only the title</span><br />    <span style="color: rgb(0, 0, 255);">if</span> (!label) { label = element.querySelector(<span style="color: rgb(0, 96, 128);">&quot;.content&quot;</span>); }<br />    label.innerText = item.data.title;<br /><br />    <span style="color: rgb(0, 128, 0);">// use the item.ready promise to delay the more expensive work</span><br />    <span style="color: rgb(0, 0, 255);">return</span> item.ready;<br />    <span style="color: rgb(0, 128, 0);">// use the ability to chain promises, to enable work to be cancelled</span><br />}).then(<span style="color: rgb(0, 0, 255);">function</span> (item) {<br />    <span style="color: rgb(0, 128, 0);">// use the image loader to queue the loading of the image</span><br />    <span style="color: rgb(0, 0, 255);">if</span> (!img) { img = element.querySelector(<span style="color: rgb(0, 96, 128);">&quot;img&quot;</span>); }<br />    <span style="color: rgb(0, 0, 255);">return</span> item.loadImage(item.data.thumbnail, img).then(<span style="color: rgb(0, 0, 255);">function</span> () {<br />        <span style="color: rgb(0, 128, 0);">// once loaded check if the item is visible</span><br />        <span style="color: rgb(0, 0, 255);">return</span> item.isOnScreen();<br />    });<br />}).then(<span style="color: rgb(0, 0, 255);">function</span> (onscreen) {<br />    <span style="color: rgb(0, 0, 255);">if</span> (!onscreen) {<br />        <span style="color: rgb(0, 128, 0);">// if the item is not visible, don't animate its opacity</span><br />        img.style.opacity = 1;<br />    } <span style="color: rgb(0, 0, 255);">else</span> {<br />        <span style="color: rgb(0, 128, 0);">// if the item is visible, animate the opacity of the image</span><br />        WinJS.UI.Animation.fadeIn(img);<br />    }<br />})<br /></pre>
  </div>
</blockquote>

<p>Embora haja muita coisa acontecendo, ainda temos apenas uma cadeia de promessas básica. A primeira operação assíncrona no renderizador atualiza partes simples da estrutura do elemento do item, tais como texto. Ela, então, retorna a promessa em <b>item.ready</b>. Quando a promessa é cumprida — ou, mais precisamente, se a promessa é cumprida — utilizamos o método assíncrono <b>loadImage</b> do item para dar início ao download de uma imagem, retornando a promessa <b>item.isOnScreen</b> daquele manipulador concluído. Isto significa que o sinalizador de visibilidade <i>onscreen</i> é passado para o manipulador concluído final na cadeia. Quando e se aquela promessa <b>isOnScreen</b> é cumprida — o que significa que o item está realmente visível — podemos executar operações relevantes como, por exemplo, animações.</p>

<p>Enfatizo a parte "se", porque pode ser que, novamente, aquele usuário esteja fazendo uma panorâmica dentro do ListView enquanto isto está acontecendo. Ter todas estas promessas encadeadas torna possível para o ListView cancelar operações assíncronas, sempre que estes itens não estejam visíveis e/ou desativados de uma página com buffer. Basta dizer que, o controle do ListView passou por <i>muitos</i> testes de desempenho!</p>

<p>Também é importante lembrar, novamente, que estamos usando o <b>then</b> em todas estas cadeias, porque ainda estamos retornando uma promessa da função de renderização dentro da propriedade <i>renderComplete</i>. Nunca somos o final da cadeia destes renderizadores, portanto, nunca usaremos o <b>done</b> no final.</p>

<h2>Agrupamento de miniaturas</h2>

<p>A última otimização é, verdadeiramente, o <i>coup de grace</i> para o controle do ListView. Na função chamada <b>batchRenderer</b>, encontramos esta estrutura para o <i>renderComplete</i> (com a maior parte do código omitido):</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">renderComplete: itemPromise.then(<span style="color: rgb(0, 0, 255);">function</span> (item) {<br />    <span style="color: rgb(0, 128, 0);">// mutate the element to update only the title</span><br />    <span style="color: rgb(0, 0, 255);">if</span> (!label) { label = element.querySelector(<span style="color: rgb(0, 96, 128);">&quot;.content&quot;</span>); }<br />    label.innerText = item.data.title;<br /><br />    <span style="color: rgb(0, 128, 0);">// use the item.ready promise to delay the more expensive work</span><br />    <span style="color: rgb(0, 0, 255);">return</span> item.ready;<br />    <span style="color: rgb(0, 128, 0);">// use the ability to chain promises, to enable work to be cancelled</span><br />}).then(<span style="color: rgb(0, 0, 255);">function</span> (item) {<br />    <span style="color: rgb(0, 128, 0);">// use the image loader to queue the loading of the image</span><br />    <span style="color: rgb(0, 0, 255);">if</span> (!img) { img = element.querySelector(<span style="color: rgb(0, 96, 128);">&quot;img&quot;</span>); }<br />    <span style="color: rgb(0, 0, 255);">return</span> item.loadImage(item.data.thumbnail, img).then(<span style="color: rgb(0, 0, 255);">function</span> () {<br />        <span style="color: rgb(0, 128, 0);">// once loaded check if the item is visible</span><br />        <span style="color: rgb(0, 0, 255);">return</span> item.isOnScreen();<br />    });<br />}).then(<span style="color: rgb(0, 0, 255);">function</span> (onscreen) {<br />    <span style="color: rgb(0, 0, 255);">if</span> (!onscreen) {<br />        <span style="color: rgb(0, 128, 0);">// if the item is not visible, don't animate its opacity</span><br />        img.style.opacity = 1;<br />    } <span style="color: rgb(0, 0, 255);">else</span> {<br />        <span style="color: rgb(0, 128, 0);">// if the item is visible, animate the opacity of the image</span><br />        WinJS.UI.Animation.fadeIn(img);<br />    }<br />})<br /></pre>
  </div>
</blockquote>

<p>Isto é quase o mesmo que o <b>multistageRenderer</b> com exceção da misteriosa solicitação para a inserção de uma função chamada <b>thumbnailBatch</b> entre a solicitação <b>item.loadImage</b> e a verificação do <b>item.isOnScreen</b>. O posicionamento do <b>thumbnailBatch</b> na cadeia indica que o seu valor de retorno deve ser um manipulador concluído, que retorna uma outra promessa.</p>

<p>Confuso? Não se preocupe, chegaremos ao fundo disto! Mas antes precisamos de um pouco mais de informações sobre o que estamos tentando fazer.</p>

<p>Se tivéssemos apenas um ListView, com um único item, várias otimizações de carregamento não seriam percebidas. Mas os ListViews normalmente têm vários itens e a função de renderização é necessária para cada um deles. Na opção <b>multistageRenderer</b> da seção anterior, e renderização de cada item dá início a uma operação assíncrona <b>item.loadImage</b> para baixar a sua miniatura de um URI arbitrário, e cada operação pode levar um período de tempo arbitrário. Portanto, para a lista completa, poderemos ter uma série de solicitações simultâneas de <b>loadImage</b> ocorrendo, com a renderização de cada item aguardando a conclusão da sua miniatura específica. Até aqui, tudo bem.</p>

<p>Entretanto, uma característica importante que não está visível no <b>multistageRenderer</b> é que o elemento <i>img</i> para a miniatura já <i>está</i> no DOM, e a função <b>loadImage</b> configura o atributo <i>src</i> daquela imagem assim que o download tiver concluído. Por sua vez, isto aciona uma atualização no mecanismo de renderização assim que retornarmos do restante da cadeia de promessas que, depois disso, é essencialmente síncrona.</p>

<p>É possível, então, que uma série de miniaturas possam voltar ao thread da interface do usuário dentro um curto período de tempo. Isso causará excesso de rotatividade no mecanismo de renderização e um fraco desempenho visual. Para evitar essa rotatividade o que queremos é criar por completo estes <i>elements</i> img <i>antes</i> deles estarem no DOM, e depois adicioná-los em lotes, de tal maneira que sejam todos manipulados em uma única passagem de renderização.</p>

<p>A amostra realiza isto por meio de um código de promessa mágico, uma função chamada <b>createBatch</b>. <b>createBatch</b> é solicitado apenas uma vez para todo o aplicativo e o seu resultado — uma outra função — é armazenado na variável chamada <b>thumbnailBatch</b>:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> thumbnailBatch;<br />thumbnailBatch = createBatch();<br /></pre>
  </div>
</blockquote>

<p>Uma solicitação à esta função <b>thumbnailBatch</b> , como a chamarei daqui para frente, é novamente inserida na cadeia de promessa de renderizador. O propósito dessa inserção, dada a natureza do código de loteamento, como logo veremos, é agrupar um conjunto de elementos <i>img</i> carregados, liberando-os para mais processamento em intervalos adequados. Repetindo, apenas ao olhar para a cadeia de promessa no renderizador, uma solicitação ao <b>thumbnailBatch()</b> deve retornar uma função concluída de manipulador que retorna uma promessa, e o valor de cumprimento dessa promessa (analisando a próxima etapa na cadeia) deve ser um elemento <i>img</i> que pode ser adicionado ao DOM. Ao adicionar estas imagens ao DOM, <i>após</i> o loteamento ter sido concluído, combinamos todo este grupo para a mesma passagem de renderização.</p>

<p>Esta é uma importante diferença entre o <b>batchRenderer</b> e o <b>multistageRenderer</b> da seção anterior: no último o elemento da miniatura <i>img</i> já existe no DOM e é passado ao <b>loadImage</b> como um segundo parâmetro. Portanto, quando <b>loadImage</b> configura o atributo <i>src</i> da imagem, uma atualização de renderização é acionada. Entretanto, dentro do <b>batchRenderer</b>, este elemento <i>img</i> é criado separadamente dentro do <b>loadImage</b> (onde o <i>src</i> também é configurado), mas o <i>img</i> ainda não está no DOM. Ele só é adicionado ao DOM após a conclusão da etapa do <b>thumbnailBatch</b> , tornando-o parte de um grupo dentro daquele cálculo de layout único.</p>

<p>Agora, vamos ver como funciona este loteamento. Aqui está a função <b>createBatch</b> completa:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">function</span> createBatch(waitPeriod) {<br />    <span style="color: rgb(0, 0, 255);">var</span> batchTimeout = WinJS.Promise.<span style="color: rgb(0, 0, 255);">as</span>();<br />    <span style="color: rgb(0, 0, 255);">var</span> batchedItems = [];<br /><br />    <span style="color: rgb(0, 0, 255);">function</span> completeBatch() {<br />        <span style="color: rgb(0, 0, 255);">var</span> callbacks = batchedItems;<br />        batchedItems = [];<br />        <span style="color: rgb(0, 0, 255);">for</span> (<span style="color: rgb(0, 0, 255);">var</span> i = 0; i &lt; callbacks.length; i++) {<br />            callbacks[i]();<br />        }<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 255);">function</span> () {<br />        batchTimeout.cancel();<br />        batchTimeout = WinJS.Promise.timeout(waitPeriod || 64).then(completeBatch);<br /><br />        <span style="color: rgb(0, 0, 255);">var</span> delayedPromise = <span style="color: rgb(0, 0, 255);">new</span> WinJS.Promise(<span style="color: rgb(0, 0, 255);">function</span> (c) {<br />            batchedItems.push(c);<br />        });<br /><br />        <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 255);">function</span> (v) {<br />            <span style="color: rgb(0, 0, 255);">return</span> delayedPromise.then(<span style="color: rgb(0, 0, 255);">function</span> () {<br />                <span style="color: rgb(0, 0, 255);">return</span> v;<br />            });<br />        };<br />    };<br />}<br /></pre>
  </div>
</blockquote>

<p>Novamente, o <b>createBatch</b> é solicitado apenas <i>uma vez</i> e o resultado do seu <b>thumbnailBatch</b> é solicitado para <i>cada </i>item renderizado<i> </i>na lista. O manipulador concluído que o <b>thumbnailBatch</b> cria é, então, solicitado sempre que uma operação <b>loadImage</b> é concluída.</p>

<p>Este manipulador concluído poderia também ter sido diretamente inserido na função de renderização, mas o que estamos tentando fazer aqui é coordenar atividades <i>em vários itens </i>em vez de um item de cada vez. Esta coordenação é obtida por meio de duas variáveis criadas e inicializadas no início do <b>createBatch</b>: <i>batchedTimeout</i>, inicializado como uma promessa vazia e <i>batchedItems</i>, inicializado como uma matriz de funções que, inicialmente, está vazia. <b>createBatch</b> também declara uma função <b>completeBatch</b>, que simplesmente descarta os <i>batchedItems</i>, solicitando cada função na matriz:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">function</span> createBatch(waitPeriod) {<br />    <span style="color: rgb(0, 0, 255);">var</span> batchTimeout = WinJS.Promise.<span style="color: rgb(0, 0, 255);">as</span>();<br />    <span style="color: rgb(0, 0, 255);">var</span> batchedItems = [];<br /><br />    <span style="color: rgb(0, 0, 255);">function</span> completeBatch() {<br />        <span style="color: rgb(0, 0, 255);">var</span> callbacks = batchedItems;<br />        batchedItems = [];<br />        <span style="color: rgb(0, 0, 255);">for</span> (<span style="color: rgb(0, 0, 255);">var</span> i = 0; i &lt; callbacks.length; i++) {<br />            callbacks[i]();<br />        }<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 255);">function</span> () {<br />        batchTimeout.cancel();<br />        batchTimeout = WinJS.Promise.timeout(waitPeriod || 64).then(completeBatch);<br /><br />        <span style="color: rgb(0, 0, 255);">var</span> delayedPromise = <span style="color: rgb(0, 0, 255);">new</span> WinJS.Promise(<span style="color: rgb(0, 0, 255);">function</span> (c) {<br />            batchedItems.push(c);<br />        });<br /><br />        <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 255);">function</span> (v) {<br />            <span style="color: rgb(0, 0, 255);">return</span> delayedPromise.then(<span style="color: rgb(0, 0, 255);">function</span> () {<br />                <span style="color: rgb(0, 0, 255);">return</span> v;<br />            });<br />        };<br />    };<br />}<br /></pre>
  </div>
</blockquote>

<p>Agora, vejamos o que acontece dentro do <b>thumbnailBatch</b> (a função retornada do <b>createBatch</b>), que é novamente solicitada para cada item sendo renderizado. Primeiro, <i>cancelamos</i> qualquer <i>batchedTimeout</i> existente e imediatamente o recriamos:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">batchTimeout<span style="color: rgb(255, 0, 0);">.</span>cancel();<br />        batchTimeout = WinJS<span style="color: rgb(255, 0, 0);">.</span>Promise<span style="color: rgb(255, 0, 0);">.</span>timeout(waitPeriod || 64)<span style="color: rgb(255, 0, 0);">.</span>then(completeBatch);<br /></pre>
  </div>
</blockquote>

<p>A segunda linha mostra o padrão futuro de entrega/cumprimento que discutimos na postagem All About Promises &lt;TODO: link>: ele diz para solicitar o <b>completeBatch</b> após um atraso de <i>waitPeriod</i> milissegundos (com um padrão de 64ms). Isto significa que enquanto o <b>thumbnailBatch</b> estiver sendo solicitado novamente dentro do <i>waitPeriod</i> de uma solicitação anterior, o <b>batchTimeout</b> será redefinido para um outro <i>waitPeriod</i>. E, como o <b>thumbnailBatch</b> só é solicitado <i>após </i>que uma solicitação <b>item.loadImage</b> seja concluída, estamos, na verdade dizendo que quaisquer operações <b>loadImage</b> que forem concluídas dentro do <i>waitPeriod</i> da anterior, será incluída no mesmo lote. Quando existe uma lacuna maior do que o <i>waitPeriod</i>, o lote é processado — imagens são adicionadas ao DOM — e o próximo lote começa.</p>

<p>Após manipular este tempo de espera, o <b>thumbnailBatch</b> cria uma nova promessa que simplesmente envia a função despachante concluída para dentro da matriz <i>batchedItems</i>:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> delayedPromise = <span style="color: rgb(0, 0, 255);">new</span> WinJS.Promise(<span style="color: rgb(0, 0, 255);">function</span> (c) {<br />         batchedItems.push(c);<br />     });<br /></pre>
  </div>
</blockquote>

<p>Lembre-se do All About Promises &lt;TODO: link> que uma promessa é apenas uma construção de código e isso é tudo o que temos aqui. A nova promessa criada não possui um comportamento assíncrono por si própria: estamos apenas adicionando a função despachante concluída <i>c</i>, para o <i>batchedItems</i>. Obviamente, não fazemos nada com o despachante até que o <i>batchedTimeout</i> seja concluído de forma assíncrona, portanto, existe de fato, um relacionamento assíncrono aqui. Quando acontece o tempo de espera e limpamos o lote (dentro do <b>completeBatch</b>), invocaremos quaisquer manipuladores concluídos que tenham sido dados ao <b>delayedPromise.then</b>.</p>

<p>Isto nos traz às últimas linhas de código no <b>createBatch</b>, que é a função retornada pelo <b>thumbnailBatch</b>. Essa função é exatamente o manipulador concluído que é inserido dentro de toda a cadeia de promessa do renderizador:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 255);">function</span> (v) {<br />           <span style="color: rgb(0, 0, 255);">return</span> delayedPromise.then(<span style="color: rgb(0, 0, 255);">function</span> () {<br />               <span style="color: rgb(0, 0, 255);">return</span> v;<br />           });<br />       };<br /></pre>
  </div>
</blockquote>

<p>Na verdade, vamos inserir este código diretamente na cadeia de promessa para vermos os relacionamentos resultantes:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">return</span> item.loadImage(item.data.thumbnail);<br />          }).then(<span style="color: rgb(0, 0, 255);">function</span> (v) {<br />              <span style="color: rgb(0, 0, 255);">return</span> delayedPromise.then(<span style="color: rgb(0, 0, 255);">function</span> () {<br />                  <span style="color: rgb(0, 0, 255);">return</span> v;<br />              });<br />          ).then(<span style="color: rgb(0, 0, 255);">function</span> (newimg) {<br /></pre>
  </div>
</blockquote>

<p>Agora, podemos ver que o argumento <i>v</i> é o resultado do <b>item.loadImage</b>, que é o elemento <i>img</i> criado para nós. Se não quiséssemos fazer o loteamento, bastaria dizer <b>return WinJS.Promise.as(v)</b> e a cadeia inteira ainda funcionaria: <i>v</i> seria, então, passado de forma assíncrona e seria exibido como <i>newimg</i> na etapa seguinte.</p>

<p>Entretanto, em vez disso, estamos retornando a promessa do <b>delayedPromise.then</b> que não será cumprida — com <i>v</i> — até que a atual <i>batchedTimeout</i> seja cumprida. Neste momento — quando houver novamente uma lacuna de <i>waitPeriod</i> entre as conclusões do <b>loadImage</b> —, estes elementos <i>img</i> serão entregues à etapa seguinte na cadeia, onde serão adicionados ao DOM.</p>

<p>E é isso!</p>

<h2>Conclusão</h2>

<p>As cinco diferentes funções de renderização demonstradas na <a href="http://code.msdn.microsoft.com/windowsapps/ListView-performance-39fb71f0" target="_blank">amostra de desempenho de otimização do ListView em HTML</a> têm uma coisa em comum: elas mostram como o relacionamento assíncrono entre o ListView e o renderizador — expressado por meio de promessas — possibilita uma enorme flexibilidade ao renderizador sobre como e quando ele produz elementos para os itens na lista. Ao escrever os seus próprios aplicativos, a estratégia a ser usada para a otimização do ListView depende muito do tamanho da sua fonte de dados, da complexidade dos próprios itens e do volume de dados que você está obtendo de forma assíncrona para esses itens (como baixar imagens remotas). Com certeza, você desejará manter os renderizadores de itens o mais simples que puder, para ainda atender os seus objetivos de desempenho. Em todo caso, você agora tem todas as ferramentas de que precisa para ajudar o ListView e o seu aplicativo a alcançarem o melhor desempenho.</p>

<p>Kraig Brockschmidt 
  <br />Gerente de programas, equipe de ecossistema do Windows 

  <br />Autor, <a href="http://blogs.msdn.com/b/microsoft_press/archive/2012/10/29/free-ebook-programming-windows-8-apps-with-html-css-and-javascript.aspx"><i>Programming Windows 8 Apps in HTML, CSS, and JavaScript</i></a> (Programando aplicativos do Windows 8 em HTML, CSS e JavaScript)</p>
<!-- Title: “Otimizar a renderização de item do ListView” Tags: “Aplicativo da Windows Store, renderizar, loteamento, lote, renderização, ListView” --></div>]]></content:encoded>
    </item>
    <item>
      <title>Junte-se ao Game On Virtual Event</title>
      <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/junte-se-ao-game-on-virtual-event</link>
      <pubDate>Wed, 12 Jun 2013 11:33:54 GMT</pubDate>
      <dc:creator><![CDATA[Windows 8 Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windowsappdev_br/2013/06/12/junte-se-ao-game-on-virtual-event/</guid>
      <description><![CDATA[Os jogos são uma classe de aplicativos fundamental na Windows Store. Se você deseja criar um jogo...]]></description>
      <content:encoded><![CDATA[<div class="PostContent"> <p>Os jogos são uma classe de aplicativos fundamental na Windows Store. Se você deseja criar um jogo para a Windows Store, gostaríamos de ajudá-lo com evento virtual sobre criação de jogos. O evento é gratuito e estará aberto para os novos desenvolvedores de jogos e também para os profissionais. </p>  <p>Usaremos o <a href="https://aka.ms/yoyogamesgamemaker" target="_blank">GameMaker: Studio</a> da YoYo Games, para mostrar a você como criar e publicar jogos de alta qualidade em menos tempo. O GameMaker: Studio possui muitas opções internas de criação e ferramentas de arrastar e soltar que ajudam você a começar, mesmo que não tenha uma ideia para um jogo ou experiência em criação. No entanto, se você for um desenvolvedor mais experiente, as ferramentas avançadas o ajudarão a criar uma experiência de jogo única. </p>  <p><a href="https://aka.ms/gameonevent"><img title="clip_image002" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/8666.clip_image002_0385EAB3.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8666.clip_5F00_image002_5F00_0385EAB3.jpg" width="500" height="154" /></a></p>  <p>Os eventos online começarão no sábado, 15 de junho, às 10 da manhã (Horário de Verão do Pacífico), com uma sessão de lançamento e um chat ao vivo. Você aprenderá sobre tipos diferentes de jogos e como adicionar elementos gráficos, fases e sons durante a criação de um jogo, além de explorar maneiras de deixar o jogo do seu jeito. O suporte continuará durante a semana com assistência individual por meio dos fóruns do GameMaker.</p>  <p>Para você que é um estudante, um desenvolvedor de primeira viagem ou um profissional experiente, este evento será o seu ponto de partida para criar, carregar e publicar jogos na Windows Store. Descubra mais, inscreva-se e confira as ferramentas e os recursos gratuitos em <a href="http://msdnevents.com/gameon/" target="_blank">http://msdnevents.com/gameon/</a>. </p>  <p>--Robert Rodriguez-Lawson, gerente de publicação de conteúdo sênior, conteúdo para desenvolvedores do Windows</p> <!-- Title: “Junte-se ao Game On Virtual Event” Tags: “jogos da Windows Store, jogos, Vamos jogar, eventos” --></div>]]></content:encoded>
    </item>
    <item>
      <title>Cofre de Credenciais: Sua solução para lidar com nomes de usuário e senhas no seu aplicativo da Windows Store</title>
      <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/cofre-de-credenciais-sua-soluo-para-lidar-com-nomes-de-usurio-e-senhas-no-seu-aplicativo-da-windows-store</link>
      <pubDate>Tue, 04 Jun 2013 19:44:29 GMT</pubDate>
      <dc:creator><![CDATA[Windows 8 Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windowsappdev_br/2013/06/04/cofre-de-credenciais-sua-soluo-para-lidar-com-nomes-de-usurio-e-senhas-no-seu-aplicativo-da-windows-store/</guid>
      <description><![CDATA[Você ainda não ouviu falar sobre o Cofre de Credenciais que está disponível para os aplicativos da...]]></description>
      <content:encoded><![CDATA[<div class="PostContent"> <p>Você ainda não ouviu falar sobre o <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465069.aspx" target="_blank">Cofre de Credenciais</a> que está disponível para os aplicativos da Windows Store? Então, está mais do que na hora. Por quê? Porque ele não apenas simplifica a tarefa de <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465060.aspx" target="_blank">armazenar</a> e <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/jj839731.aspx" target="_blank">recuperar as credenciais do usuário</a>, ele as armazena de forma segura, e as credenciais acompanham os usuários "gratuitamente" com a conta da Microsoft.</p>  <p>Vamos supor que você tenha um aplicativo que se conecte a um serviço para acessar recursos protegidos, como arquivos de mídia, rede social etc. O seu serviço exige informações de logon para cada usuário. Portanto, você incorporou a interface do usuário no seu aplicativo, que obtém o nome de usuário e a senha para o usuário, que são usados para fazer o logon do usuário no serviço. Tudo funciona perfeitamente.</p>  <p>Agora você deseja facilitar mais as coisas para os usuários e armazenar suas informações de logon de forma segura para que não precisem fazer logon toda vez que usarem o seu aplicativo. Insira o Cofre de Credenciais. Com apenas algumas chamadas simples para a API do Cofre de Credenciais, você pode armazenar o nome de usuário e a senha para o usuário e recuperá-los facilmente para fazer o logon do usuário na próxima vez que ele abrir o seu aplicativo.</p>  <h2>Armazenamento seguro</h2>  <p>A excelente vantagem que o Cofre de Credenciais oferece ao seu aplicativo é armazenar as credenciais do usuário em um local seguro, e essas informações são criptografadas quando armazenadas em disco. Você com certeza poderia armazenar as credenciais dos seus usuários em um arquivo no armazenamento local do seu aplicativo, mas armazená-las em texto sem formatação apresenta uma falha de segurança considerável. Se o sistema de um usuário for comprometido de alguma forma, o nome de usuário e senha dele poderão ser facilmente acessados e manipulados. Armazenando o nome de usuário e a senha com o Cofre de Credenciais, o máximo que uma fonte mal-intencionada poderia conseguir capturar seria um arquivo criptografado.</p>  <p>O Cofre de Credenciais é exclusivo para cada usuário do PC do Windows, e o acesso a uma credencial é limitado ao aplicativo armazenado nela. Isto é, você somente pode recuperar uma credencial que tiver armazenado para o seu aplicativo. Da mesma forma, nenhum outro aplicativo poderá obter as credenciais que o seu aplicativo tiver armazenado no cofre.</p>  <h2>Credenciais móveis</h2>  <p>Um benefício adicional para os seus usuários é que, quando você armazena o nome de usuário e a senha dele usando o Cofre de Credenciais, as credenciais armazenadas acompanham a conta da Microsoft dele em qualquer outro computador confiável usado por ele com essa conta da Microsoft. Isso torna o seu aplicativo seguro ainda mais prático para os seus usuários porque o seu aplicativo fará o logon deles automaticamente — sem solicitar as credenciais novamente — de qualquer computador confiável em que eles tiverem instalado o seu aplicativo e associado a sua conta da Microsoft.</p>  <p>As coisas funcionam um pouco diferente em contas de domínio. Se houver credenciais armazenadas com a sua conta da Microsoft e você associar essa conta a uma conta de domínio (como a conta que você usa no trabalho), as suas credenciais serão transferidas para essa conta de domínio. No entanto, quaisquer novas credenciais adicionadas enquanto o usuário estiver conectado com a conta de domínio não serão transferidas. Isso garante que as credenciais privadas do domínio não sejam expostas fora do domínio.</p>  <h2>Armazenando as credenciais do usuário</h2>  <p>Armazenar as credenciais do usuário no Cofre de Credenciais é um processo rápido de duas etapas. Primeiro, você obtém uma referência para o Cofre de Credenciais usando o objeto <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.passwordvault.aspx" target="_blank">PasswordVault</a> no namespace <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.aspx" target="_blank">Windows.Security.Credentials</a>. Depois, você cria um objeto <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.passwordcredential.aspx" target="_blank">PasswordCredential</a> com um identificador do seu aplicativo, o nome de usuário e a senha, e transfere isso para o método <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh701231.aspx" target="_blank">PasswordVault.Add()</a> para adicionar a credencial ao cofre.</p>  <p><strong>C#</strong></p>  <blockquote>   <div id="codeSnippetWrapper">     <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">var vault = <span style="color: rgb(0, 0, 255);">new</span> Windows.Security.Credentials.PasswordVault();<br />vault.Add(<span style="color: rgb(0, 0, 255);">new</span> Windows.Security.Credentials.PasswordCredential(<br />    <span style="color: rgb(0, 96, 128);">&quot;My App&quot;</span>, username, password));<br /></pre>
  </div>
</blockquote>

<p><strong>JavaScript</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> vault = <span style="color: rgb(0, 0, 255);">new</span> Windows.Security.Credentials.PasswordVault();<br />vault.add(<span style="color: rgb(0, 0, 255);">new</span> Windows.Security.Credentials.PasswordCredential(<br />    <span style="color: rgb(0, 96, 128);">&quot;My App&quot;</span>, username, password));<br /></pre>
  </div>
</blockquote>

<h2>Recuperando as credenciais do usuário</h2>

<p>Há várias opções para recuperar as credenciais do usuário do Cofre de Credenciais depois de obter uma referência ao objeto <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.passwordvault.aspx" target="_blank">PasswordVault</a>.</p>

<ul>
  <li>Você pode recuperar todas as credenciais fornecidas pelo usuário para o seu aplicativo no cofre com o método <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.passwordvault.retrieveall.aspx" target="_blank">PasswordVault.RetrieveAll()</a>.</li>

  <li>Se souber o nome de usuário das credenciais armazenadas, você poderá recuperar todas as credenciais desse nome de usuário com o método <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.passwordvault.findallbyusername.aspx" target="_blank">PasswordVault.FindAllByUserName()</a>.</li>

  <li>Se souber o nome do recurso das credenciais armazenadas, você poderá recuperar todas as credenciais do nome desse recurso com o método <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.passwordvault.findallbyresource.aspx" target="_blank">PasswordVault.FindAllByResource()</a>.</li>

  <li>Se souber o nome de usuário e o nome do recurso de uma credencial, você poderá recuperar apenas essa credencial com o método <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.passwordvault.retrieve.aspx" target="_blank">PasswordVault.Retrieve()</a>.</li>
</ul>

<p>Vejamos um exemplo em que armazenamos o nome do recurso globalmente em um aplicativo e fazemos o logon do usuário automaticamente se localizarmos uma credencial para ele. No caso de localizarmos várias credenciais do usuário, solicitamos que o usuário selecione uma credencial padrão para usar ao fazer logon.</p>

<p><strong>C#</strong></p>

<blockquote>
  <div>
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 255);">string</span> resourceName = <span style="color: rgb(0, 96, 128);">&quot;My App&quot;</span>;<br /><span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 255);">string</span> defaultUserName;<br /><br /><span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 255);">void</span> Login()<br />{<br />    var loginCredential = GetCredentialFromLocker();<br /><br />    <span style="color: rgb(0, 0, 255);">if</span> (loginCredential != <span style="color: rgb(0, 0, 255);">null</span>)<br />    {<br />        <span style="color: rgb(0, 128, 0);">// There is a credential stored in the locker.</span><br />        <span style="color: rgb(0, 128, 0);">// Populate the Password property of the credential</span><br />        <span style="color: rgb(0, 128, 0);">// for automatic login.</span><br />        loginCredential.RetrievePassword();<br />    }<br />    <span style="color: rgb(0, 0, 255);">else</span><br />    {<br />        <span style="color: rgb(0, 128, 0);">// There is no credential stored in the locker.</span><br />        <span style="color: rgb(0, 128, 0);">// Display UI to get user credentials.</span><br />        loginCredential = GetLoginCredentialUI();<br />    }<br /><br />    <span style="color: rgb(0, 128, 0);">// Log the user in.</span><br />    ServerLogin(loginCredential.UserName, loginCredential.Password);<br />}<br /><br /><br /><span style="color: rgb(0, 0, 255);">private</span> Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker()<br />{<br />    Windows.Security.Credentials.PasswordCredential credential = <span style="color: rgb(0, 0, 255);">null</span>;<br /><br />    var vault = <span style="color: rgb(0, 0, 255);">new</span> Windows.Security.Credentials.PasswordVault();<br />    var credentialList = vault.FindAllByResource(resourceName);<br />    <span style="color: rgb(0, 0, 255);">if</span> (credentialList.Count &gt; 0)<br />    {<br />        <span style="color: rgb(0, 0, 255);">if</span> (credentialList.Count == 1)<br />        {<br />            credential = credentialList[0];<br />        }<br />        <span style="color: rgb(0, 0, 255);">else</span><br />        {<br />            <span style="color: rgb(0, 128, 0);">// When there are multiple usernames,</span><br />            <span style="color: rgb(0, 128, 0);">// retrieve the default username. If one doesn’t</span><br />            <span style="color: rgb(0, 128, 0);">// exist, then display UI to have the user select</span><br />            <span style="color: rgb(0, 128, 0);">// a default username.</span><br /><br />            defaultUserName = GetDefaultUserNameUI();<br /><br />            credential = vault.Retrieve(resourceName, defaultUserName);<br />        }<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">return</span> credential;<br />}<br /></pre>
  </div>
</blockquote>

<div>
  <br /><strong>JavaScript</strong></div>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> resourceName = <span style="color: rgb(0, 96, 128);">&quot;My App&quot;</span>;<br /><span style="color: rgb(0, 0, 255);">var</span> defaultUserName;<br /><br /><span style="color: rgb(0, 0, 255);">function</span> login() {<br />    <span style="color: rgb(0, 0, 255);">var</span> loginCredential = getCredentialFromLocker();<br /><br />    <span style="color: rgb(0, 0, 255);">if</span> (loginCredential != <span style="color: rgb(0, 0, 255);">null</span>) {<br />        <span style="color: rgb(0, 128, 0);">// There is a credential stored in the locker.</span><br />        <span style="color: rgb(0, 128, 0);">// Populate the Password property of the credential</span><br />        <span style="color: rgb(0, 128, 0);">// for automatic login.</span><br />        loginCredential.retrievePassword();<br />    } <span style="color: rgb(0, 0, 255);">else</span> {<br />        <span style="color: rgb(0, 128, 0);">// There is no credential stored in the locker.</span><br />        <span style="color: rgb(0, 128, 0);">// Display UI to get user credentials.</span><br />        loginCredential = getLoginCredentialUI();<br />    }<br /><br />    <span style="color: rgb(0, 128, 0);">// Log the user in.</span><br />    serverLogin(loginCredential.userName, loginCredential.password);<br />}<br /><br /><br /><span style="color: rgb(0, 0, 255);">function</span> GetCredentialFromLocker() {<br />    <span style="color: rgb(0, 0, 255);">var</span> credential = <span style="color: rgb(0, 0, 255);">null</span>;<br /><br />    <span style="color: rgb(0, 0, 255);">var</span> vault = <span style="color: rgb(0, 0, 255);">new</span> Windows.Security.Credentials.PasswordVault();<br />    <span style="color: rgb(0, 0, 255);">var</span> credentialList = vault.findAllByResource(resourceName);<br />    <span style="color: rgb(0, 0, 255);">if</span> (credentialList.length &gt; 0) {<br />        <span style="color: rgb(0, 0, 255);">if</span> (credentialList.length == 1) {<br />            credential = credentialList[0];<br />        } <span style="color: rgb(0, 0, 255);">else</span> {<br />            <span style="color: rgb(0, 128, 0);">// When there are multiple usernames,</span><br />            <span style="color: rgb(0, 128, 0);">// retrieve the default username. If one doesn’t</span><br />            <span style="color: rgb(0, 128, 0);">// exist, display UI to have the user select</span><br />            <span style="color: rgb(0, 128, 0);">// a default username.</span><br /><br />            defaultUserName = getDefaultUserNameUI();<br />            credential = vault.retrieve(resourceName, defaultUserName);<br />        }<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">return</span> credential;<br />}<br /></pre>
  </div>
</blockquote>

<h2>Excluindo credenciais do usuário</h2>

<p>Excluir as credenciais do usuário no Cofre de Credenciais também é um processo rápido de duas etapas. Novamente, você obtém uma referência para o Cofre de Credenciais usando o objeto <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.passwordvault.aspx" target="_blank">PasswordVault</a> no namespace <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.aspx" target="_blank">Windows.Security.Credentials</a>. Depois, você passa a credencial que deseja excluir para o método <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh701242.aspx" target="_blank">PasswordVault.Remove()</a>.</p>

<p><strong>C#</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">var vault = <span style="color: rgb(0, 0, 255);">new</span> Windows.Security.Credentials.PasswordVault();<br />vault.Remove(<span style="color: rgb(0, 0, 255);">new</span> Windows.Security.Credentials.PasswordCredential(<br />    <span style="color: rgb(0, 96, 128);">&quot;My App&quot;</span>, username, password));<br /></pre>
  </div>
</blockquote>

<p><strong>JavaScript</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> vault = <span style="color: rgb(0, 0, 255);">new</span> Windows.Security.Credentials.PasswordVault();<br />vault.remove(<span style="color: rgb(0, 0, 255);">new</span> Windows.Security.Credentials.PasswordCredential(<br />    <span style="color: rgb(0, 96, 128);">&quot;My App&quot;</span>, username, password));<br /></pre>
  </div>
</blockquote>

<h2>Fácil e seguro</h2>

<p>Como você pode ver, o Cofre de Credenciais é um recurso fácil de usar que simplifica a sua tarefa de autenticar usuários e armazenar as credenciais deles para uso futuro, tudo de uma forma altamente segura.</p>

<p>Outros tópicos de autenticação de aplicativos do Windows 8 incluem o <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465281.aspx" target="_blank">agente de autenticação da Web</a>, que você pode usar para recuperar um token de autenticação de um site (por exemplo, OAuth) e <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh770853.aspx" target="_blank">a personalização do seu aplicativo com base na conta da Microsoft de um usuário</a>.</p>

<p>Para obter mais informações, consulte</p>

<ul>
  <li><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211367.aspx" target="_blank">Gerenciando informações de usuários (JavaScript)</a></li>

  <li><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/xaml/BR229572(v=win.10).aspx" target="_blank">Managing user info (Windows Store apps using C#/VB/C++ and XAML) (Gerenciando as informações do usuário (aplicativos da Windows Store usando C#/VB/C++ e XAML))</a></li>

  <li><a href="http://code.msdn.microsoft.com/windowsapps/PasswordVault-f01be74a" target="_blank">Exemplo de Cofre de Credenciais</a></li>

  <li><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.security.credentials.aspx" target="_blank">Windows.Security.Credentials</a></li>
</ul>

<p><i></i></p>

<p>--Doug Rothaus, desenvolvedor de conteúdo sênior, Conteúdo para desenvolvedores do Windows</p>

<p>Agradecimentos especiais para Yashar Bahman por sua ajuda e contribuições para esta postagem.</p>
<!-- Title: “Cofre de Credenciais: Sua solução para lidar com nomes de usuário e senhas no seu aplicativo da Windows Store” Tags: “recuperando credenciais, armazenando credenciais, armazenamento seguro, Cofre de Credenciais” --></div>]]></content:encoded>
    </item>
    <item>
      <title>Criar aplicativos com reconhecimento de local usando geolocalização e Mapas Bing</title>
      <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/criar-aplicativos-com-reconhecimento-de-local-usando-geolocalizao-e-mapas-bing</link>
      <pubDate>Tue, 28 May 2013 11:06:07 GMT</pubDate>
      <dc:creator><![CDATA[Windows 8 Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windowsappdev_br/2013/05/28/criar-aplicativos-com-reconhecimento-de-local-usando-geolocalizao-e-mapas-bing/</guid>
      <description><![CDATA[Ao experimentar em conjunto a localização de um usuário com a lógica de negócios do seu aplicativo,...]]></description>
      <content:encoded><![CDATA[<div class="PostContent"> <p>Ao experimentar em conjunto a localização de um usuário com a lógica de negócios do seu aplicativo, você pode fornecer facilmente aos usuários do aplicativo detalhes sobre a previsão do tempo, cupons, eventos esportivos ou concertos para sua localização atual. Você pode usar as funcionalidades de <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br229921.aspx" target="_blank">geolocalização</a> do Windows 8, juntamente com o SDK do Mapas Bing, para criar ótimos <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465148.aspx" target="_blank">aplicativos da Windows Store com reconhecimento de local</a>.</p>  <p>Vejamos como seu aplicativo pode usar o <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br225603.aspx" target="_blank">serviço de localização</a> para fornecer aos usuários informações específicas do local com um endereço IP, uma rede WiFi ou dados de GPS. Após saber a localização, você poderá usar o SDK do Mapas Bing para mostrar ao usuário onde ele está. </p>  <h2>Recuperando sua localização</h2>  <p>O namespace <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.devices.geolocation.aspx">Windows.Devices.Geolocation</a> é usado para recuperar sua localização. Se você usará o GPS, uma rede WiFi ou um endereço IP para recuperar a localização de um usuário dependerá de dois fatores básicos:</p>  <ol>   <li>O nível de precisão solicitado. Este é o nível de precisão ideal para atender as necessidades do seu aplicativo. </li>    <li>A disponibilidade dos dados de localização. Nem todos os dispositivos têm GPS interno. Ou talvez não haja uma rede ou conexão Wi-Fi disponível quando a localização for solicitada.</li> </ol>  <h3><a>Precisão desejada</a></h3>  <p>Ao solicitar uma localização, seu aplicativo deve especificar a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.devices.geolocation.geolocator.desiredaccuracy.aspx" target="_blank">precisão desejada</a> para que os dados de localização possam ser retornados o mais rápido possível no intervalo determinado. Cada um dos tipos de local tem um grau de precisão:</p>  <ul>   <li><a href="http://pt.wikipedia.org/wiki/Gps" target="_blank">GPS</a> – o GPS fornece a maior precisão, até aproximadamente 10 metros. No entanto, se o sensor do GPS precisar ser ativado e adquirir dados de satélite para em seguida fazer a triangulação dos dados, ele poderá levar um ou dois minutos para retornar os detalhes da localização. Mas após o GPS adquirir as conexões de satélite, será possível obter o próximo ponto de localização com mais rapidez. Obviamente que quanto mais o GPS for usado, mais energia consumirá. A propriedade <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.devices.geolocation.geolocator.desiredaccuracy.aspx" target="_blank">Geolocator.DesiredAccuracy</a> deve ser definida como High (Alta) para permitir que o GPS adquira os dados.</li>    <li><a href="http://pt.wikipedia.org/wiki/Wi-Fi" target="_blank">Wi-Fi</a> – uma conexão Wi-Fi pode fornecer uma precisão entre 300-500 metros. Se houver uma conexão, os dados de localização serão retornados mais rapidamente do que um GPS poderá obter dados de satélite. Defina a propriedade DesiredAccuracy como Default (Padrão) para obter a localização com Wi-Fi.</li>    <li><a href="http://pt.wikipedia.org/wiki/IP_address" target="_blank">IP</a> – a resolução no nível do IP pode fornecer uma precisão dentro de 1 quilômetro, aproximadamente. Se houver uma conexão de rede, os dados de localização serão retornados mais rapidamente do que um GPS poderá obter uma conexão de satélite. Você também define a propriedade DesiredAccuracy como Default (Padrão) para obter a localização com IP. O serviço de localização retorna a maior precisão possível e permite que você saiba o grau de precisão na propriedade <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.devices.geolocation.geocoordinate.accuracy.aspx" target="_blank">Geocoordinate.Accuracy</a>.</li> </ul>  <p>Preste atenção ao valor de precisão desejado. Ele pode afetar o desempenho e o consumo de energia do seu aplicativo. Por exemplo, se o seu aplicativo fornecer previsões de tempo, você raramente precisará da alta precisão do GPS. Além disso, não deixe de indicar a precisão dos seus dados exibindo o radius de erro baseado na precisão dos dados retornados. Aqui está o código C# para definir a precisão desejada:</p>  <p><strong>C#</strong></p>  <blockquote>   <div id="codeSnippetWrapper">     <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">Geolocator geolocator = <span style="color: rgb(0, 0, 255);">new</span> Geolocator();<br />geolocator.DesiredAccuracy = Windows.Devices.Geolocation.PositionAccuracy.High;<br /></pre>
  </div>
</blockquote>

<br />Independente da precisão que você desejar, a chamada para obter sua localização é: 

<p><strong>C#</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">Geoposition pos = await geolocator.GetGeopositionAsync().AsTask(token);</pre>
  </div>
</blockquote>

<p>Aqui está o código JavaScript que cria uma instância da classe Geolocator, define a precisão desejada e obtém a localização atual. Observe que a variável "promise" abaixo é um objeto <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211867.aspx" target="_blank">WinJS.Promise</a> – você precisará usar o método <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh701079.aspx" target="_blank">done</a> para acessar os dados da chamada para <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br225537.aspx" target="_blank">getGeopositionAsync</a>.</p>

<p><strong>JavaScript</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> geolocator = Windows.Devices.Geolocation.Geolocator();<br />geolocator.desiredAccuracy =<br />Windows.Devices.Geolocation.PositionAccuracy.high;<br /><br /><span style="color: rgb(0, 128, 0);">// Get the geoposition, capturing the request in a 'promise' object.</span><br /><span style="color: rgb(0, 0, 255);">var</span> promise = geolocator.getGeopositionAsync();<br /></pre>
  </div>
</blockquote>

<br />Lembre-se de que se você definir a precisão desejada como High (Alta), não terá certeza de que o dispositivo do usuário retornará a maior precisão. O PC do usuário talvez não tenha um GPS ou este poderá estar desligado ou não conectado ao Wi-Fi, etc. Esteja sempre preparado para processar normalmente essas instâncias de dados de precisão menor. Como você fará isso dependerá da funcionalidade do seu aplicativo. É possível continuar com a menor precisão? É possível solicitar precisão no nível do GPS? Consulte as <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465148.aspx" target="_blank">Diretrizes para aplicativos com reconhecimento de local</a> para obter mais informações. 

<h3>Mapas Bing</h3>

<p>O <a href="http://apps.microsoft.com/webpdp/app/97a2179c-38be-45a3-933e-0d2dbf14a142" target="_blank">aplicativo Mapas Bing</a> é um bom exemplo de um aplicativo que se adapta à precisão dos dados de localização disponíveis. Em um PC desktop, que em geral não tem um GPS ou Wi-Fi, ele acha a localização com base no endereço IP e a <a>amplia para um nível de região ao mapear </a>o local atual. Em um laptop, que normalmente tem uma placa sem fio, o aplicativo usa a conexão Wi-Fi para obter uma localização mais precisa e a amplia ainda mais ao mostrar a localização atual. Se o usuário ampliar mais ainda, o ícone da localização atual mostrará um radius de erro. Em um dispositivo com GPS, o Mapas Bing obtém os dados de localização de maior precisão do GPS e exibe uma localização mais precisa.</p>

<h3>Bing Meteorologia</h3>

<p>Como mencionado acima, um aplicativo como o <a href="http://apps.microsoft.com/webpdp/app/421ba874-f903-4965-9b82-d60f3ba3cae0" target="_blank">Bing Meteorologia</a> precisa somente das informações de região. Por isso, ele pode especificar a necessidade apenas da menor precisão, permitindo a obtenção rápida de um valor de localização. Isso aumenta a capacidade de resposta do aplicativo para o usuário. Outros exemplos de aplicativos que podem precisar somente das informações de nível regional incluem guias de estações de rádio, ofertas de compras ou feeds de notícias locais.</p>

<h2>Exibindo dados de localização com o SDK do Mapas Bing</h2>

<p>Após obter as informações de localização de sua chamada para <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.devices.geolocation.geolocator.getgeopositionasync.aspx" target="_blank">GetGeopositionAsync</a>, você desejará exibi-las em um mapa.</p>

<ul>
  <li>Primeiro, converta a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.devices.geolocation.geoposition.aspx" target="_blank">Geoposição</a> em uma <a href="http://msdn.microsoft.com/pt-br/library/hh846500.aspx" target="_blank">Localização</a> que possa ser usada com o Mapas Bing, use o código a seguir:</li>
</ul>

<p> </p>

<p><strong>C#</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">Location location = <span style="color: rgb(0, 0, 255);">new</span> Location(pos.Coordinate.Latitude, pos.Coordinate.Longitude);</pre>
  </div>
</blockquote>

<p><strong>JavaScript:</strong></p>

<blockquote>
  <div>
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">promise.done(<br />  <span style="color: rgb(0, 0, 255);">function</span> (pos) {<br />    <span style="color: rgb(0, 128, 0);">// Get the coordinates of the current location.</span><br />    <span style="color: rgb(0, 0, 255);">var</span> coord = pos.coordinate,<br />    location = <span style="color: rgb(0, 0, 255);">new</span> Microsoft.Maps.Location(coord.latitude, coord.longitude);<br /> <br />  },<br />  <span style="color: rgb(0, 0, 255);">function</span> (err) {<br />    <span style="color: rgb(0, 128, 0);">// Handle the error.</span><br />  });<br /></pre>
  </div>
</blockquote>

<p> </p>

<ul>
  <li>Em seguida, exiba sua localização usando o Mapas Bing. Você pode obter o SDK do Mapas Bing <a href="http://visualstudiogallery.msdn.microsoft.com/bb764f67-6b2c-4e14-b2d3-17477ae1eaca">aqui</a>. Você também precisará obter uma chave do Mapas Bing fazendo o registro no Portal do Mapas Bing e seguindo as instruções para <a href="http://msdn.microsoft.com/pt-br/library/ff428642.aspx">Obter uma Chave do Mapas Bing</a>. Ao se registrar, não deixe de ver as restrições de uso para cada tipo de chave e escolha uma que seja apropriada para seu aplicativo. 

    <br />Adicione um controle do Mapas Bing ao seu designer e insira sua chave nas credenciais.</li>
</ul>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">Page</span><br />    <span style="color: rgb(255, 0, 0);">xmlns</span><span style="color: rgb(0, 0, 255);">=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span><br />    <span style="color: rgb(255, 0, 0);">xmlns:x</span><span style="color: rgb(0, 0, 255);">=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span><br />    <span style="color: rgb(255, 0, 0);">xmlns:local</span><span style="color: rgb(0, 0, 255);">=&quot;using:SimpleMapping&quot;</span><br />    <span style="color: rgb(255, 0, 0);">xmlns:d</span><span style="color: rgb(0, 0, 255);">=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;</span><br />    <span style="color: rgb(255, 0, 0);">xmlns:mc</span><span style="color: rgb(0, 0, 255);">=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;</span><br />    <span style="color: rgb(255, 0, 0);">xmlns:Maps</span><span style="color: rgb(0, 0, 255);">=&quot;using:Bing.Maps&quot;</span><br />    <span style="color: rgb(255, 0, 0);">x:Class</span><span style="color: rgb(0, 0, 255);">=&quot;SimpleMapping.MainPage&quot;</span><br />    <span style="color: rgb(255, 0, 0);">mc:Ignorable</span><span style="color: rgb(0, 0, 255);">=&quot;d&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><br /><br />    <span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">Grid</span> <span style="color: rgb(255, 0, 0);">Background</span><span style="color: rgb(0, 0, 255);">=&quot;{StaticResource ApplicationPageBackgroundThemeBrush}&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><br />        <span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">Maps:Map</span> <span style="color: rgb(255, 0, 0);">x:Name</span><span style="color: rgb(0, 0, 255);">=&quot;Map&quot;</span> <span style="color: rgb(255, 0, 0);">Margin</span><span style="color: rgb(0, 0, 255);">=&quot;0,120,0,0&quot;</span> <span style="color: rgb(255, 0, 0);">Credentials</span><span style="color: rgb(0, 0, 255);">=&quot;Insert Your Bing Maps Key Here&quot;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><br />    <span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">Grid</span><span style="color: rgb(0, 0, 255);">&gt;</span><br /><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">Page</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre>
  </div>
</blockquote>

<ul>
  <li>Agora você já pode usar o código a seguir na página do aplicativo em que o mapa é exibido. Isso define o nível de zoom do mapa e mostra a localização. Saiba mais sobre o nível de zoom em <a href="http://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj850315.aspx" target="_blank">Como exibir sua localização em um Mapa Bing</a>:</li>
</ul>

<p><strong>C#</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">double</span> zoomLevel = 13.0f;<br /><br />Map.SetView(location, zoomLevel);<br /></pre>
  </div>
</blockquote>

<br />Adicionar um controle do Mapas Bing ao seu aplicativo em JavaScript e HTML exige um pouco mais de trabalho. Adicione a seguinte marca &lt;script&gt; ao HTML do seu aplicativo: 

<div> </div>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">script</span> <span style="color: rgb(255, 0, 0);">type</span><span style="color: rgb(0, 0, 255);">=&quot;text/javascript&quot;</span> <br />   <span style="color: rgb(255, 0, 0);">src</span><span style="color: rgb(0, 0, 255);">=&quot;ms-appx:///Bing.Maps.JavaScript//js/veapicore.js&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><br />/script<span style="color: rgb(0, 0, 255);">&gt;</span><br /></pre>
  </div>
</blockquote>

<p>Em seguida, você precisará criar uma marca &lt;div&gt;para conter o mapa, configurando o atributo de id para que possa acessá-lo.</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">div</span> <span style="color: rgb(255, 0, 0);">id</span>=’<span style="color: rgb(255, 0, 0);">map-div</span>’<span style="color: rgb(0, 0, 255);">&gt;&lt;/</span><span style="color: rgb(128, 0, 0);">div</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre>
  </div>
</blockquote>

<p>Por fim, será necessário inicializar o controle do mapa na página em HTML. Veja aqui alguns códigos JavaScript que fazem isso:</p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 128, 0);">// Load the Microsoft.Maps.Map module and then call getMap when the </span><br /><span style="color: rgb(0, 128, 0);">// module has loaded.</span><br /><span style="color: rgb(0, 0, 255);">function</span> initMap() {<br />  Microsoft.Maps.loadModule(<span style="color: rgb(0, 96, 128);">'Microsoft.Maps.Map'</span>, <br />    { <br />      callback: getMap, <br />      culture: <span style="color: rgb(0, 96, 128);">&quot;en&quot;</span>, <br />      homeRegion: <span style="color: rgb(0, 96, 128);">&quot;US&quot;</span> <br />  });<br />}<br /><br /><span style="color: rgb(0, 128, 0);">// Get the div to contain the map from the interface of the app.</span><br /><span style="color: rgb(0, 0, 255);">function</span> getMap() {<br /><br />  <span style="color: rgb(0, 128, 0);">// Create a new instance of the Map class, passing in the app ID.</span><br />  <span style="color: rgb(0, 0, 255);">var</span> map = <span style="color: rgb(0, 0, 255);">new</span> Microsoft.Maps.Map(<br />    document.getElementById(mapDivId), <br />    { credentials: “Insert your credentials here” });<br /><br />  <span style="color: rgb(0, 128, 0);">// Set the initial zoom level and type of map.</span><br />  map.setView({<br />    mapTypeId: Microsoft.Maps.MapTypeId.road,<br />    zoom: 3<br />  });<br />}<br /></pre>
  </div>
</blockquote>

<ul>
  <li>Qualquer aplicativo que usa localização deve respeitar as configurações das permissões do usuário, que podem ser alteradas a qualquer momento. O aplicativo Meteorologia usa a localização para obter a previsão do tempo para o local atual. Mas a qualquer momento, o usuário poderá acessar as Configurações e desativas as permissões de Localizações. Seu aplicativo deve sempre lidar com a possibilidade de que a permissão de Localização esteja desabilitada. Nesse caso, o aplicativo Meteorologia exibe uma mensagem "Não é possível encontrar sua localização. Altere suas permissões para que o Meteorologia possa usar sua localização". Consulte as diretrizes de experiência do usuário em <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/Hh465148(v=win.10).aspx" target="_blank">Diretrizes para aplicativos com reconhecimento de local</a> para obter exemplos de como lidar com permissões de localização. 

    <br /><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/0882.bing-weather_2FEEBCEF.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0882.bing_2D00_weather_5F00_2FEEBCEF.jpg"><img title="Aplicativo Bing Meteorologia" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Aplicativo Bing Meteorologia usando a localização para obter a previsão do tempo para o local atual" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/7356.bing-weather_thumb_084840C5.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/7356.bing_2D00_weather_5F00_thumb_5F00_084840C5.jpg" width="600" height="450" /></a></li>
</ul>

<p> </p>

<p>Para obter todos os detalhes de como usar a geolocalização e o SDK do Mapas Bing, <a></a><a>temos um novo </a><a href="http://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj850315.aspx" target="_blank">vídeo, tópico de como fazer</a> e <a href="http://code.msdn.microsoft.com/windowsapps/Simple-geolocation-with-7b385c3c" target="_blank">exemplo de código</a> que explica as etapas de como adquirir de forma assíncrona sua localização e usar o SDK do Mapas Bing para mostrar onde você está visualmente. O vídeo, o tópico de como fazer e o exemplo guiam você sobre como habilitar a funcionalidade de localização, como obter a localização assincronamente, como configurar o mapa para um determinado local e como configurar o ícone de localização baseado na precisão dos dados de localização. Você também pode encontrar mais informações em <a href="http://msdn.microsoft.com/pt-br/library/hh846481.aspx" target="_blank">Mapas Bing para aplicativos da Windows Store</a>.</p>

<h2>Resumindo</h2>

<p>A localização pode ser um recurso poderoso e ágil para adicionar ao seu aplicativo. Você pode fornecer ao usuário mais informações pertinentes baseado em onde ele está. Seja uma lista de estações de rádio locais, ofertas de compras, informações de trânsito ou do tempo, o controle para ajustar essas informações de acordo com a localização pode tornar seu aplicativo mais útil. A capacidade de fazer isso acontecer automaticamente, sem a interação do usuário, economiza tempo e aumenta a probabilidade de uso do seu aplicativo.</p>

<p>--Ross Heise, desenvolvedor de conteúdo sênior, Conteúdo para desenvolvedores do Windows</p>
<p>   Agradecimentos especiais a Jon Kay e Eric Schmidt pela ajuda e contribuições para esta postagem.</p>
<!-- Title: “Criar aplicativos com reconhecimento de local usando geolocalização e Mapas Bing” Tags: “Mapas Bing, geolocalização, Windows. Dispositivos. Geolocalização, serviços de localização” --></div>]]></content:encoded>
    </item>
    <item>
      <title>Apresentando uma nova experiência do Centro de Desenvolvimento do Windows</title>
      <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/apresentando-uma-nova-experincia-do-centro-de-desenvolvimento-do-windows</link>
      <pubDate>Thu, 16 May 2013 13:01:07 GMT</pubDate>
      <dc:creator><![CDATA[Windows 8 Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windowsappdev_br/2013/05/16/apresentando-uma-nova-experincia-do-centro-de-desenvolvimento-do-windows/</guid>
      <description><![CDATA[Desde o lançamento do Centro de Desenvolvimento do Windows em outubro de 2011, temos trabalhado de...]]></description>
      <content:encoded><![CDATA[<div class="PostContent"> <p>Desde o lançamento do <a href="http://msdn.microsoft.com/pt-br/windows/default.aspx" target="_blank">Centro de Desenvolvimento do Windows</a> em outubro de 2011, temos trabalhado de perto com desenvolvedores e designers do mundo todo para saber como podemos oferecer a melhor orientação, inspiração e amostras para criadores de aplicativos. Com milhares de visitantes e os seus comentários, temos avaliado o que tem funcionado bem e quais experiências podem ser aprimoradas.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/0172.windows_dev_center_1EC86298.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0172.windows_5F00_dev_5F00_center_5F00_1EC86298.png"><img title="Centro de Desenvolvimento do Windows" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Centro de Desenvolvimento do Windows" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/0184.windows_dev_center_thumb_1DEFFCAE.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0184.windows_5F00_dev_5F00_center_5F00_thumb_5F00_1DEFFCAE.png" width="600" height="338" /></a></p>  <h2>Novidades</h2>  <p>A equipe do Windows está focada em cultivar um ecossistema de aplicativos vibrante e crescente. Isso se manifesta de três formas: ótimos aplicativos, ótima economia e ótima oportunidade de alcance. O novo Centro de Desenvolvimento conecta criadores de aplicativos, designers e empresas aos recursos necessários para obterem sucesso no desenvolvimento de ótimos aplicativos e na criação de um negócio com o Windows.</p>  <p>Para dar suporte a essas metas, estas áreas do Centro de Desenvolvimento foram desenvolvidas:</p>  <ol>   <li>O modelo de navegação foi alterado para que você possa localizar o conteúdo relevante à etapa do ciclo de vida do desenvolvimento de aplicativos</li>    <li>O site cria tarefas de destaque, cenários e novo conteúdo </li> </ol>  <p>Além do conteúdo, amostras e downloads que os desenvolvedores desejam; facilitamos o acesso a recursos para designers e empresas. </p>  <p>Dependendo do que estiver criando, você pode acessar uma destas quatro áreas: <a href="http://msdn.microsoft.com/pt-BR/windows/apps/br229512" target="_blank">Aplicativos da Windows Store</a>, <a href="http://msdn.microsoft.com/pt-BR/ie/" target="_blank">Internet Explorer</a>, <a href="http://msdn.microsoft.com/pt-BR/windows/desktop" target="_blank">Windows desktop</a> e <a href="http://msdn.microsoft.com/pt-BR/windows/hardware" target="_blank">Hardware</a>. Cada uma delas apresenta uma nova experiência que aborda os pontos mencionados acima. Nesta postagem, veremos detalhadamente as alterações específicas feitas para os aplicativos da Windows Store.</p>  <h2>O conteúdo certo para a sua função</h2>  <p>O site mais informativo deixa de ser útil se a pessoa não conseguir encontrar o que procura. Com centenas de milhares de tópicos no Centro de Desenvolvimento, a organização e a capacidade de descobrir conteúdo é crítica. Para o desenvolvimento de aplicativos da Windows Store, isso significa um foco mais estrito, com base na função e no cenário, desde colocar tudo o que você precisa para começar em um lugar até dar um melhor suporte a designers e empresas. Aqui estão alguns dos destaques.</p>  <h3>Desenvolvedores</h3>  <p>Simplificamos o conteúdo de que você precisa para criar ótimos aplicativos da Windows Store. Ao acessar a <a href="http://msdn.microsoft.com/pt-br/windows/apps/" target="_blank">home page dos aplicativos da Windows Store</a>, você verá: </p>  <ul>   <li>“Principais tarefas e conteúdo” em destaque para ajudá-lo a acessar rapidamente o conteúdo de que você precisa. Os eventos locais na sua região são destacados, bem como novos recursos que acabamos de incluir no site. </li>    <li>Downloads para ajudá-lo a acessar diretamente a codificação, todos os recursos necessários para você começar e orientação detalhada sobre como colocar o seu aplicativo na Windows Store. </li>    <li>Exemplos de código importantes são realçados, e orientações passo a passo têm uma navegação mais fácil tendo em foco o ciclo de vida do desenvolvimento. </li>    <li>“<a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211360.aspx" target="_blank">Os vídeos rápidos para o desenvolvedor</a>” encontrados em todo o site oferecem uma visão geral de como adicionar recursos ao seu aplicativo. </li> </ul>  <h3>Designers</h3>  <p>Fizemos algumas modificações na <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh779072.aspx" target="_blank">seção de design</a> do site para facilitar seu uso e torná-la mais abrangente. Você pode localizar downloads úteis e ativos de design reutilizáveis mais facilmente, e, com os estudos de caso e ideias de design, você tem as ferramentas necessárias para criar uma experiência exclusiva no Windows. Tudo o que você precisa para criar um lindo aplicativo que se destaque dos outros está ao alcance das suas mãos, com um design de página voltado para o toque e fácil de usar.</p>  <h3>Empresas</h3>  <p>A oportunidade da Windows Store para as empresas é significativa, com um modelo econômico melhor do que o das plataformas competitivas e flexibilidade que permite criar o negócio que desejar. A nova <a href="http://go.microsoft.com/fwlink/?LinkID=285998" target="_blank">seção sobre mercado</a> do site oferece ótimas dicas para comercializar os seus aplicativos, avaliar dados telemétricos e obter a certificação de aplicativos. Aprendemos muito sobre como facilitar a certificação e melhoramos o conteúdo para ajudá-lo a passar pelo processo mais rapidamente.</p>  <p>Muitos de vocês, obviamente desempenham várias funções. Acreditamos que a nova organização do site dê suporte a isso também. De entusiastas e agências publicitárias às grandes empresas desenvolvedoras de software, a nova organização do site ajudará todos a realizarem seus projetos e a alcançarem suas metas de negócios com o Windows.</p>  <h2>Há muito mais por vir. O seu feedback é importante.</h2>  <p>Com o <a href="http://www.buildwindows.com">BUILD 2013</a> daqui a pouco mais de um mês, teremos muito o que falar. Estamos trabalhando muito para criar novo conteúdo para ser compartilhado no evento deste ano. Além de acompanhar este blog, estas são outras maneiras de você ficar conectado: seguir <a href="https://twitter.com/#!/windevs" target="_blank">@windevs</a> no Twitter e assinar o <a href="http://www.windowsstore.com/newsletter-signup" target="_blank">Boletim informativo da Windows Store</a>.</p>  <p>Conforme apresentamos mais conteúdo para ajudá-lo a criar, desenvolver e comercializar os seus aplicativos da Windows Store, desejamos continuar aperfeiçoando a sua experiência no Centro de Desenvolvimento! Para facilitar o seu feedback, agora oferecemos duas novas opções de comentários na parte inferior de cada página. Faça comentários. Eles são lidos e estamos sempre trabalhando para atender às suas necessidades.</p>  <p> </p>  <p>Keith Boyd, gerente de publicação de conteúdo, Conteúdo do desenvolvedor do Windows</p> <!-- Title: “Apresentando uma nova experiência do Centro de Desenvolvimento do Windows” Tags: “centro de desenvolvimento, informações para o desenvolvedor, criação de aplicativos, aplicativos da Windows Store, Centro de Desenvolvimento do Windows” --></div>]]></content:encoded>
    </item>
    <item>
      <title>Compartilhando com o seu aplicativo de destino</title>
      <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/compartilhando-com-o-seu-aplicativo-de-destino</link>
      <pubDate>Wed, 15 May 2013 09:14:51 GMT</pubDate>
      <dc:creator><![CDATA[Windows 8 Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windowsappdev_br/2013/05/15/compartilhando-com-o-seu-aplicativo-de-destino/</guid>
      <description><![CDATA[Na postagem Compartilhando de seu aplicativo, apresentamos a ideia de compartilhar conteúdo do...]]></description>
      <content:encoded><![CDATA[<div class="PostContent"> <p>Na postagem <a href="http://blogs.msdn.com/b/windowsappdev_br/archive/2012/12/21/compartilhando-de-seu-aplicativo.aspx" target="_blank">Compartilhando de seu aplicativo</a>, apresentamos a ideia de compartilhar conteúdo do aplicativo de exemplo <a href="http://blogs.msdn.com/b/windowsappdev_br/archive/2012/07/18/cr-233-ation-d-applications-de-style-metro-qui-sortent-du-lot.aspx" target="_blank">Food with Friends</a> com vários aplicativos de destino que permitem ao usuário executar cenários completos e sofisticados. Os aplicativos no Windows 8 oferecem um conteúdo interessante que os seus clientes desejarão <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465251.aspx" target="_blank">compartilhar</a> com os amigos e outros aplicativos. Com um compartilhamento de destino atraente e bem projetado, o seu aplicativo pode ser o centro de uma experiência conectada e social.</p>  <p>Nesta postagem, veremos como você pode usar o contrato de Compartilhamento de Destino nos seus aplicativos, especialmente aqueles como o Food with Friends. Usando esse contrato, o seu aplicativo pode <i>receber conteúdo</i> de outros aplicativos e usar esse conteúdo para melhorar sua qualidade. Desejamos ajudá-lo a tornar o seu aplicativo o melhor de sua categoria!</p>  <p>O aplicativo de destino é criado usando o <a href="http://blogs.msdn.com/b/windowsappdev_br/archive/2012/03/30/ativando-contratos-do-windows-8-no-seu-aplicativo.aspx" target="_blank">contrato</a><u></u> de Compartilhamento de Destino e é desenvolvido para proporcionar uma experiência rápida e fácil. Nem todo aplicativo no Windows será um compartilhamento de destino, mas se o seu aplicativo puder publicar, transformar, armazenar ou agregar valor, de alguma forma, ao conteúdo que receber de outro aplicativo, haverá benefícios na criação de um compartilhamento de destino. </p>  <ul>   <li>O seu aplicativo sempre aparecerá na lista de aplicativos de destino. Ele é conectado instantaneamente e relevante a outros aplicativos que podem compartilhar dados desejados por você. </li>    <li>O contrato de compartilhamento cria uma ponte entre o seu aplicativo e qualquer aplicativo de origem sem que seja necessário que nenhum dos dois tenha uma integração um-para-um. </li>    <li>Como o botão Compartilhar está sempre presente e disponível no sistema operacional, isso proporciona ao aplicativo de destino uma presença no sistema operacional que vai além das fronteiras do seu aplicativo. Isso poderá direcionar mais clientes para o seu aplicativo!</li> </ul>  <h2>Recebendo conteúdo compartilhado</h2>  <p>Vejamos alguns exemplos que mostrarão como você pode oferecer experiências atraentes por meio de um aplicativo de compartilhamento de destino.</p>  <p>Talvez você já esteja familiarizado com os aplicativos Email e Pessoas do Windows 8. O Email cria uma experiência de compartilhamento de destino fácil e pessoal para receber e compartilhar conteúdo com um ou mais amigos. O aplicativo Pessoas permite compartilhar conteúdo com uma audiência maior nas suas redes sociais. Além do compartilhamento em redes sociais, você pode ir além com o compartilhamento entre aplicativos. Aplicativos de produtividade, como o SkyDrive, podem receber arquivos de qualquer lugar do Windows e armazená-los na nuvem; os aplicativos de anotação podem receber texto, links e, possivelmente, dados em uma grande variedade de formatos diferentes e arquivá-los para futura referência. Também há bastante espaço para a criatividade. </p>  <p>Veja como as duas imagens abaixo mostram o fluxo de compartilhamento ao compartilhar uma foto do aplicativo Fotos com o PuzzleTouch, um aplicativo de jogo que transforma uma imagem em um quebra-cabeça visual. </p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/8637.puzzletouch1_6E4332DA.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8637.puzzletouch1_5F00_6E4332DA.png"><img title="Aplicativo de origem à esquerda, lista de aplicativos de destino filtrados que podem receber fotos no painel Compartilhar à direita. " style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Aplicativo de origem à esquerda, lista de aplicativos de destino filtrados que podem receber fotos no painel Compartilhar à direita. " src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/1307.puzzletouch1_thumb_2681A9F3.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1307.puzzletouch1_5F00_thumb_5F00_2681A9F3.png" width="700" height="394" /></a></p>  <p align="center"><i>Figura 1: Aplicativo de origem à esquerda, lista de aplicativos de destino que podem receber fotos no painel Compartilhar à direita.      <br />O PuzzleTouch é um dos compartilhamentos de destino que podem receber uma imagem do aplicativo Fotos. </i></p>  <p align="left"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/6661.puzzletouch2_463083BB.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/6661.puzzletouch2_5F00_463083BB.png"><img title="À direita, a visualização do aplicativo de destino permite ao usuário selecionar o tipo de quebra-cabeça que deseja criar" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="À direita, a visualização do aplicativo de destino permite ao usuário selecionar o tipo de quebra-cabeça que deseja criar" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/2474.puzzletouch2_thumb_65DF5D83.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/2474.puzzletouch2_5F00_thumb_5F00_65DF5D83.png" width="700" height="394" /></a></p>  <p align="center"><i>Figura 2: À direita, a visualização do aplicativo de destino permite ao usuário selecionar o tipo de quebra-cabeça que      <br />deseja criar. O quebra-cabeça fica pronto quando o usuário volta ao aplicativo. </i></p>  <h2>O que é um aplicativo de compartilhamento de destino?</h2>  <p>Uma experiência de compartilhamento completa no Windows tem dois componentes. Temos um aplicativo de origem que torna o conteúdo disponível em diferentes formatos para o Windows. Temos também um aplicativo de compartilhamento de destino que se registra para reconhecer determinados formatos e atua como o destino para o conteúdo compartilhado. Usando o contrato de Compartilhamento, o aplicativo de origem e o aplicativo de compartilhamento de destino se comunicam entre si.</p>  <p>Ao pensar sobre a experiência de compartilhamento para o seu aplicativo, considere que o aplicativo de compartilhamento de destino é renderizado na janela Compartilhar hospedada. Projete a experiência para que o seu usuário possa visualizar seu conteúdo rapidamente e confirmar o compartilhamento nessa exibição. Este exemplo mostra a exibição do aplicativo de compartilhamento de destino Email que permite a um usuário compartilhar rapidamente um link do navegador com um de seus contatos do Email. </p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/8561.Share-Target-Image_3ED44139.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8561.Share_2D00_Target_2D00_Image_5F00_3ED44139.png"><img title="Imagem do Compartilhamento de Destino" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Imagem do Compartilhamento de Destino" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/6011.Share-Target-Image_thumb_4FD86F1C.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/6011.Share_2D00_Target_2D00_Image_5F00_thumb_5F00_4FD86F1C.png" width="700" height="435" /></a></p>  <p align="center"><i>Figura 3: Compartilhando um link do aplicativo Fotos usando o aplicativo de destino Email</i></p>  <h2>Cenários do Food with Friends</h2>  <p>Agora, vamos considerar como o <a href="http://blogs.msdn.com/b/windowsappdev_br/archive/2012/07/18/cr-233-ation-d-applications-de-style-metro-qui-sortent-du-lot.aspx" target="_blank">Food with Friends</a> cria uma experiência atraente de aplicativo de compartilhamento de destino. Se você estiver familiarizado com o aplicativo, você verá duas ações principais que um usuário pode realizar no Food with Friends – <i>criando um plano</i> e <i>adicionando um restaurante à sua lista de desejos</i>. É claro que há outras ações, como escrever uma opinião, postar um comentário, exibir listas de desejos dos seus amigos etc., mas essas experiências somente fazem sentido dentro do contexto do aplicativo principal. Nos dois cenários básicos que se destacam, vamos fazer uma verificação de integridade rápida para ver se podem ser realizados efetivamente pelo aplicativo de destino Food with Friends.</p>  <h3>Criar o plano desta noite</h3>  <p>Embora seja o cenário básico do aplicativo principal, ele não é o melhor cenário para uma experiência de compartilhamento de destino. Veja o motivo: A experiência de compartilhamento de destino tem o objetivo de ser rápida e fácil. A criação de um plano é uma tarefa muito mais complexa: o usuário poderia desejar saber quais outros restaurantes seus amigos desejam experimentar, comparar alguns restaurantes da lista de desejos, examinar classificações etc. Como o planejamento envolve o aproveitamento de detalhes cuja apresentação é melhor na exibição do aplicativo principal, condensar essa funcionalidade em um aplicativo de compartilhamento de destino não é atraente. </p>  <p><b></b></p>  <h3>Adicionar à lista de desejos</h3>  <p>Esse cenário funciona realmente bem como uma tarefa curta e direcionada no compartilhamento de destino. Alguns destaques nessa experiência do aplicativo:<b></b></p>  <ul>   <li>As pessoas veem restaurantes em outros aplicativos, sejam aplicativos de planejamento de viagens, aplicativos da cidade local com recomendações, blogs sobre comida etc. O Food with Friends é um ótimo destino para agregar restaurantes na seção "My Wishlist" (Minha lista de desejos). </li>    <li>A exibição do aplicativo de destino de um aplicativo é criada para que um usuário aja rapidamente no contexto de um aplicativo diferente. Portanto, a adição de um restaurante na lista de desejos é uma excelente opção para emergir no compartilhamento de destino. </li>    <li>Embora certamente seja possível ao usuário fazer a alternância entre aplicativos, repetir a pesquisa para localizar o restaurante e adicionar o restaurante à lista de desejos, tocar rapidamente em Compartilhar é muito mais fácil.</li> </ul>  <p>A lista de desejos do Food with Friends parece ser uma ótima experiência de aplicativo de compartilhamento de destino que desejamos projetar e compilar. Veja o cenário completo que temos em mente:</p>  <p>Ao navegar em um aplicativo que mostre caminhões de comida local, encontro recomendações desses caminhões que parecem interessantes. Desejo adicionar o caminhão de comida desse aplicativo na minha lista de desejos do Food with Friends para ajudar no planejamento depois.</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/7658.contoso_truck_6C263411.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/7658.contoso_5F00_truck_5F00_6C263411.png"><img title="Navegando em um aplicativo que mostra caminhões de comida local e recomenda lugares de interesse" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Navegando em um aplicativo que mostra caminhões de comida local e recomenda lugares de interesse" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/3022.contoso_truck_thumb_4B9EF45F.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3022.contoso_5F00_truck_5F00_thumb_5F00_4B9EF45F.png" width="700" height="394" /></a><em>Figura 4: Navegando em um aplicativo que mostra caminhões de comida local e recomenda lugares de interesse</em></p>  <p>Essa imagem mostra a exibição do aplicativo de compartilhamento de destino que desejamos usar:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/3835.contoso_truck2_565C4BB4.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3835.contoso_5F00_truck2_5F00_565C4BB4.png"><img title="Exibição do aplicativo de compartilhamento de destino" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Exibição do aplicativo de compartilhamento de destino" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/8637.contoso_truck2_thumb_760B257C.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/8637.contoso_5F00_truck2_5F00_thumb_5F00_760B257C.png" width="700" height="394" /></a></p>  <p align="center"><em>Figura 5: Exibição do aplicativo de compartilhamento de destino</em></p>  <p>Realizando a ação de compartilhamento na exibição do aplicativo de destino, os usuários podem ver os restaurantes do Food with Friends sem alternar o contexto da experiência de imersão do aplicativo atual. </p>  <h2>Implementando um compartilhamento de destino</h2>  <p>Agora que você viu alguns exemplos de quando implementar um compartilhamento de destino, vejamos como implementar um compartilhamento de destino. Primeiro, decida quais formatos de dados o seu aplicativo poderá receber. </p>  <h3>A quais formatos de dados você deve dar suporte?</h3>  <p>Com o Compartilhar, você pode dar suporte tanto a formatos de dados padrão, como texto, URI, HTML, bitmaps, arquivos ou formatos de dados personalizados, como os listados em <a href="http://schema.org" target="_blank">http://schema.org</a> . O Windows filtra aplicativos de destino por formatos de dados a que dão suporte para exibir a lista de aplicativos de destino filtrada no painel Compartilhar. O seu aplicativo deve dar suporte a formatos de dados que são importantes para a experiência do aplicativo. Por exemplo, se o seu aplicativo for voltado para a exibição de fotos, o suporte a formatos de texto pode não ser útil. Se você declarar suporte a vários formatos de dados, decida qual deles ajudará a representar os dados compartilhados melhor para que você possa separar esse formato no pacote de dados primeiro. </p>  <p>Como o Food with Friends está implementando uma experiência de compartilhamento de destino que permite aos usuários compartilhar restaurantes com o aplicativo, vamos usar o formato de dados <a href="http://schema.org/Restaurant" target="_blank">Restaurant</a><u></u> (Restaurante) que aparece em <a href="http://schema.org" target="_blank">http://schema.org</a>. O Food with Friends pode se registrar com o contrato de Compartilhamento de destino para receber esse formato de dados. Em seguida, usado os dados no pacote recebido, ele pode criar uma experiência atraente na exibição de seu aplicativo de destino que permita ao usuário adicionar o restaurante na sua lista de desejos. </p>  <p>Embora alguns aplicativos de origem possam compartilhar especificamente o formato de dados <a href="http://schema.org/Restaurant" target="_blank">Restaurant</a><u></u>, outros aplicativos de origem podem representar informações semelhantes usando outros formatos de dados, como <a href="http://schema.org/Place" target="_blank">Place</a><u></u> (Local), <a href="http://schema.org/LocalBusiness" target="_blank">LocalBusiness</a><u></u> e <a href="http://schema.org/FoodEstablishment" target="_blank">FoodEstablishment</a> relacionados em <a href="http://schema.org/" target="_blank">schema.org</a><u></u>. Dessa forma, o Food with Friends pode dar suporte ao recebimento de vários formatos no contrato de compartilhamento para acomodar uma variedade maior de aplicativos de origem.</p>  <p>O Food with Friends dá suporte aos seguintes formatos nas declarações de compartilhamento de destino do manifesto do aplicativo:</p>  <ul>   <li><u><a href="http://schema.org/Restaurant" target="_blank">Restaurant</a></u></li>    <li><u><a href="http://schema.org/Place" target="_blank">Place</a></u></li>    <li><u><a href="http://schema.org/LocalBusiness" target="_blank">LocalBusiness</a></u></li>    <li><u><a href="http://schema.org/FoodEstablishment" target="_blank">FoodEstablishment</a></u><u></u></li> </ul>  <p><u></u></p>  <p>Estamos nos concentrando no tipo de dados <a href="http://schema.org/Restaurant" target="_blank">Restaurant</a><u></u> para simplificar, mas os conceitos também se aplicam a outros tipos de dados.</p>  <h3>Quais formatos de dados e cenários você deve examinar? </h3>  <p>O Food with Friends somente permitirá a adição do restaurante à lista de desejos do usuário se as informações do restaurante recebidas corresponderem às de um restaurante já conhecido pelo aplicativo. Isso é intencional para evitar várias cópias de restaurantes no aplicativo. </p>  <p>Não damos suporte a tipos de dados padrão porque a maioria dos textos, arquivos, fotos, URI ou HTML compartilhados de aplicativos de origem não são mapeados para um restaurante ou empresa local. Por exemplo, se o Food with Friends desse suporte ao recebimento de texto, ele apareceria na lista de aplicativos de destino de um aplicativo de origem de anotação. Nesse caso, o Food With Friends precisaria fornecer uma mensagem de erro informando ao usuário o motivo desse aplicativo não funcionar com seu aplicativo de origem. Resumindo, os formatos de dados são o que conectam um aplicativo de origem que tem algo a oferecer a um aplicativo de destino. Se os formatos de dados não forem os mesmos, não há nada que valha a pena compartilhar.</p>  <p>Considere todos os formatos de dados que ajudam a identificar o que é importante, examine os formatos de dados que diluem a sua experiência de compartilhamento.</p>  <h3>Dando suporte ao contrato de Compartilhamento de Destino</h3>  <p>Para dar suporte a formatos de dados, declare-os no designer de manifesto do Visual Studio do seu aplicativo. Isto é o que acontece quando um usuário seleciona o seu aplicativo como o destino de uma ação de compartilhamento:</p>  <ol>   <li>Uma nova instância do aplicativo é iniciada na janela de compartilhamento de destino sobre o aplicativo de origem. </li>    <li>Um evento de <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.applicationmodel.activation.sharetargetactivatedeventargs.aspx" target="_blank">ativação de compartilhamento de destino</a> é iniciado e o seu aplicativo recebe um objeto <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br205977.aspx" target="_blank">ShareOperation</a><b></b> como resultado.</li>    <li>O seu aplicativo pode recuperar os dados que o usuário compartilhou desse objeto. </li>    <li>Você pode usar esses dados para renderizar a exibição do aplicativo de destino e realizar o compartilhamento do usuário. </li> </ol>  <p>Para obter mais informações sobre como criar essa experiência, consulte o guia <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465255.aspx" target="_blank">Início rápido:</a> <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465255.aspx"><u>recebendo conteúdo compartilhado</u></a>. </p>  <p>Além disso, o Visual Studio dá suporte a um modelo para o compartilhamento de destinos. Clique com o botão direito no seu projeto, selecione <b>Adicionar Item</b>, <b>Adicionar Novo Item</b>, clique em <b>contrato de Compartilhamento de Destino</b> na lista. Você terá o código adicionado para dar suporte ao contrato. O <a href="http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782" target="_blank">Exemplo de código de compartilhamento de destino</a><u></u> mostra como receber conteúdo compartilhado.</p>  <h2>Projetando uma exibição de aplicativo de destino personalizada</h2>  <p>Quando o usuário seleciona um aplicativo de destino na lista de aplicativos do painel Compartilhar, o Windows inicia o aplicativo na exibição de destino de compartilhamento do aplicativo. A exibição do aplicativo de destino é uma exibição especial hospedada no painel Compartilhar e é diferente da exibição principal do aplicativo. <a href="http://blogs.msdn.com/b/windowsappdev_br/archive/2012/03/30/ativando-contratos-do-windows-8-no-seu-aplicativo.aspx" target="_blank">Ativando contratos do Windows 8 no seu aplicativo</a><u></u> fornece mais informações sobre exibições hospedadas e o gerenciamento da ativação dessas exibições. A exibição do aplicativo de destino foi projetada para concluir a ação de compartilhamento iniciada pelo usuário. Nessa exibição, os usuários podem visualizar seu conteúdo rapidamente, executar ações simples e confirmar sua intenção de compartilhar. </p>  <p>Antes de olharmos para o projeto do aplicativo de destino do Food with Friends, vamos considerar um aplicativo de destino que talvez você já conheça. As imagens abaixo mostram a exibição do aplicativo de destino do aplicativo Email ao lado da exibição completa do aplicativo no <a></a>Windows 8.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/1307.target-app_4AC68E75.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1307.target_2D00_app_5F00_4AC68E75.png"><img title="Compartilhando de Fotos para o aplicativo de destino Email à direita" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Compartilhando de Fotos para o aplicativo de destino Email à direita" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/0724.target-app_thumb_5583E5CA.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0724.target_2D00_app_5F00_thumb_5F00_5583E5CA.png" width="700" height="438" /></a></p>  <p align="center"><i>Figura 6: Compartilhando de Fotos para o aplicativo de destino Email à direita</i></p>  <p align="left"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/1385.mail_154DCC50.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1385.mail_5F00_154DCC50.png"><img title="Redigindo um novo email na exibição do aplicativo principal do Email" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Redigindo um novo email na exibição do aplicativo principal do Email" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/2055.mail_thumb_510D6503.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/2055.mail_5F00_thumb_5F00_510D6503.png" width="700" height="438" /></a></p>  <p align="center"><em>Figura 7: Redigindo um novo email na exibição do aplicativo principal do Email</em></p>  <p>Observe que a exibição do aplicativo de compartilhamento de destino do Email é mais simples do que a exibição completa do aplicativo. Ela fornece uma visualização limpa e minimalista do conteúdo que o usuário compartilhará em formato de miniatura com HTML e texto associado. Ela oferece uma linha <b>Para</b> para adicionar destinatários, uma área de entrada para a redação de uma mensagem rápida e uma maneira fácil de confirmar o envio do email com o botão <b>Enviar</b>.</p>  <p>Apesar dessa exibição mais simples, a exibição do aplicativo de destino do aplicativo pode ser identificada de forma nítida como um avatar do aplicativo Email, o que reforça a confiança do usuário quanto ao destino do conteúdo compartilhado.</p>  <h2>Food with Friends como um aplicativo de compartilhamento de destino</h2>  <p>Agora que você tem uma ideia geral sobre o projeto de exibição do aplicativo de destino, vamos ver como o Food with Friends pode criar um aplicativo de destino que ajuda os usuários a adicionar restaurantes à lista de desejos. </p>  <p>Quando o Food with Friends recebe o pacote de dados contendo um <a href="http://schema.org/Restaurant">Restaurant</a> do aplicativo de origem, ele pode usar os detalhes no formato de dados <a href="http://schema.org/Restaurant">Restaurant</a> para identificar qual restaurante de seu banco de dados corresponde ao pacote de dados recebido. O aplicativo poderá então mostrar uma visualização desse restaurante na exibição do aplicativo de destino. Isso reforça a confiança na integridade do conteúdo compartilhado. </p>  <p>Essa imagem mostra a exibição do aplicativo de destino do Food with Friends –</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/3857.contoso_truck3_0305058E.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3857.contoso_5F00_truck3_5F00_0305058E.png"><img title="Exibição do aplicativo de destino do Food with Friends" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Exibição do aplicativo de destino do Food with Friends" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/5584.contoso_truck3_thumb_1B94A2DE.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5584.contoso_5F00_truck3_5F00_thumb_5F00_1B94A2DE.png" width="700" height="394" /></a><em>Figura 8: Exibição do aplicativo de destino do Food with Friends</em></p>  <p>Como você pode ver, essa exibição do Food with Friends é simples e personalizada para um aplicativo de compartilhamento de destino. Ela mostra uma visualização do restaurante que o usuário está prestes a compartilhar e um botão simples que pode ser acionado, <b>Adicionar à Lista de Desejos</b>, que esclarece o destino do conteúdo compartilhado no aplicativo principal. Quando o usuário toca ou clica nesse botão, ele confirma a operação de compartilhamento. Exigindo um toque ou clique aqui, ajudamos a impedir um compartilhamento acidental e a construir confiança na experiência geral de Compartilhamento. </p>  <p>Se o aplicativo localizar vários restaurantes que correspondam às informações do conteúdo do pacote de dados, o Food with Friends usará a exibição do compartilhamento de destino para mostrar as opções e permitir que o usuário separe aqueles a serem compartilhados. </p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/5582.contoso_truck4_70500BD6.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5582.contoso_5F00_truck4_5F00_70500BD6.png"><img title="Exibição do aplicativo de destino mostra as opções para que os usuários possam escolher os itens a compartilhar" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Exibição do aplicativo de destino mostra as opções para que os usuários possam escolher os itens a compartilhar" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/6175.contoso_truck4_thumb_6FE3D8E1.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/6175.contoso_5F00_truck4_5F00_thumb_5F00_6FE3D8E1.png" width="700" height="394" /></a></p>  <p align="center"><em>Figura 9: Exibição do aplicativo de destino mostra as opções para que os usuários possam escolher os itens a compartilhar</em></p>  <p> </p>  <p>Caso o aplicativo não possa identificar um restaurante de forma precisa ou um conjunto válido de opções com base no pacote de dados recebido, use a exibição do aplicativo de destino para comunicar essa mensagem. </p>  <h2>Criando um QuickLink</h2>  <p>O <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.quicklink.aspx" target="_blank">QuickLink</a> é uma provisão da API de compartilhamento que permite aos usuários compartilhar conteúdo para destinos familiares dentro do seu aplicativo de destino rapidamente. Um QuickLink funciona como um link personalizado para a sua exibição de destino, fornecendo ações específicas. Quando o Windows filtra a lista de aplicativos de destino disponíveis para o usuário, a lista do QuickLinks é apresentada na parte superior do painel Compartilhar como a lista de destinos disponíveis. Essas ações do usuário e destinos familiares podem incluir locais ou pessoas com os quais são feitos compartilhamentos com frequência por meio do aplicativo de destino. Por exemplo, o aplicativo Email retorna QuickLinks para contatos a que foram enviados emails anteriormente. Da mesma forma, você pode adicionar QuickLinks a pastas, grupos, blocos de anotações e listas de reprodução que você compartilha com frequência ao seu aplicativo de destino. </p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/5001.quicklink_2FADBF67.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5001.quicklink_5F00_2FADBF67.png"><img title="Painel Compartilhar mostra um QuickLink fornecido pelo aplicativo de destino Email para contatos que receberam emails anteriormente por meio do aplicativo de destino" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Painel Compartilhar mostra um QuickLink fornecido pelo aplicativo de destino Email para contatos " src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/1374.quicklink_thumb_334BDA44.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1374.quicklink_5F00_thumb_5F00_334BDA44.png" width="700" height="438" /></a></p>  <p align="center"><i>Figura 10: Painel Compartilhar mostra um QuickLink fornecido pelo aplicativo de destino Email para contatos      <br />que receberam emails anteriormente por meio do aplicativo de destino</i></p>  <p>O aplicativo de destino pode oferecer um <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.quicklink.aspx" target="_blank">QuickLink</a><u></u> com o método de objetos <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br205977.aspx" target="_blank">ShareOperation</a><u></u><b><u> </u></b><b><u> </u></b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.shareoperation.reportcompleted.aspx" target="_blank">reportCompleted</a><b></b><b><u> </u></b>. Um QuickLink deve ter um título, um ícone e uma ID. O título (como "Enviar email para mãe") e o ícone aparecem quando o usuário toca no botão Compartilhar. A ID é o que o seu aplicativo usa para acessar quaisquer informações personalizadas, como um endereço de email, o local de uma pasta etc. Consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh758299.aspx" target="_blank">Como criar um objeto QuickLink</a><u></u> para saber mais sobre essa ferramenta.  </p>  <p>Observação: os QuickLinks são úteis quando o aplicativo dá suporte a várias ações do aplicativo de destino. Como o Food with Friends somente dá suporte a uma única ação no destino de compartilhamento (<b>Adicionar a lista de desejos</b>), i aplicativo não implementa QuickLinks. </p>  <h2>Compartilhamento estendido e relatório de erros</h2>  <p>Às vezes, os aplicativos de origem compartilham grandes partes de dados, como fotos, vídeos ou arquivos, resultando em transferências de dados mais demoradas. Esses tipos de operações de compartilhamento são conhecidos como <i>compartilhamentos estendidos</i> nos quais o seu aplicativo de destino pode precisar de mais tempo para receber e processar os dados. </p>  <p>Como o compartilhamento deve ser rápido e fluido, e a exibição do aplicativo de destino é leve, hospedada no aplicativo principal, os usuários podem tocar na exibição do aplicativo de destino para retornar ao aplicativo principal. Portanto, os aplicativos de destino não devem depender de uma interação do usuário (ou esperá-la) com a exibição de aplicativo de destino após o início do compartilhamento. Os aplicativos de destino podem depender do uso do objeto <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br205977.aspx" target="_blank">ShareOperation</a><b></b> e seu método para informar ao Windows que o aplicativo está processando dados. </p>  <ul>   <li><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.shareoperation.reportstarted.aspx" target="_blank">reportStarted</a></b> – use esse método para informar ao Windows que o seu aplicativo começou a recuperar os dados do objeto DataPackage do aplicativo de origem. </li>    <li><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.shareoperation.reportdataretrieved.aspx" target="_blank">reportDataRetrieved</a></b><b><u> </u></b>– use esse método para informar ao Windows que o seu aplicativo concluiu a recuperação dos dados do pacote.</li>    <li><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.applicationmodel.datatransfer.sharetarget.shareoperation.reportcompleted.aspx" target="_blank">reportCompleted</a></b><b><u> – </u></b>use esse método para informar ao Windows que o seu aplicativo concluiu a operação de compartilhamento.<b><u> </u></b><b><u></u></b></li> </ul>  <p>Quando o seu aplicativo estiver processando os dados para um compartilhamento estendido, forneça ao usuário uma interface do usuário de andamento na exibição do aplicativo de destino. Isso informa o usuário de que a solicitação dele está em andamento e reforça a confiança quando ele retornar ao seu aplicativo e verificar o progresso da operação de compartilhamento. Consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465487.aspx" target="_blank">Quickstart: adding progress controls</a><u></u> (Quickstart: adicionando controles de progresso) para saber mais sobre os controles de progresso no Windows 8. </p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/0702.progress-bar_52FAB40C.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0702.progress_2D00_bar_5F00_52FAB40C.png"><img title="barra de progresso" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="barra de progresso" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/3438.progress-bar_thumb_40B1ED4A.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3438.progress_2D00_bar_5F00_thumb_5F00_40B1ED4A.png" width="700" height="438" /></a></p>  <p align="center"><i>Figura 11: A exibição do aplicativo de destino do Email mostra um anel de progresso ao concluir um compartilhamento estendido, como o envio de anexos grandes</i></p>  <p>Se algo der errado durante a transferência de dados e o seu aplicativo de destino tiver de concluir a operação de compartilhamento, você pode usar o <b><u>reportError</u></b> para enviar uma mensagem de erro para o Windows. O usuário verá a mensagem quando conferir o status do compartilhamento no painel Compartilhar. Depois que você reportar o erro, o seu aplicativo será fechado e o compartilhamento, concluído. O usuário precisará iniciar novamente para compartilhar o conteúdo com o seu aplicativo.</p>  <p>No exemplo do compartilhamento de destino do Food with Friends, se o aplicativo não puder identificar um restaurante em seu banco de dados que corresponda ao restaurante que foi compartilhado a partir do aplicativo de origem pelo formato de dados <a href="http://schema.org/Restaurant" target="_blank">Restaurant</a><u></u>, ele deverá reportar um erro. </p>  <h2>Vamos recapitular!</h2>  <p>O compartilhamento entre aplicativos fornece uma ótima oportunidade de compartilhar aplicativos de destino. Habilitando o seu aplicativo para receber conteúdo compartilhado, os seus usuários aproveitarão o seu aplicativo mesmo quando estiverem envolvidos em outra atividade. Esperamos que agora você compreenda melhor os princípios de design, os tipos de dados, as classes e propriedades que você pode usar para criar um ótimo destino de compartilhamento. Estamos ansiosos para saber como os seus aplicativos transformarão o conteúdo compartilhado e criarão experiências mais amplas e sofisticadas para o usuário final.</p>  <p>Se desejar saber mais sobre o compartilhamento, leia <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh464923.aspx" target="_blank">Copiando e trocando dados</a><u></u> e <a href="http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782" target="_blank">Share content target app sample</a><u></u> (Exemplo de aplicativo de destino de compartilhamento de conteúdo) para começar!</p>  <p>Ishita Kapur</p>  <p>Gerente de programas</p>  <p>Experiência do usuário do Windows</p> <!-- Title: “Compartilhando com o seu aplicativo de destino” Tags: “compartilhando aplicativos, aplicativos de destino, conteúdo compartilhado, compartilhar destino, compartilhando aplicativos de destino” --> </div>]]></content:encoded>
    </item>
    <item>
      <title>Desenvolva um aplicativo avançado com NFC</title>
      <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/desenvolva-um-aplicativo-avanado-com-nfc</link>
      <pubDate>Wed, 24 Apr 2013 15:40:52 GMT</pubDate>
      <dc:creator><![CDATA[Windows 8 Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windowsappdev_br/2013/04/24/desenvolva-um-aplicativo-avanado-com-nfc/</guid>
      <description><![CDATA[A comunicação a curta distância (NFC, Near Field Communication) é uma tecnologia sem fio emergente...]]></description>
      <content:encoded><![CDATA[<div class="PostContent"> <p>A comunicação a curta distância (NFC, Near Field Communication) é uma tecnologia sem fio emergente de curto alcance. Com um alcance preciso de 2 cm, os usuários podem enviar/receber conteúdo tocando em dispositivos que estejam próximos um do outro para juntá-los. O toque permite que você selecione algo (ou alguém) rapidamente. Além de ser rápido, também é fácil de aprender. Basta ver para entender. Não é preciso ler um manual.</p>  <p>Por exemplo, imagine que você está vendo fotos com uma amiga e ela quer que você envie essas fotos para ela. Com a NFC, você só precisa tocar no seu dispositivo para enviá-las. Parece simples demais? Talvez, mas a ideia principal é simplificar o compartilhamento de conteúdo entre dispositivos.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/1732.NFC-image_04E645BB.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/1732.NFC_2D00_image_5F00_04E645BB.png"><img title="&#39;Esta imagem mostra o Nokia 360 Speaker compartilhando as informações de emparelhamento Bluetooth com um Windows Phone" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="&#39;Esta imagem mostra o Nokia 360 Speaker compartilhando as informações de emparelhamento Bluetooth com um Windows Phone" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/3566.NFC-image_thumb_38420917.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3566.NFC_2D00_image_5F00_thumb_5F00_38420917.png" width="400" height="348" /></a></p>  <p align="center">Figura 1: Esta imagem mostra o Nokia 360 Speaker compartilhando as informações    <br />de emparelhamento Bluetooth com um Windows Phone</p>  <p>Assim como o Bluetooth e o Wi-Fi, NFC é um protocolo sem fio padrão definido pela <a href="http://www.nfc-forum.org/home/" target="_blank">NFC Forum</a><u></u>. <u></u>Seu PC precisa de um rádio de NFC. Há muitos PCs com Windows 8 que têm rádios de NFC integrados diretamente a eles. Se a NFC não vier inclusa como parte do seu PC, você pode comprar dongles e conectá-los ao PC.</p>  <p>A NFC oferece funcionalidades bacanas. Os usuários podem tocar e enviar fotos, tocar em um menu para fazer um pedido em um restaurante, ou até mesmo tocar para emparelhar um dispositivo Bluetooth. Esses cenários são bastante diferentes entre si, mas o que eles têm em comum é o ¨toque¨ para iniciar a experiência. A NFC é usada em vários tipos de dispositivos, como PCs, telefones, alto-falantes, headsets, telas sem fio etc. para transformar a conexão entre dispositivos em uma experiência verdadeiramente intuitiva. Além disso, a NFC usa marcas de RFID; antenas leves, passivas e bastante econômicas que podem conter um volume considerável de dados e aderem a praticamente qualquer objeto, geralmente cartazes. Por exemplo, para comprar o ingresso de um filme bastaria tocar no cartaz do filme! Isso se chama marca de NFC. Apresentaremos um exemplo básico do toque em um marca de NFC para demonstrar os principais conceitos da API de NFC.</p>  <p>Mas, primeiro, vamos explicar melhor o que significa tocar para juntar dispositivos que estão próximos.</p>  <h2>Definição de ¨toque¨</h2>  <p>Assim como você toca para emparelhar um mouse Bluetooth ou para compartilhar fotos, também é importante tocar para juntar dispositivos que estejam próximos. Ainda que o conceito de toque já esteja bastante difundido, o toque para juntar um PC a outro dispositivo é uma novidade para a maioria das pessoas. Apresentamos algumas diretrizes do toque que mostram aos usuários:</p>  <ol>   <li>     <div align="center"><b>Onde é possível tocar para juntar os dispositivos</b>: com o uso da marca de toque, também conhecida como a marca visual de ¨Tocar e Fazer¨, que indica onde a antena de NFC está localizada. Dependendo do modelo do PC, há diferentes partes que podem ser tocadas. Por exemplo, você pode tocar na parte traseira de um tablet ou na parte frontal de um tudo-em-um. Esta é a aparência da marca em qualquer PC com Windows 8 habilitado para NFC:         <br /></div>     <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/0830.NFC-logo_66E85720.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/0830.NFC_2D00_logo_5F00_66E85720.png"><img title="Marca visual de Tocar e Fazer" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Marca visual de Tocar e Fazer" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/5611.NFC-logo_thumb_3FAE0DEB.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5611.NFC_2D00_logo_5F00_thumb_5F00_3FAE0DEB.png" width="200" height="147" /></a>      <p align="center">Figura 2: Marca visual de Tocar e Fazer</p>   </li>    <li><b>Os dispositivos estão se comunicando entre si</b>: durante o toque, os usuários devem ter a certeza de que algo está acontecendo, mesmo que não possam ver os dados que estão sendo transferidos. Por isso, o Windows reproduz um som quando os dispositivos estão próximos e se comunicando entre si.</li> </ol>  <p>O Windows executa essas ações automaticamente, para que você não precise se preocupar com isso. Para obter mais informações sobre os elementos da experiência do usuário, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/hardware/hh770524.aspx" target="_blank">Especificações de implementação da proximidade de curta distância</a><u></u>. Tendo isso em mente, vamos explorar alguns cenários bacanas que você pode experimentar com a NFC.</p>  <h2>Quando usar a NFC </h2>  <p>Use a NFC quando um usuário precisar selecionar algo ou alguém no seu aplicativo. A NFC oferece uma forma intuitiva de selecionar, e é geralmente mais rápida (e mais bacana!) que a busca manual. O toque é o gatilho que inicia a experiência e, dependendo do seu aplicativo, a experiência pode ir desde o recebimento de uma foto até a criação de uma lista de reprodução. A decisão do que acontece depois do toque só depende do seu aplicativo. Então, para simplificar, classificamos esta gama de ações como experiências de ¨Tocar e Fazer¨.</p>  <p>Apresentamos, abaixo, alguns exemplos do uso da NFC para selecionar algo em um aplicativo. Você poderia tocar e...</p>  <ul>   <li><u>Obter informações de um cartaz</u>: <a href="http://www.nfc-forum.org/news/pr/view?item_key=2c0cb92de7d47bbbe7c99f13912b3307fc03c1c6" target="_blank">As marcas de NFC</a> são marcas de RFID leves e econômicas que custam entre US$ 0,15 e US$ 1,00 (o preço depende do custo de impressão). Elas podem ser comparadas a códigos de barras 2D, mas são mais fáceis e rápidas de usar. Tocar em uma marca é mais confortável do que tirar uma foto do código de barra (e esperar que a câmera pegue o ângulo certo). Há cada vez mais fabricantes inserindo marcas em cartazes em áreas movimentadas, como aeroportos, estações de metrô e paradas de ônibus. As marcas de NFC podem conter de 48 B a 4 KB de dados. Você pode programar uma marca para iniciar seu aplicativo em uma página específica. </li> </ul>  <ul>   <li>T<u>rocar informações de contato</u>: em vez de soletrar seus dados de contato para um amigo e esperar que ele tenha anotado certo, toque nos dispositivos para juntá-los e trocar as informações de contato. Assim como no caso acima, você pode programar suas informações em um cartão de visitas/marca de NFC ou transferir as informações diretamente por meio de um aplicativo.</li>    <li><u>Reproduzir sua estação de rádio favorita</u>: use uma marca de NFC para iniciar uma estação de rádio em casa onde você estiver; no trabalho, na academia ou no carro. Você pode até mesmo ter várias estações de rádio programadas em diferentes marcas, como, por exemplo: uma marca para a academia, outra para o trabalho e outra para a hora de dormir.</li>    <li><u>Fazer seu pedido em um restaurante cheio</u>: ir a um restaurante badalado na hora do jantar significa ter de esperar um bom tempo para simplesmente fazer um pedido. Em vez disso, toque em uma marca na mesa para fazer o seu pedido.</li>    <li><u>Jogar um jogo multiplayer com um amigo: </u>você pode se conectar facilmente a um jogo multiplayer como Battleship, Xadrez ou Scrabble com um amigo, tocando nos dispositivos para juntá-los. Após o toque, a conexão persiste por meio de um transporte fora de banda com alcance e taxa de transferência maiores, como Bluetooth ou Wi-Fi-Direct. </li> </ul>  <p>Agora que já temos uma boa noção sobre quando podemos usar a NFC, vamos para a parte divertida: desenvolver um aplicativo com nossas APIs de proximidade do Windows 8.</p>  <h2>Como implementar a NFC </h2>  <p>Como você pôde observar, a NFC facilita várias tarefas diárias para os usuários finais. Ajustar um alarme, por exemplo. Tenho certeza de que todo mundo já passou pela experiência de colocar a hora errada no alarme para despertar. Quando já está tarde e você só quer dormir, talvez não seja a melhor hora para fazer isso. A NFC facilita essa tarefa. Basta você tocar em uma marca predefinida, confirmar e ir dormir sem preocupações. Então, para ajudar os usuários nessa tarefa diária, suponha que você criou um aplicativo básico de alarme que permite aos usuários ajustar um alarme com o uso de uma marca de NFC. Essa suposição se divide em dois cenários.</p>  <ol>   <li><u>Ajustar um alarme <b>na</b> marca</u>: As marcas de NFC podem ser reutilizáveis, por isso o aplicativo deve permitir que os usuários programem um alarme. Por exemplo, um usuário pode querer programar diferentes alarmes: um para os dias úteis e outro para o fim de semana. Isso se chama publicar dados em uma marca.</li>    <li><u>Ajustar um alarme <b>a partir</b> da marca</u>: Depois que o usuário tocar em uma marca, o aplicativo deve ser iniciado para confirmar o ajuste do alarme. Isso significa que o aplicativo pode ser iniciado com contexto ou argumentos. </li> </ol>  <p>A API de NFC oferece várias maneiras de cumprir o mesmo objetivo, mas abordarei a forma mais simples de implementar esse cenário.</p>  <p>Vamos ver, passo a passo, como ajustar um alarme em uma marca de NFC:</p>  <ol>   <li>Mário inicia o aplicativo de alarme e define uma hora, digamos, 7:00. Isso é só o alarme, ainda sem nenhum envolvimento com a NFC.</li>    <li>Mário seleciona uma opção para ¨Ajustar alarme em marca de NFC¨. Nesse momento, o aplicativo chama as APIs de NFC para publicar informações no rádio NFC, especificamente uma cadeia de caracteres identificadora de aplicativo &amp; 07:00. As marcas de NFC usam um formato de mensagem padronizado: o NDEF (formato de troca definido de NFC). Seu aplicativo <b>não </b>precisa se preocupar com a formatação de dados em uma mensagem de NDEF. O Windows faz isso para você! Agora, o usuário pode tocar na marca de NFC.</li>    <li>Mário toca na marca com o uso do PC, e o aplicativo confirma a programação da marca. Depois que a marca é tocada, é importante que os usuários saibam que seu aplicativo programou a marca com êxito. Como discutimos anteriormente, o toque no PC é um conceito novo para a maioria das pessoas, por esse motivo, a confirmação deixa o usuário confiante de que o que ele fez deu certo. O aplicativo sabe que uma mensagem foi transmitida com êxito registrando a informação em um manipulador de mensagens transmitidas.</li> </ol>  <p>As APIs de NFC podem ser encontradas no namespace <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.proximity.aspx" target="_blank">Windows.Networking.Proximity</a>. Elas desempenharão uma função na etapa 2, depois que o usuário selecionar a opção ¨Ajustar alarme em marca de NFC¨. Primeiro, o aplicativo inicializa um objeto de proximidade. O objeto de proximidade é usado para informar quando uma marca (ou dispositivo) está dentro/fora do alcance. Depois, adicionaremos um manipulador de eventos DeviceArrival. O manipulador detecta quando a marca é tocada, o que significa que podemos começar a escrever informações na marca. É útil informar aos usuários que eles estão escrevendo em uma marca, para que eles não saiam do alcance. Você pode usar o mesmo evento para detectar quando qualquer dispositivo de proximidade é tocado.</p>  <p>O trecho de código a seguir mostra como inicializar e adicionar um manipulador de eventos DeviceArrival.</p>  <p><strong>JavaScript</strong></p>  <blockquote>   <div>     <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> proximityDevice;<br /><br /><span style="color: rgb(0, 0, 255);">function</span> initializeProximityDevice() {<br />    proximityDevice = Windows.Networking.Proximity.ProximityDevice.getDefault();<br /><br />    <span style="color: rgb(0, 0, 255);">if</span> (proximityDevice) {<br />        proximityDevice.addEventListener(<span style="color: rgb(0, 96, 128);">&quot;devicearrived&quot;</span>, proximityDeviceArrived);<br />       <br />}<br />   <span style="color: rgb(0, 0, 255);">else</span> {<br />        <span style="color: rgb(0, 128, 0);">// No NFC radio on the PC, display an error message</span><br />    }<br /><br /><br /><span style="color: rgb(0, 0, 255);">function</span> proximityDeviceArrived(device) {<br />        <span style="color: rgb(0, 128, 0);">// Let the user know we’re ‘Writing to Tag’</span><br /><br />}<br />}<br /></pre>
  </div>
</blockquote>

<div>
  <br /><strong>C#</strong></div>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 255);">void</span> InitializeProximityDevice()<br />{<br /><br />Windows.Networking.Proximity.ProximityDevice proximityDevice;<br />    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();<br /><br />    <span style="color: rgb(0, 0, 255);">if</span> (proximityDevice != <span style="color: rgb(0, 0, 255);">null</span>) {<br />        proximityDevice.DeviceArrived += ProximityDeviceArrived;<br />    <br />    }<br />    <span style="color: rgb(0, 0, 255);">else</span><br />    {<br />        <span style="color: rgb(0, 128, 0);">// No NFC radio on the PC, display an error message</span><br />    }<br />}<br /><br /><span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 255);">void</span> ProximityDeviceArrived(Windows.Networking.Proximity.ProximityDevice device)<br />{<br />            <span style="color: rgb(0, 128, 0);">// Let the user know we’re ‘Writing to Tag’</span><br /><br />}<br /></pre>
  </div>
</blockquote>

<p>
  <br />Em seguida, publicamos informações na marca. O aplicativo publica duas coisas: uma cadeia de caracteres identificadora de aplicativo, que consiste em uma ID e uma plataforma de aplicativos, e argumentos de inicialização. No Windows 8, a ID de aplicativo é &lt;<a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.applicationmodel.packageid.familyname.aspx" target="_blank">nome da família do pacote</a>&gt;!&lt;<a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211415.aspx" target="_blank">ID de aplicativo</a>&gt;, e a plataforma de aplicativos é ¨Windows¨. Você deve copiar o valor da ID de aplicativo do atributo ID do elemento Application no manifesto do pacote do seu aplicativo. O argumento de inicialização é ¨07:00¨; o alarme definido pelo usuário. Chamaremos isso de a <b>mensagem</b>.</p>

<p>Se o aplicativo funcionar em várias plataformas, você poderá publicar IDs e plataformas de aplicativos alternativas, para que você possa tocar na mesma marca em outro dispositivo compatível com NFC, como o Windows Phone 8! Para obter mais informações sobre <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.proximity.peerfinder.alternateidentities.aspx" target="_blank">IDs alternativas</a>, visite o MSDN.</p>

<p>O aplicativo publica os dados na marca usando um método chamado <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh701134.aspx" target="_blank">publishBinaryMessage</a>. O método assume três parâmetros: messageType, mensagem e uma função messageTransmittedHandler. Definiremos messageType como ¨LaunchApp:WriteTag¨, que informa ao Windows que seu aplicativo quer escrever informações em uma marca de NFC. A mensagem é apenas a mensagem que definimos anteriormente (argumentos de inicialização e cadeia de caracteres identificadora de aplicativo). Precisaremos armazenar a mensagem como mensagem binária em um buffer. A função messageTransmittedHandler registra retornos de chamadas. Com isso, seu aplicativo sabe que a mensagem foi escrita com êxito na marca. Usaremos essa função para informar duas coisas ao usuário: escrevemos uma mensagem com êxito na marca e a marca não precisa mais estar dentro do alcance.</p>

<p>As mensagens continuam sendo publicadas até a função StopPublishingMessage ser chamada, ou quando o objeto ProximityDevice for liberado. Neste exemplo, usaremos a função de interrupção. PublishBinaryMessage retorna uma ID de publicação. Usaremos essa mesma ID de publicação para interromper a publicação da mensagem no rádio de NFC.</p>

<p>O trecho de código a seguir mostra como escrever dados em uma marca de NFC.</p>

<p><strong>JavaScript</strong></p>

<blockquote>
  <div>
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> proximityDevice;<br /><br /><span style="color: rgb(0, 0, 255);">function</span> getAlarmTime(){<br /><br />    <span style="color: rgb(0, 128, 0);">// Grab time set by the user, call this variable ‘Alarm’</span><br />    <span style="color: rgb(0, 0, 255);">return</span> Alarm;<br /><br />}<br /><br /><span style="color: rgb(0, 0, 255);">function</span> publishLaunchApp() {<br />    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();<br /><br /><span style="color: rgb(0, 0, 255);">if</span> (proximityDevice) {<br />        <span style="color: rgb(0, 128, 0);">// The format of the app launch string is: &quot;&lt;args&gt;\tWindows\t&lt;AppName&gt;&quot;.</span><br />        <span style="color: rgb(0, 128, 0);">// The string is tab or null delimited.</span><br /><br />        <span style="color: rgb(0, 128, 0);">// The &lt;args&gt; string can be an empty string (&quot;&quot;).</span><br />        <span style="color: rgb(0, 0, 255);">var</span> launchArgs = getAlarmTime();<br /><br />        <span style="color: rgb(0, 128, 0);">// The format of the AppName is: PackageFamilyName!PRAID.</span><br />        <span style="color: rgb(0, 0, 255);">var</span> praid = <span style="color: rgb(0, 96, 128);">&quot;AlarmApp&quot;</span>; <span style="color: rgb(0, 128, 0);">// The Application Id value from your package.appxmanifest.</span><br /><br />        <span style="color: rgb(0, 0, 255);">var</span> appName = Windows.ApplicationModel.Package.current.id.familyName + <span style="color: rgb(0, 96, 128);">&quot;!&quot;</span> + praid;<br /><br />        <span style="color: rgb(0, 0, 255);">var</span> launchAppMessage = launchArgs + <span style="color: rgb(0, 96, 128);">&quot;\tWindows\t&quot;</span> + appName;<br /><br />        <span style="color: rgb(0, 0, 255);">var</span> dataWriter = <span style="color: rgb(0, 0, 255);">new</span> Windows.Storage.Streams.DataWriter();<br />        dataWriter.unicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.utf16LE;<br />        dataWriter.writeString(launchAppMessage);<br />        <span style="color: rgb(0, 0, 255);">var</span> launchAppPubId =<br />             proximityDevice.publishBinaryMessage(<br />                 <span style="color: rgb(0, 96, 128);">&quot;LaunchApp:WriteTag&quot;</span>, <br />                 dataWriter.detachBuffer(), <br />                 proximityWriteTagLaunchAppMessageTransmitCallback);<br />        <br />    <span style="color: rgb(0, 0, 255);">if</span> (launchAppPubId != -1) {<br />            <span style="color: rgb(0, 128, 0);">// Stop publishing the message on NFC radio</span><br />        proximityDevice.stopPublishingMessage(launchAppPubId);<br />    }<br /><br />     }<br />}<br /><br /><span style="color: rgb(0, 0, 255);">function</span> proximityWriteTagLaunchAppMessageTransmitCallback() {<br />    <span style="color: rgb(0, 128, 0);">// Inform the user that: the message has been successfully written to a tag &amp; the tag no longer needs to be in range</span><br />}<br /></pre>
  </div>
</blockquote>

<div>
  <br /><strong>C#</strong></div>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">Windows.Networking.Proximity.ProximityDevice proximityDevice;<br /><br /><span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 255);">string</span> GetAlarmTime(){<br /><br />    <span style="color: rgb(0, 128, 0);">// Grab time set by the user, call this variable ‘Alarm’</span><br />    <span style="color: rgb(0, 0, 255);">return</span> Alarm;<br />}<br /><br /><span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 255);">void</span> PublishLaunchApp()<br />{<br />    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();<br /><br /><span style="color: rgb(0, 0, 255);">if</span> (proximityDevice != <span style="color: rgb(0, 0, 255);">null</span>)<br />    {<br />        <span style="color: rgb(0, 128, 0);">// The format of the app launch string is: &quot;&lt;args&gt;\tWindows\t&lt;AppName&gt;&quot;.</span><br />        <span style="color: rgb(0, 128, 0);">// The string is tab or null delimited.</span><br /><br />        <span style="color: rgb(0, 128, 0);">// The &lt;args&gt; string can be an empty string (&quot;&quot;).</span><br />        <span style="color: rgb(0, 0, 255);">string</span> launchArgs = getAlarmTime();<br /><br />        <span style="color: rgb(0, 128, 0);">// The format of the AppName is: PackageFamilyName!PRAID.</span><br />        <span style="color: rgb(0, 0, 255);">string</span> praid = <span style="color: rgb(0, 96, 128);">&quot;MyAppId&quot;</span>; <span style="color: rgb(0, 128, 0);">// The Application Id value from your package.appxmanifest.</span><br /><br />        <span style="color: rgb(0, 0, 255);">string</span> appName = Windows.ApplicationModel.Package.Current.Id.FamilyName + <span style="color: rgb(0, 96, 128);">&quot;!&quot;</span> + praid;<br /><br />        <span style="color: rgb(0, 0, 255);">string</span> launchAppMessage = launchArgs + <span style="color: rgb(0, 96, 128);">&quot;\tWindows\t&quot;</span> + appName;<br /><br />        var dataWriter = <span style="color: rgb(0, 0, 255);">new</span> Windows.Storage.Streams.DataWriter();<br />        dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;<br />        dataWriter.WriteString(launchAppMessage);<br />        var launchAppPubId =<br />        proximityDevice.PublishBinaryMessage(<br />            <span style="color: rgb(0, 96, 128);">&quot;LaunchApp:WriteTag&quot;</span>, dataWriter.DetachBuffer(), <br />            proximityWriteTagLaunchAppMessageTransmitCallback);<br />    <br />    <span style="color: rgb(0, 0, 255);">if</span> (launchAppPubId!= -1)<br />    {<br />        proximityDevice.StopPublishingMessage(launchAppPubId);<br />    <span style="color: rgb(0, 128, 0);">// Stop publishing the message on NFC radio</span><br />    }<br /><br />    }<br />}<br /><br /><span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 255);">void</span> proximityWriteTagLaunchAppMessageTransmitCallback(<br />    Windows.Networking.Proximity.ProximityDevice sender,<br />    <span style="color: rgb(0, 0, 255);">long</span> messageId)<br />{<br />        <span style="color: rgb(0, 128, 0);">// Inform the user that: the message has been successfully written to a tag &amp; the tag no longer needs to be in range</span><br />}<br /></pre>
  </div>
</blockquote>

<br />E é isso! Agora você já sabe como escrever em uma marca de NFC por meio de um aplicativo da Windows Store. É bem simples, então vamos para o cenário seguinte: ajustar um alarme <b>a partir</b> da marca. Vamos ver, passo a passo, como ler um alarme de uma marca de NFC: 

<ol>
  <li>Mário está lendo um livro digital/escrevendo um email/jogando/usando o Windows e se lembra que precisa ajustar o alarme para segunda-feira de manhã. Ele pega sua marca de ¨Alarme de fim de semana¨e toca nela pelo PC. Ele recebe uma notificação do sistema convidando-o a iniciar seu aplicativo de alarme. O Windows cuida de tudo até esse ponto. Seu aplicativo não precisa fazer nada.</li>

  <li>Mário aceita, e seu aplicativo é inicializado, exibindo a tela ¨Confirmar alarme¨ e o horário 7:00. Depois que o Mário aceita a notificação do sistema, o Windows envia os argumentos de inicialização (iguais aos de cima) ao seu aplicativo durante a ativação. Isso se chama inicialização contextual, e é o mesmo que inicializar o aplicativo em uma página específica.</li>

  <li>Mário define o alarme. Isso é só o alarme, sem a NFC.</li>
</ol>

<p>É bem fácil obter os argumentos de inicialização da marca de NFC. O aplicativo precisa manipular inicialização contextual de uma marca de NFC. A inicialização contextual é o mesmo que inicializar seu aplicativo em uma página específica. Nossos argumentos de inicialização especificam um alarme (7:00), que seu aplicativo usa para exibir um alarme proposto. Além disso, se o seu aplicativo não estiver instalado no PC, o Windows convidará o Mário a instalar o aplicativo a partir da Windows Store, automaticamente!</p>

<p>O trecho de código a seguir mostra como implementar a inicialização contextual.</p>

<p><strong>JavaScript</strong></p>

<blockquote>
  <div>
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">app.onactivated = <span style="color: rgb(0, 0, 255);">function</span> (args) {<br />    <span style="color: rgb(0, 0, 255);">if</span> (args.detail.kind === activation.ActivationKind.launch) {<br />        <span style="color: rgb(0, 0, 255);">if</span> (args.detail.arguments == <span style="color: rgb(0, 96, 128);">&quot;Windows.Networking.Proximity.PeerFinder:StreamSocket&quot;</span>) {<br />            <span style="color: rgb(0, 128, 0);">//do nothing here.</span><br />        }<br />        <span style="color: rgb(0, 0, 255);">else</span> {<br />    <span style="color: rgb(0, 128, 0);">// Use args.detail.arguments to parse out ’07.00’ string, and display to the user</span><br />        }<br /><br />        args.setPromise(WinJS.UI.processAll());<br />    }<br />}<br /></pre>
  </div>
</blockquote>

<div>
  <br /><strong>C#</strong></div>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">async <span style="color: rgb(0, 0, 255);">protected</span> <span style="color: rgb(0, 0, 255);">override</span> <span style="color: rgb(0, 0, 255);">void</span> OnLaunched(LaunchActivatedEventArgs args)<br />        {<br />            <span style="color: rgb(0, 0, 255);">if</span> (args.Arguments == <span style="color: rgb(0, 96, 128);">&quot;Windows.Networking.Proximity.PeerFinder:StreamSocket&quot;</span>)<br />            {<br />                _isLaunchedByTap = <span style="color: rgb(0, 0, 255);">true</span>;<br />            }<br />            <span style="color: rgb(0, 0, 255);">else</span><br />            {<br /><span style="color: rgb(0, 128, 0);">// Use args.Arguments to parse out ’07.00’ string, and display to the user</span><br /><br />            }<br />            Window.Current.Activate();<br />        }<br /></pre>
  </div>
</blockquote>

<p>
  <br />Isso é tudo que seu aplicativo precisa fazer para dar suporte à leitura e gravação em uma marca de NFC. Bem simples para um cenário de tecnologia tão avançada! Antes de terminar, vamos falar sobre uma questão de higiene: o tratamento de erros.</p>

<h2>Tratamento de erros</h2>

<p>Há alguns erros comuns que seu aplicativo pode encontrar.</p>

<ul>
  <li>A marca tocada não tem o formato NDEF. O Windows 8 não oferece suporte automático à reformatação de uma marca em NDEF, por isso você precisa baixar e instalar um formatador de NDEF.</li>

  <li>A marca tocada é somente para leitura. Algumas marcas de NFC podem estar bloqueadas com permissão somente de leitura (como as antigas <a href="http://pt.wikipedia.org/wiki/VHS" target="_blank">fitas de VHS</a>).</li>

  <li>A marca tocada é pequena demais e não comporta todos os dados.</li>

  <li>O PC de um usuário não tem NFC. Como mencionei desde o início, a NFC é uma tecnologia emergente cuja adoção ainda está sendo difundida. Para verificar se um PC oferece suporte à proximidade, use o método ProximityDevice.getDefault(); o método retornará NULL se não houver rádios NFC instalados.</li>
</ul>

<h2>É divertida e intuitiva!</h2>

<p>A NFC finalmente chegou, pronta para os consumidores padrão, e o Windows tem o ecossistema e uma experiência de usuário completa e bem projetada. A tecnologia tem muito potencial para desenvolver aplicativos e experiências em dispositivos altamente intuitivos. É divertida e intuitiva. </p>

<p>A NFC é um assunto bastante vasto, por isso fique atento nas próximas postagens no blog sobre outras experiências bacanas para desenvolvedores de NFC no Windows 8.</p>

<p>Para saber mais sobre NFC e proximidade, consulte os recursos abaixo.</p>

<h2>Recursos</h2>

<div align="center">
  <table class="b8table" cellspacing="0" cellpadding="3" width="298" align="center" border="0"><tbody>
      <tr>
        <td valign="top" width="197">
          <p><strong>Link</strong></p>
        </td>

        <td valign="top" width="99">
          <p><strong>Types</strong></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="197">
          <p align="left"><u><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465215.aspx" target="_blank">Diretrizes para desenvolver usando a proximidade</a></u></p>
        </td>

        <td valign="top" width="99">
          <p>Documento</p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="197">
          <p align="left"><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br241250.aspx" target="_blank">APIs de proximidade</a></p>
        </td>

        <td valign="top" width="99">
          <p>Documento</p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="197">
          <p align="left"><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh967765.aspx" target="_blank">Testando e resolvendo problemas de proximidade em aplicativos</a></p>
        </td>

        <td valign="top" width="99">
          <p>Documento</p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="197">
          <p align="left"><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465223.aspx" target="_blank">Publicação e subscrição (com mais detalhes)</a></p>
        </td>

        <td valign="top" width="99">
          <p>Documento</p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="197">
          <p align="left"><a href="http://code.msdn.microsoft.com/windowsapps/Proximity-Sample-88129731" target="_blank">Amostra de aplicativo com proximidade</a></p>
        </td>

        <td valign="top" width="99">
          <p>Amostra</p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="197">
          <p align="left"><a href="http://social.msdn.microsoft.com/Forums/pt-br/category/windowsapps" target="_blank">Tem alguma pergunta sobre proximidade? Pergunte aqui</a></p>
        </td>

        <td valign="top" width="99">
          <p>Fórum</p>
        </td>
      </tr>
    </tbody></table>
</div>

<p>Obrigada,</p>

<p>Priya Dandawate 
  <br />gerente de programas, dispositivos e rede</p>

<p>Com as contribuições de: Max Morris, Marzena Makuta, Mike Loholt, Jake Sabulsky e Vishal Mhatre</p>

<!-- Title: “Desenvolva um aplicativo avançado com NFC” Tags: “compartilhamento, NFC, comunicação a curta distância, compartilhar arquivos, emparelhamento Bluetooth, compartilhar dados” --></div>]]></content:encoded>
    </item>
    <item>
      <title>Criando aplicativos conectados da Windows Store</title>
      <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/criando-aplicativos-conectados-da-windows-store</link>
      <pubDate>Wed, 17 Apr 2013 13:57:52 GMT</pubDate>
      <dc:creator><![CDATA[Windows 8 Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windowsappdev_br/2013/04/17/criando-aplicativos-conectados-da-windows-store/</guid>
      <description><![CDATA[As pessoas estão sempre cercadas por dispositivos conectados a uma rede. Até mesmo as geladeiras e...]]></description>
      <content:encoded><![CDATA[<div class="postcontent">  <p>As pessoas estão sempre cercadas por dispositivos conectados a uma rede. Até mesmo as geladeiras e máquinas de lavar mais modernas podem se conectar à Internet e a redes domésticas. Por isso, é claro que os usuários finais esperam que seus aplicativos também estejam conectados. Esses ¨aplicativos conectados¨ consomem o conteúdo mais recente da Web: mídias sociais, mídias digitais, blogs e outros tipos de conteúdo. O desenvolvimento de aplicativos conectados tornou-se a norma, ainda assim pode ser desafiador lidar com problemas comuns, como a perda da conexão à rede, os custos de redes limitadas ou problemas de desempenho. Mais do que nunca, o Windows 8 facilita a escrita de um aplicativo conectado. </p>  <p>Nesta postagem, apresentaremos algumas dicas úteis para você proporcionar uma experiência de conexão rápida, fluida e descomplicada aos usuários dos seus aplicativos da Windows Store. </p>  <ul>   <li>Escolha a API certa para os seus cenários</li>    <li>Escolha as funcionalidades de rede certas</li>    <li>Adapte o comportamento do aplicativo para redes limitadas</li>    <li>Reaja à alteração de status da rede</li>    <li>Conteúdo de cache para fluidez</li> </ul>  <p>Agora, vamos falar mais sobre os detalhes de cada dica.</p>  <h2>Escolha a API certa</h2>  <p>Para construir uma casa, você vai querer usar as ferramentas certas. Um martelo para martelar pregos, uma serra para cortar tábuas e uma chave de fenda para apertar os parafusos. Da mesma forma, você buscará as APIs de rede certas para desenvolver um aplicativo conectado da Windows Store. O Windows 8 oferece uma grande variedade de APIs de rede que seu aplicativo pode usar para se comunicar com outros computadores e dispositivos pela Internet ou em redes privadas. Por isso, o primeiro passo é determinar os recursos de rede de que seu aplicativo precisa. </p>  <p>O cenário de rede mais comum é o acesso a um site para obter ou armazenar informações. Um exemplo simples seria um jogo que usa um site para armazenar informações e pontuações dos usuários. Um exemplo mais complexo seria um aplicativo que se conecta a um serviço Web baseado em REST e usa uma biblioteca fornecida pelo serviço Web para acessar ou armazenar informações. O Windows 8 conta com várias APIs que se conectam a sites e serviços Web. Com essas APIs, seu aplicativo pode acessar serviços Web que dão suporte a REST ou enviar comandos básicos de protocolo HTTP (como GET e POST) a um servidor Web. Para o acesso à Web, a API certa depende da linguagem que você usa para desenvolver o aplicativo:</p>  <ul>   <li><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh453379.aspx" target="_blank">XMLHTTPRequest</a> e <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br229787.aspx" target="_blank">WinJS.xhr</a>: aplicativos escritos em JavaScript e HTML.</li>    <li><a href="http://msdn.microsoft.com/pt-br/library/system.net.http.httpclient.aspx" target="_blank">HttpClient</a>: aplicativos escritos em C# ou Visual Basic .NET e XAML.</li>    <li><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh831163.aspx" target="_blank">XML HTTP Request 2</a> (IXHR2): aplicativos escritos em C++ e XAML.</li> </ul>  <p>O código a seguir mostra como executar uma solicitação/resposta básica com um serviço Web baseado em REST. Neste caso, o serviço Web poderia executar um script ASP.NET no servidor Web.</p>  <p><strong>JavaScript</strong></p>  <blockquote>   <div id="codeSnippetWrapper">     <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">function</span> makeXHRCall() {<br />    WinJS.xhr({ uri: <span style="color: rgb(0, 96, 128);">&quot;http://www.microsoft.com/en-us/default.aspx” }).done(<br />        function onComplete(result) {<br />            print(result.responseText);<br />        },<br />        function onError(err) {<br />            print(&quot;</span>Error: &quot; + err.responseText);<br />        });<br />}<br /></pre>
  </div>
</blockquote>

<p><strong>C#</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">private</span> async <span style="color: rgb(0, 0, 255);">void</span> MakeHttpCall()<br />{<br />    HttpClient httpClient = <span style="color: rgb(0, 0, 255);">new</span> HttpClient();<br />    <span style="color: rgb(0, 0, 255);">try</span> {<br />        <span style="color: rgb(0, 0, 255);">string</span> response = await httpClient.GetStringAsync(<span style="color: rgb(0, 96, 128);">&quot;http://www.microsoft.com/en-us/default.aspx&quot;</span>);<br />    }<br />    <span style="color: rgb(0, 0, 255);">catch</span> (Exception) {<br />        <span style="color: rgb(0, 128, 0);">// Handle exception.</span><br />    }<br />}<br /></pre>

    <br /></div>
</blockquote>

<p>Para obter mais informações sobre <b>WinJS.xhr</b>, consulte<u> </u><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh761502.aspx" target="_blank">Conectando serviços Web (aplicativos da Windows Store em JavaScript e HTML)</a>. Para obter mais informações sobre <b>HttpClient</b>, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/xaml/hh781239.aspx" target="_blank">Início rápido: Conectando com o uso de HttpClient (aplicativos da Windows Store em C#/VB/C++ e XAML)</a> e a <a href="http://code.msdn.microsoft.com/windowsapps/HttpClient-sample-55700664" target="_blank">amostra de HttpClient</a>.</p>

<p>Outro cenário de rede comum é baixar e carregar arquivos em transferências que podem levar algum tempo. Um exemplo seria um aplicativo de câmera ou galeria de fotos que precisa carregar ou baixar fotos ou álbuns de fotos de um serviço Web. Essas transferências podem levar muito tempo, por isso não faz sentido obrigar o usuário a esperar até que a transferência termine. A API <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.backgroundtransfer.aspx" target="_blank">Windows.Networking.BackgroundTransfer</a> oferece a capacidade de baixar ou carregar arquivos mesmo quando seu aplicativo não está mais em execução. O aplicativo começa a transferência quando está em execução em primeiro plano, com foco, e o Windows 8 continua a transferência em segundo plano, mesmo se o aplicativo não estiver mais em execução.</p>

<p>Outro cenário mais especializado é o acesso a conteúdo sindicalizado. A API <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.web.syndication.aspx" target="_blank">Windows.Web.Syndication</a> pode obter feeds nos formatos RSS ou Atom. Além disso, a API <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.web.atompub.aspx" target="_blank">Windows.Web.AtomPub</a> permite que um aplicativo publique dados em vários formatos AtomPub.</p>

<p>Em cenários para os quais não há um protocolo de rede de nível superior específico disponível por meio de uma API, o Tempo de Execução do Windows também oferece suporte para soquetes TCP e UDP (juntamente com multicast). A API <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.sockets.aspx" target="_blank">Windows.Networking.Sockets</a> oferece uma <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.sockets.streamsocket.aspx" target="_blank">StreamSocket</a> (TCP) e a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.sockets.datagramsocket.aspx" target="_blank">DatagramSocket</a> (UDP) para que você possa implementar outros protocolos de camada superior.</p>

<p><b>Observação: </b>O Windows 8 apresenta um novo tipo de soquete chamada <i>WebSocket</i>. Para obter mais informações sobre WebSockets e quando usá-las, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh761442.aspx" target="_blank">Conectando-se com WebSockets</a>.</p>

<p>A tabela a seguir apresenta uma lista mais completa de recursos de rede suportados, com links para informações adicionais.</p>

<div align="center">  <table class="b8table" cellspacing="0" cellpadding="3" align="center" border="0"><tbody>
      <tr>
        <td valign="top" width="217">
          <p align="center"><b>APIs</b><b></b></p>
        </td>

        <td valign="top" width="221">
          <p align="center"><b>Recursos</b><b></b></p>
        </td>

        <td valign="top" width="145">
          <p align="center"><b>Exemplos</b><b></b></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="217">
          <ul>
            <li>
              <div align="left"><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.web.syndication.aspx" target="_blank">Windows.Web.Syndication</a></b><b></b></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left"><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.web.atompub.aspx" target="_blank">Windows.Web.AtomPub</a></b><b></b></div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>

        <td valign="top" width="221">
          <p align="left"></p>

          <p align="left">Obtenção de feeds nos formatos RSS ou Atom em várias versões. Essas APIs facilitam a implementação de suporte para novos formatos, como OData. O Tempo de Execução do Windows também oferece suporte para o protocolo de publicação Atom, permitindo a publicação de coleções Atom. 
            <br />Para obter mais informações, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh452973.aspx/" target="_blank">Acessando e gerenciando conteúdo sindicalizado</a>.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="145">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/Syndication-sample-07ef6b0d" target="_blank">Amostra de sindicalização</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/AtomPub-sample-c1fcdc8e" target="_blank">Amostra de AtomPub</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Leitores de RSS</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="217">
          <p align="left"></p>

          <p align="left"><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.backgroundtransfer.aspx" target="_blank">Windows.Networking.BackgroundTransfer</a></b></p>

          <p align="left"></p>
        </td>

        <td valign="top" width="221">
          <p align="left"></p>

          <p align="left">Download e carregamento de conteúdo ininterrupto, continuável e com reconhecimento de custos, mesmo quando o aplicativo de chamada não está em primeiro plano. Essa API oferece suporte para transferências de conteúdo com o uso de protocolos HTTP, HTTPS e FTP. 
            <br />Para obter mais informações, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh452979.aspx" target="_blank">Transferindo dados em segundo plano</a>.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="145">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/Background-Transfer-Sample-d7833f61" target="_blank">Amostra de transferência em segundo plano</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">SkyDrive</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Vídeo no Xbox</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="217">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left"><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh453379.aspx" target="_blank">XMLHTTPRequest</a></b><b> (JavaScript</b><b>) </b></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left"><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br229787.aspx" target="_blank">WinJS.xhr</a></b><b> </b><b>(JavaScript)</b></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left"><b><a href="http://msdn.microsoft.com/pt-br/library/system.net.http.httpclient.aspx" target="_blank">HttpClient</a></b><b> </b><b>(C#)</b></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left"><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh831163.aspx">XML HTTP Request 2</a></b><b> (IXHR2)</b><b> </b><b>(C++)</b><b></b></div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>

        <td valign="top" width="221">
          <p align="left"></p>

          <p align="left">Interação com serviços Web baseados em REST e outros protocolos baseados em HTTP. 
            <br />Para obter mais informações, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh761502.aspx" target="_blank">Conectando serviços Web</a>.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="145">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/XHR-handling-navigation-50d03a7a" target="_blank">XHR, manipulação de erros de navegação e amostra de esquemas URL</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/HttpClient-sample-55700664" target="_blank">Amostra de HttpClient</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Mapas do Bing</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="217">
          <p align="left"></p>

          <p align="left"><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.proximity.aspx" target="_blank">Windows.Networking.Proximity</a></b></p>

          <p align="left"></p>
        </td>

        <td valign="top" width="221">
          <p align="left"></p>

          <p align="left">Detecção da proximidade entre dois dispositivos, para que os aplicativos possam ativar a comunicação em rede entre eles com o uso de APIs de soquete. 
            <br />Para obter mais informações, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465229.aspx" target="_blank">Suportando proximidade e toque</a>.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="145">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/Proximity-Sample-88129731" target="_blank">Amostra de proximidade</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Jogos</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Aplicativos de colaboração</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="217">
          <p align="left"></p>

          <p align="left"><b><a href="http://msdn.microsoft.com/library/windows/apps/BR207928" target="_blank">Windows.Storage.Pickers</a></b><b></b></p>

          <p align="left"></p>
        </td>

        <td valign="top" width="221">
          <p align="left"></p>

          <p align="left">Comunicação com compartilhamentos de arquivos remotos. 
            <br />Para obter mais informações, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh464959.aspx" target="_blank">Acessando dados e arquivos</a>.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="145">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/File-picker-sample-9f294cba" target="_blank">Amostra de seletor de arquivos</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Música no Xbox</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Fotos</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="217">
          <p align="left"></p>

          <p align="left"><b><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.sockets.aspx" target="_blank">Windows.Networking.Sockets</a></b><b></b></p>

          <p align="left"></p>
        </td>

        <td valign="top" width="221">
          <p align="left"></p>

          <p align="left">Conexão a um serviço que usa um protocolo não suportado pelas APIs já mencionadas, como SMTP, MAPI ou telnet, ou conexão com outro dispositivo na mesma rede local. Usada também para aplicativos que requerem semântica semelhante a de soquetes (assíncrona, bidirecional) para se conectarem pela Web (incluindo proxies HTTP) a um novo serviço. 
            <br />Para obter mais informações, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh452977.aspx" target="_blank">Conectando-se com soquetes</a>.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="145">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/StreamSocket-Sample-8c573931" target="_blank">Amostra de StreamSocket</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/DatagramSocket-sample-76a7d82b" target="_blank">Amostra de DatagramSocket</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/Connecting-with-WebSockets-643b10ab" target="_blank">Amostra de conexão com WebSockets</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left"><a href="http://code.msdn.microsoft.com/windowsapps/site/search?query=controlchanneltrigger&amp;f%5B0%5D.Value=controlchanneltrigger&amp;f%5B0%5D.Type=SearchText&amp;ac=3" target="_blank">Amostras de ControlChannelTrigger</a></div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Lync, quadro de comunicações ou seletores de estoque</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="217">
          <p align="left"></p>

          <p align="left"><b><a href="http://msdn.microsoft.com/library/windows/apps/BR241587" target="_blank">Windows.Storage.ApplicationData</a></b></p>

          <p align="left"></p>
        </td>

        <td valign="top" width="221">
          <p align="left"></p>

          <p align="left">O Windows 8 transfere automaticamente determinados dados de aplicativos entre os dispositivos dos usuários. O roaming de dados de aplicativos beneficia os aplicativos que os usuários utilizam em mais de um dispositivo, como um PC no trabalho e um tablet em casa, e instala o aplicativo em vários dispositivos. 
            <br />Para obter mais informações, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh465094.aspx" target="_blank">Diretrizes de dados de aplicativo de roaming</a>.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="145">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left"><a href="http://go.microsoft.com/fwlink/p/?linkid=231478" target="_blank">Amostra de dados de aplicativo</a></div>
            </li>
          </ul>
        </td>
      </tr>
    </tbody></table>
</div>

<h2>Escolha as funcionalidades de rede certas</h2>

<p>O isolamento da rede é parte do modelo de segurança de aplicativos usado pelo Windows 8. O Windows detecta limites de rede ativamente e aplica restrições de acesso à rede para o isolamento da mesma. Quando implantadas adequadamente, essas funcionalidades ajudam a proteger seus usuários e aplicativos de ataques mal-intencionados.</p>

<p>Os aplicativos devem declarar funcionalidades de isolamento de rede para definir o escopo do acesso à rede. Sem declarar essas funcionalidades, seu aplicativo não terá acesso aos recursos da rede. Consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/Hh770532.aspx" target="_blank">Como definir as funcionalidades de rede</a> para saber mais sobre como o Windows aplica o isolamento da rede para aplicativos. </p>

<p>Você não pode usar a rede como um mecanismo de comunicação interprocessual entre um aplicativo da Windows Store e um aplicativo de desktop no mesmo dispositivo. Por esse motivo, não é possível usar endereços de loopback IP em um aplicativo da Windows Store. Há exceções limitadas para fins de desenvolvimento que permitem o uso de endereços de loopback IP em operações no depurador do Visual Studio. Para obter mais informações, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/Hh780593.aspx" target="_blank">Como habilitar loopback e solucionar o isolamento de rede</a>.</p>

<p>As solicitações de acesso à rede se dividem em duas categorias: </p>

<ol>
  <li><b>Solicitações de saída iniciadas pelo cliente</b>: Seu aplicativo age como o cliente e inicia o acesso à rede enviando uma solicitação de rede inicial a um computador remoto, normalmente um servidor. O aplicativo envia uma ou mais solicitações ao servidor, e o servidor envia de volta uma ou várias respostas. Por exemplo, todo tráfego de um aplicativo de cliente Web a um servidor Web se inclui nessa categoria.</li>

  <li><b>Solicitações de entrada não solicitadas</b>: Seu aplicativo age como um servidor de rede e escuta solicitações de rede de entrada de um computador remoto. O computador remoto inicia o acesso à rede enviando uma solicitação inicial ao seu aplicativo, que age como um servidor. O computador remoto envia uma ou mais solicitações ao seu aplicativo, que envia de volta uma ou várias respostas ao computador remoto. Por exemplo, um aplicativo que funciona como um servidor de mídia se inclui nessa categoria.</li>
</ol>

<p>Siga o princípio do mínimo de privilégios e adicione apenas as funcionalidades de que seu aplicativo precisa. Talvez seu aplicativo precise apenas de solicitações de saída iniciadas pelo cliente ou também precise de solicitações de entrada não solicitadas. Alguns aplicativos podem precisar também de acesso a certificados e credenciais de usuário no processo de autenticação em uma rede. </p>

<p>A tabela a seguir mostra detalhes das funcionalidades de isolamento de rede e outros recursos relacionados que costumam ser necessários para aplicativos conectados. As três primeiras são funcionalidades primárias de isolamento de rede que os aplicativos conectados usam. Na verdade, seu aplicativo conectado deve ter pelo menos uma destas três primeiras funcionalidades. Os outros itens na tabela são funcionalidades adicionais que muitas vezes são necessárias por alguns aplicativos conectados.</p>

<p> </p>

<div align="center">
  <table class="b8table" cellspacing="0" cellpadding="3" width="612" align="center" border="0"><tbody>
      <tr>
        <td valign="top" width="146">
          <p><b>Funcionalidade de rede</b></p>
        </td>

        <td valign="top" width="273">
          <p><b>Descrição</b></p>
        </td>

        <td valign="top" width="191">
          <p><b>Aplicativos de exemplo</b></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="146">
          <p align="left">Internet (cliente)</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="273">
          <p align="left"></p>

          <p align="left">Fornece acesso de saída à Internet e a redes em locais públicos como aeroportos e cafés. A maioria dos aplicativos que requerem acesso à Internet devem declarar essa funcionalidade.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="191">
          <p align="left">        </p>

          <ul>
            <li>
              <div align="left">Leitores de RSS</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Redes sociais</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Jogos</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="146">
          <p align="left"></p>

          <p align="left">Internet (cliente e servidor)</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="273">
          <p align="left"></p>

          <p align="left">Fornece acesso de entrada e saída à Internet e a redes em locais públicos como aeroportos e cafés. O acesso de entrada a portas essenciais é sempre bloqueado. Essa funcionalidade é um superconjunto da funcionalidade Internet (cliente); não é necessário declarar as duas.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="191">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left">Aplicativos P2P</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Jogos multiplayer que detectam jogadores com o uso de multicast</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="146">
          <p align="left"></p>

          <p align="left">Redes privadas (cliente e servidor)</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="273">
          <p align="left"></p>

          <p align="left">Fornece acesso de entrada e saída à rede em locais privados listados como confiáveis pelo usuário. Esses locais são geralmente as redes de casa ou do trabalho. O acesso de entrada a portas essenciais é sempre bloqueado.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="191">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left">Aplicativos que acessam conteúdo NAS</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Aplicativos de linha de negócios</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Jogos multiplayer que detectam jogadores com o uso de multicast em uma rede privada (em casa ou no trabalho)</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="146">
          <p align="left"></p>

          <p align="left">Proximidade</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="273">
          <p align="left"></p>

          <p align="left">Necessária para comunicação de proximidade a curta distância com dispositivos. Permite que os aplicativos acessem a rede para se conectar a um dispositivo a curta distância, com consentimento do usuário para enviar ou aceitar um convite.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="191">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left">Jogos multiplayer com usuários a curta distância<i></i></div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="146">
          <p align="left"></p>

          <p align="left">Autenticação empresarial</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="273">
          <p align="left"></p>

          <p align="left">Fornece a funcionalidade para se conectar a recursos da intranet empresarial que requerem credenciais de domínio.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="191">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left">Aplicativos de linha de negócios</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="146">
          <p align="left"></p>

          <p align="left">Certificados compartilhados de usuário</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="273">
          <p align="left"></p>

          <p align="left">Fornece a funcionalidade para acessar certificados de software e hardware, como certificados de cartão inteligente, para validar a identidade de um usuário. Quando APIs relacionadas são chamadas no tempo de execução, o usuário deve realizar uma ação (inserir um cartão ou selecionar um certificado). </p>

          <p align="left"></p>
        </td>

        <td valign="top" width="191">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left">Aplicativos de rede privada virtual</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">Aplicativos de linha de negócios</div>
            </li>
          </ul>
        </td>
      </tr>
    </tbody></table>
</div>

<p>Use esta lista de verificação para garantir que o isolamento de rede está configurado no seu aplicativo:</p>

<ul>
  <li>Determine a direção do acesso à rede de que o seu aplicativo precisa, as solicitações de saída iniciadas por clientes, solicitações de entrada não solicitadas, ou ambos.</li>

  <li>Determine o tipo de recursos de rede com os quais o seu aplicativo se comunicará: recursos confiáveis em uma rede doméstica ou corporativa, recursos na Internet ou ambos. </li>

  <li>Configure a capacidade de isolamento mínima necessária da rede no manifesto do aplicativo. Você pode fazer isso usando o <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br230259.aspx" target="_blank">Designer de Manifesto de Aplicativo</a> no Microsoft Visual Studio 2012, ou <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br211477.aspx" target="_blank">adicione-os manualmente</a>.</li>

  <li>Implante e execute o seu aplicativo para testá-lo usando as ferramentas de isolamento da rede para solucionar problemas. Para obter mais informações, consulte <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/Hh780593.aspx" target="_blank">Como habilitar loopback e solucionar o isolamento de rede</a>.</li>
</ul>

<p>A captura de tela seguinte mostra como habilitar as funcionalidades da rede, usando o <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/br230259.aspx" target="_blank">Designer de Manifesto de Aplicativo</a> no Microsoft Visual Studio 2012.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/7268.app-manifest-design_47107BBF.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/7268.app_2D00_manifest_2D00_design_5F00_47107BBF.png"><img title="Selecione funcionalidades de rede no package.appxmanifest do seu aplicativo no Visual Studio 2012" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Selecione funcionalidades de rede no package.appxmanifest do seu aplicativo no Visual Studio 2012" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/7752.app-manifest-design_thumb_5EC7B325.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/7752.app_2D00_manifest_2D00_design_5F00_thumb_5F00_5EC7B325.png" width="600" height="318" /></a></p>

<p align="center"><em>Selecione funcionalidades de rede no package.appxmanifest do seu aplicativo no Visual Studio 2012</em></p>

<h2>Adapte o comportamento do aplicativo para redes limitadas</h2>

<p>Pense sobre a última vez em que você estava chegando ao seu limite mensal de dados ou, talvez, na última vez em que você viajou para o exterior. Nestas situações, eu normalmente acabava usando o meu dispositivo e os meus aplicativos com cautela para evitar tarifas de rede desnecessárias. </p>

<p>O Windows 8 trata desse problema do usuário permitindo que os aplicativos monitorem os recursos disponíveis da rede e se comportem adequadamente quando estiverem em redes limitadas. Para promover a confiança dos usuários em seu aplicativo, você pode torná-lo capaz de identificar quando uma conexão pode incorrer em custos e adaptar o comportamento do aplicativo para evitar ou reduzir essas tarifas.</p>

<p>A API <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.aspx" target="_blank">Windows.Networking.Connectivity</a> fornece informações sobre o tipo e o custo de uma conexão de rede. Isto permite que o seu aplicativo determine quando usar os recursos da rede normalmente, quando usá-los de maneira conservadora ou quando solicitar a permissão do usuário. </p>

<p>Uma <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectionprofile.aspx" target="_blank">ConnectionProfile</a> representa uma conexão de rede. O seu aplicativo pode usar a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.aspx" target="_blank">ConnectionCost</a> de uma <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectionprofile.aspx" target="_blank">ConnectionProfile</a> para determinar se deve ou não adaptar o seu comportamento. A propriedade <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank">NetworkCostType</a> indica o tipo de conexão de uma rede. Existem quatro valores possíveis:</p>

<ul>
  <li><b>Irrestrita</b>: o uso desta conexão de rede é ilimitado. Ela não tem tarifas de uso ou restrições na capacidade.</li>

  <li><b>Fixa</b>: o uso desta conexão de rede é irrestrito até um limite específico.</li>

  <li><b>Variável</b>: o uso desta conexão de rede é limitado por uso de bytes.</li>

  <li><b>Desconhecida</b>: a informação de custo não está disponível para esta conexão de rede.</li>
</ul>

<p>Diversas outras propriedades boolianas para a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.aspx" target="_blank">ConnectionCost</a> oferecem ainda mais informações. </p>

<ul>
  <li><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.roaming.aspx" target="_blank">Roaming</a>: a conexão é com uma rede fora do provedor doméstico.</li>

  <li><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.approachingdatalimit.aspx" target="_blank">ApproachingDataLimit</a>: a conexão está chegando ao limite de uso especificado pelo plano de dados.</li>

  <li><a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.overdatalimit.aspx" target="_blank">OverDataLimit</a>: a conexão excedeu o limite de uso especificado no plano de dados.</li>
</ul>

<p>Faça o seu aplicativo responder às condições indicadas por essas propriedades. Sempre que uma conexão estiver <b>Roaming</b>, os custos de dados associados ao uso da rede podem ser elevados. Quando a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank">NetworkCostType</a> for <b>Variável</b>, a rede é uma rede limitada, onde o usuário paga pelo volume de dados enviados ou recebidos na rede. Quando a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank">NetworkCostType</a> for <b>Fixa</b>, existe causa para preocupação caso o usuário já esteja acima ou chegando próximo ao limite de dados. </p>

<p>Utilizando estas informações, um aplicativo pode seguir essas diretrizes para decidir como melhor utilizar os recursos da rede.</p>

<div align="center">
  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <p align="left"></p>

  <table class="b8table" cellspacing="0" cellpadding="3" align="center" border="0"><tbody>
      <tr>
        <td valign="top" width="97">
          <p><b>Comportamento</b></p>
        </td>

        <td valign="top" width="150">
          <p><b>Custo da conexão</b></p>
        </td>

        <td valign="top" width="168">
          <p><b>Diretrizes do aplicativo</b></p>
        </td>

        <td valign="top" width="175">
          <p><b>Exemplos</b></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="97">
          <p align="left">Normal</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="150">
          <p align="left"></p>

          <p align="left">A <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank">NetworkCostType</a> é <b>irrestrita</b> ou <b>desconhecida</b> e a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.aspx" target="_blank">ConnectionCost</a> não está <b>Roaming</b></p>

          <p align="left"></p>
        </td>

        <td valign="top" width="168">
          <p align="left"></p>

          <p align="left">O aplicativo não implementa restrições. O aplicativo trata a conexão como sendo <b>Ilimitada</b> em custo e sem restrições derivadas de tarifas de uso ou restrições de capacidade.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="175">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left">O aplicativo de media player pode reproduzir um filme HD inteiro.</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">O aplicativo pode fazer o download de um arquivo grande sem quaisquer restrições ou consultas.</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="97">
          <p align="left"></p>

          <p align="left">Conservador</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="150">
          <p align="left"></p>

          <p align="left">A <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank">NetworkCostType</a> é <b>Fixa</b> ou <b>Variável</b> e a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.aspx" target="_blank">ConnectionCost</a> não está <b>Roaming</b> ou <b>OverDataLimit</b></p>

          <p align="left"></p>
        </td>

        <td valign="top" width="168">
          <p align="left"></p>

          <p align="left">O aplicativo implementa restrições para o uso otimizado da rede de modo que possa lidar com operações em redes limitadas.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="175">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left">O aplicativo de media player pode reproduzir filmes em resoluções mais baixas.</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">O aplicativo pode atrasar downloads que não sejam importantes.</div>
            </li>

            <p align="left"></p>
          </ul>

          <p align="left"></p>
        </td>
      </tr>

      <tr>
        <td valign="top" width="97">
          <p align="left"></p>

          <p align="left">Opções</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="150">
          <p align="left"></p>

          <p align="left">A <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.aspx" target="_blank">ConnectionCost</a> está <b>Roaming</b> ou <b>OverDataLimit</b></p>

          <p align="left"></p>
        </td>

        <td valign="top" width="168">
          <p align="left"></p>

          <p align="left">O aplicativo lida com casos excepcionais onde o custo de acesso da rede é significativamente mais alto do que o custo do plano.</p>

          <p align="left"></p>
        </td>

        <td valign="top" width="175">
          <p align="left"></p>

          <ul>
            <p align="left"></p>

            <li>
              <div align="left">O aplicativo avisa o usuário para acessar a rede.</div>
            </li>

            <p align="left"></p>

            <li>
              <div align="left">O aplicativo suspende todas as atividades de rede dos dados em segundo plano.<i></i></div>
            </li>
          </ul>
        </td>
      </tr>
    </tbody></table>
</div>

<p>Este código de exemplo verifica o custo da conexão e faz sugestões para o comportamento adequado do aplicativo. </p>

<p><strong>JavaScript</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> CostGuidance = { Normal: 0, Conservative: 1, OptIn: 2 };<br /><span style="color: rgb(0, 128, 0);">// GetCostGuidance returns an object with a Cost (with value of CostGuidance), </span><br /><span style="color: rgb(0, 128, 0);">// CostName (a string) and Reason, which says why the cost is what it is.</span><br /><span style="color: rgb(0, 0, 255);">function</span> GetCostGuidance() <br />{<br />    <span style="color: rgb(0, 0, 255);">var</span> connectionCost = Windows.Networking.Connectivity.NetworkInformation.getInternetConnectionProfile().getConnectionCost();<br />    <span style="color: rgb(0, 0, 255);">var</span> networkCostConstants = Windows.Networking.Connectivity.NetworkCostType;<br />    <span style="color: rgb(0, 0, 255);">var</span> Retval = <span style="color: rgb(0, 0, 255);">new</span> Object();<br />    <span style="color: rgb(0, 0, 255);">if</span> (connectionCost.roaming || connectionCost.overDataLimit)<br />    {<br />        Retval.Cost = CostGuidance.OptIn;<br />        Retval.CostName = <span style="color: rgb(0, 96, 128);">&quot;OptIn&quot;</span>;<br />        Retval.Reason = connectionCost.roaming<br />            ? <span style="color: rgb(0, 96, 128);">&quot;Connection is roaming; using the connection may result in additional charge.&quot;</span><br />            : <span style="color: rgb(0, 96, 128);">&quot;Connection has exceeded the usage cap limit.&quot;</span>;<br />    }<br />    <span style="color: rgb(0, 0, 255);">else</span> <span style="color: rgb(0, 0, 255);">if</span> (connectionCost.networkCostType == networkCostConstants.<span style="color: rgb(0, 0, 255);">fixed</span><br />        || connectionCost.networkCostType == networkCostConstants.variable)<br />    {<br />        Retval.Cost = CostGuidance.conservative;<br />        Retval.CostName = <span style="color: rgb(0, 96, 128);">&quot;Conservative&quot;</span>;<br />        Retval.Reason = connectionCost.networkCostType == NetworkCostType.<span style="color: rgb(0, 0, 255);">fixed</span><br />            ? <span style="color: rgb(0, 96, 128);">&quot;Connection has limited allowed usage.&quot;</span><br />            : <span style="color: rgb(0, 96, 128);">&quot;Connection is charged based on usage. &quot;</span>;<br />    }<br />    <span style="color: rgb(0, 0, 255);">else</span><br />    {<br />        Retval.Cost = CostGuidance.Normal;<br />        Retval.CostName = <span style="color: rgb(0, 96, 128);">&quot;Normal&quot;</span>;<br />        Retval.Reason = connectionCost.networkCostType == networkCostConstants.unknown<br />            ? <span style="color: rgb(0, 96, 128);">&quot;Connection is unknown.&quot;</span><br />            : <span style="color: rgb(0, 96, 128);">&quot;Connection cost is unrestricted.&quot;</span>;<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">return</span> Retval;<br />}<br /></pre>
  </div>
</blockquote>

<p><strong>C#</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 255);">enum</span> NetworkCost { Normal, Conservative, OptIn };<br /><span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 255);">class</span> CostGuidance<br />{<br />    <span style="color: rgb(0, 0, 255);">public</span> CostGuidance()<br />    {<br />        var connectionCost = NetworkInformation.GetInternetConnectionProfile().GetConnectionCost();<br />        Init(connectionCost);<br />    }<br />    <span style="color: rgb(0, 0, 255);">public</span> NetworkCost Cost { get; <span style="color: rgb(0, 0, 255);">private</span> set; }<br />    <span style="color: rgb(0, 0, 255);">public</span> String Reason { get; <span style="color: rgb(0, 0, 255);">private</span> set; }<br /><br /><br />    <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 255);">void</span> Init(ConnectionCost connectionCost)<br />    {<br />        <span style="color: rgb(0, 0, 255);">if</span> (connectionCost == <span style="color: rgb(0, 0, 255);">null</span>) <span style="color: rgb(0, 0, 255);">return</span>;<br />        <span style="color: rgb(0, 0, 255);">if</span> (connectionCost.Roaming || connectionCost.OverDataLimit)<br />        {<br />            Cost = NetworkCost.OptIn;<br />            Reason = connectionCost.Roaming<br />                ? <span style="color: rgb(0, 96, 128);">&quot;Connection is roaming; using the connection may result in additional charge.&quot;</span><br />                : <span style="color: rgb(0, 96, 128);">&quot;Connection has exceeded the usage cap limit.&quot;</span>;<br />        }<br />        <span style="color: rgb(0, 0, 255);">else</span> <span style="color: rgb(0, 0, 255);">if</span> (connectionCost.NetworkCostType == NetworkCostType.Fixed<br />            || connectionCost.NetworkCostType == NetworkCostType.Variable)<br />        {<br />            Cost = NetworkCost.Conservative;<br />            Reason = connectionCost.NetworkCostType == NetworkCostType.Fixed<br />                ? <span style="color: rgb(0, 96, 128);">&quot;Connection has limited allowed usage.&quot;</span><br />                : <span style="color: rgb(0, 96, 128);">&quot;Connection is charged based on usage. &quot;</span>;<br />        }<br />        <span style="color: rgb(0, 0, 255);">else</span><br />        {<br />            Cost = NetworkCost.Normal;<br />            Reason = connectionCost.NetworkCostType == NetworkCostType.Unknown<br />                ? <span style="color: rgb(0, 96, 128);">&quot;Connection is unknown.&quot;</span><br />                : <span style="color: rgb(0, 96, 128);">&quot;Connection cost is unrestricted.&quot;</span>;<br />        }<br />    }<br />}<br /></pre>

    <br /></div>
</blockquote>

<p>Use a <a href="http://code.msdn.microsoft.com/windowsapps/Network-Information-Sample-63aaa201" target="_blank">amostra de informação da rede</a> para saber mais sobre como adaptar o comportamento de aplicativos para redes limitadas.</p>

<p>Os usuários também podem executar o Gerenciador de Tarefas para verificar o volume de dados de rede que cada aplicativo está consumindo. Esta captura de tela mostra um exemplo.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/5618.task-manager_6C99F920.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/5618.task_2D00_manager_5F00_6C99F920.png"><img title="A guia Histórico de Aplicativos no Gerenciador de Tarefas permite que os usuários vejam o consumo de CPU e rede por aplicativo" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="A guia Histórico de Aplicativos no Gerenciador de Tarefas permite que os usuários vejam o consumo de CPU e rede por aplicativo" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/31/metablogapi/3554.task-manager_thumb_4C7EEC63.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-31-metablogapi/3554.task_2D00_manager_5F00_thumb_5F00_4C7EEC63.png" width="600" height="545" /></a></p>

<p align="center"><em>A guia Histórico de Aplicativos no Gerenciador de Tarefas permite que os usuários vejam o consumo de CPU e rede por aplicativo</em></p>

<h2>Reaja à alteração de status da rede</h2>

<p>Em qualquer situação com um dispositivo móvel, as redes podem se conectar ou desconectar. Uma rede de banda larga móvel 3G ou 4G pode ficar fora do alcance na casa ou na garagem de um usuário enquanto o Wi-Fi ainda está disponível. Da mesma forma, um Wi-Fi pode ficar fora do alcance quando um usuário deixa a sua casa. Pode haver situações onde nenhuma rede esteja disponível. Dada a proliferação de redes Wi-Fi e de redes de banda larga móveis, tais alterações na rede ocorrem com frequência. </p>

<p>Um evento <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.networkinformation.networkstatuschanged" target="_blank">NetworkStatusChanged</a> indica que o <i>custo disponível</i> ou as <i>opções de conectividade</i> podem ter sido alterados. Para reagir a alterações no status da rede e fornecer ao usuário uma ótima experiência quando as alterações ocorrerem, faça com que os seus aplicativos conectados sigam as seguintes diretrizes.</p>

<h3>Perda da conexão devido a erro</h3>

<p>Na maioria dos casos, as conexões podem ser restabelecidas simplesmente repetindo a operação de rede. Se isto falhar, espere por um evento <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.networkinformation.networkstatuschanged" target="_blank">NetworkStatusChanged</a>. Recomendamos que os aplicativos usem intervalos crescentes de retirada entre as tentativas, começando com um valor de 50 milissegundos e aumentando este intervalo exponencialmente caso as conexões continuem a falhar.</p>

<h3>Perda da rede</h3>

<p>Informe o usuário que a conexão foi perdida, faça o registro e espere por um evento <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.networkinformation.networkstatuschanged" target="_blank">NetworkStatusChanged</a>.</p>

<h3>Nova disponibilidade de rede</h3>

<p>Pode haver situações em que o dispositivo está conectado a múltiplas redes. Por exemplo, um usuário pode estar conectado a uma banda larga móvel, conversando com amigos por meio do aplicativo Windows 8 Messaging antes de chegar em casa e pode estar conectado a uma rede irrestrita ali também. A política padrão no Windows 8 é preferir uma rede irrestrita em vez de uma rede limitada e uma rede mais rápida em vez de uma mais lenta. Entretanto, conexões já estabelecidas por um aplicativo não alternam automaticamente para uma nova rede. Nesse caso, o aplicativo deve agir pois apenas o aplicativo pode tomar a melhor decisão sobre se deve ou não alternar para a nova rede. </p>

<p>Por exemplo, se a transmissão de um vídeo estiver quase concluída, pode não fazer sentido alternar a conexão para uma nova rede. Entretanto, se a rede atual estiver caindo, lenta demais ou se a transmissão for levar mais tempo para concluir, a alternância para uma nova rede pode ser o melhor.</p>

<p>Se você determinar que a alternância de rede é plausível para a situação do seu aplicativo, siga estas diretrizes quando detectar uma nova rede:</p>

<ol>
  <li>Verifique os custos da rede já existentes e da nova rede. Se fizer sentido alternar para a nova rede, tente fazer uma nova conexão de rede e tente a operação de rede novamente baseando-se nas diretrizes que acabamos de mencionar. O Windows automaticamente selecionará a rede irrestrita em vez da rede limitada e a rede mais rápida em vez da mais lenta.</li>

  <li>Se a nova conexão de rede for bem sucedida, use a nova conexão à rede no seu aplicativo e cancele a operação de rede original na rede anterior, caso a conexão já exista.</li>
</ol>

<h3>Alteração no custo da rede</h3>

<p>Alterações no custo da rede podem ocorrer quando a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank">NetworkCostType</a> é <b>Fixa</b> e o uso já estiver acima ou chegando próximo ao limite de dados. Alterações no custo da rede também podem ocorrer se a <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.networkcosttype.aspx" target="_blank">NetworkCostType</a> se tornar <b>Variável</b>, ou se o <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.connectioncost.roaming.aspx" target="_blank">Roaming</a> mudar para verdadeiro. Nesses casos, adapte o comportamento do aplicativo baseando-se nas diretrizes da dica anterior.</p>

<p>Os códigos de exemplos usam o evento <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.networkinformation.networkstatuschanged" target="_blank">NetworkStatusChanged</a> para fornecer uma ótima experiência de aplicativo para várias alterações de status em redes. Ambos os exemplos usam uma variável booliana global denominada <i>registeredNetworkStatusNotification,</i> inicialmente definida como <b>falso</b>. </p>

<p><strong>JavaScript</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 128, 0);">// Register for NetworkStatusChanged notifications, and display new </span><br /><span style="color: rgb(0, 128, 0);">// Internet ConnectionProfile info upon network status change.</span><br /><span style="color: rgb(0, 0, 255);">function</span> registerForNetworkStatusChange() {<br />    <span style="color: rgb(0, 0, 255);">try</span> {<br /><br />        <span style="color: rgb(0, 128, 0);">// Register for network status change notifications.</span><br />        <span style="color: rgb(0, 0, 255);">if</span> (!registeredNetworkStatusNotification) {<br />            <span style="color: rgb(0, 0, 255);">var</span> networkInfo.addEventListener(<span style="color: rgb(0, 96, 128);">&quot;networkstatuschanged&quot;</span>, onNetworkStatusChange);<br />            registeredNetworkStatusNotification = <span style="color: rgb(0, 0, 255);">true</span>;<br />        }<br />    }<br />    <span style="color: rgb(0, 0, 255);">catch</span> (e) {<br />        print(<span style="color: rgb(0, 96, 128);">&quot;An unexpected exception occurred: &quot;</span> + e.name + <span style="color: rgb(0, 96, 128);">&quot;: &quot;</span> + e.message);<br />    }<br />}<br /><br /><span style="color: rgb(0, 128, 0);">// Event handler for NetworkStatusChanged event</span><br /><span style="color: rgb(0, 0, 255);">function</span> onNetworkStatusChange(sender) {<br />    <span style="color: rgb(0, 0, 255);">try</span> {<br />        <span style="color: rgb(0, 128, 0);">// Get the ConnectionProfile that is currently used to connect </span><br />        <span style="color: rgb(0, 128, 0);">// to the Internet.</span><br />        <span style="color: rgb(0, 0, 255);">var</span> internetProfile = networkInfo.getInternetConnectionProfile();<br />        <span style="color: rgb(0, 0, 255);">if</span> (internetProfile === <span style="color: rgb(0, 0, 255);">null</span>) {<br />            print(<span style="color: rgb(0, 96, 128);">&quot;Not connected to Internet\n\r&quot;</span>);<br />        }<br />        <span style="color: rgb(0, 0, 255);">else</span> {<br />            internetProfileInfo += getConnectionProfileInfo(internetProfile) + <span style="color: rgb(0, 96, 128);">&quot;\n\r&quot;</span>;<br />            print(internetProfileInfo);<br />        }<br />        internetProfileInfo = <span style="color: rgb(0, 96, 128);">&quot;&quot;</span>;<br />    }<br />    <span style="color: rgb(0, 0, 255);">catch</span> (e) {<br />        print(<span style="color: rgb(0, 96, 128);">&quot;An unexpected exception occurred: &quot;</span> + e.name + <span style="color: rgb(0, 96, 128);">&quot;: &quot;</span> + e.message);<br />    }<br />}<br /></pre>

    <br /></div>
</blockquote>

<p><strong>C#</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 128, 0);">// Register for NetworkStatusChanged notifications, and display new </span><br /><span style="color: rgb(0, 128, 0);">// Internet ConnectionProfile info upon network status change.</span><br /><span style="color: rgb(0, 0, 255);">void</span> NetworkStatusChange()<br />{<br />    <span style="color: rgb(0, 128, 0);">// Register for network status change notifications.</span><br />    <span style="color: rgb(0, 0, 255);">try</span><br />    {<br />        var networkStatusCallback = <span style="color: rgb(0, 0, 255);">new</span> NetworkStatusChangedEventHandler(OnNetworkStatusChange);<br />        <span style="color: rgb(0, 0, 255);">if</span> (!registeredNetworkStatusNotification)<br />        {<br />            NetworkInformation.NetworkStatusChanged += networkStatusCallback;<br />            registeredNetworkStatusNotification = <span style="color: rgb(0, 0, 255);">true</span>;<br />        }<br />    }<br />    <span style="color: rgb(0, 0, 255);">catch</span> (Exception ex)<br />    {<br />        rootPage.NotifyUser(<span style="color: rgb(0, 96, 128);">&quot;Unexpected exception occurred: &quot;</span> + ex.ToString(), NotifyType.ErrorMessage);<br />    }<br />}<br /><br /><span style="color: rgb(0, 128, 0);">// Event handler for NetworkStatusChanged event</span><br />async <span style="color: rgb(0, 0, 255);">void</span> OnNetworkStatusChange(<span style="color: rgb(0, 0, 255);">object</span> sender)<br />{<br />    <span style="color: rgb(0, 0, 255);">try</span><br />    {<br />        <span style="color: rgb(0, 128, 0);">// Get the ConnectionProfile that is currently used to connect </span><br />        <span style="color: rgb(0, 128, 0);">// to the Internet                </span><br />        ConnectionProfile InternetConnectionProfile = NetworkInformation.GetInternetConnectionProfile();<br /><br />        <span style="color: rgb(0, 0, 255);">if</span> (InternetConnectionProfile == <span style="color: rgb(0, 0, 255);">null</span>)<br />        {<br />            await _cd.RunAsync(CoreDispatcherPriority.Normal, () =&gt;<br />            {<br />                rootPage.NotifyUser(<span style="color: rgb(0, 96, 128);">&quot;Not connected to Internet\n&quot;</span>, NotifyType.StatusMessage);<br />            });<br />        }<br />        <span style="color: rgb(0, 0, 255);">else</span><br />        {<br />            connectionProfileInfo = GetConnectionProfile(InternetConnectionProfile);<br />            await _cd.RunAsync(CoreDispatcherPriority.Normal, () =&gt;<br />            {<br />                rootPage.NotifyUser(connectionProfileInfo, NotifyType.StatusMessage);<br />            });<br />        }<br />        internetProfileInfo = <span style="color: rgb(0, 96, 128);">&quot;&quot;</span>;<br />    }<br />    <span style="color: rgb(0, 0, 255);">catch</span> (Exception ex)<br />    {<br />        rootPage.NotifyUser(<span style="color: rgb(0, 96, 128);">&quot;Unexpected exception occurred: &quot;</span> + ex.ToString(), NotifyType.ErrorMessage);<br />    }<br />}<br /></pre>
  </div>
</blockquote>

<p>Para mais informações sobre o evento <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.networking.connectivity.networkinformation.networkstatuschanged" target="_blank">NetworkStatusChanged</a> , consulte o <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/hh700376.aspx" target="_blank">Guia de início rápido: Gerenciando eventos de conexão e mudanças na disponibilidade</a> e a <a href="http://code.msdn.microsoft.com/windowsapps/Network-Information-Sample-63aaa201" target="_blank">Network information sample</a> (Amostra de informações da rede).</p>

<h2>Conteúdo de cache para fluidez</h2>

<p>Passando conteúdo de cache para o disco dá ao seu aplicativo rapidez e fluidez. Por exemplo, um aplicativo leitor de RSS feed pode exibir imediatamente os feeds que foram colocados em cache no disco em uma sessão anterior. Assim que os feeds mais recentes estiverem disponíveis, o aplicativo atualiza o conteúdo. O cache assegura que o usuário tenha conteúdo para ler logo no início, enquanto o aplicativo obtém um novo conteúdo.</p>

<p>O Windows 8 oferece a classe <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.storage.applicationdata.aspx" target="_blank">ApplicationData</a><b></b> no namespace <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.storage.aspx" target="_blank">Windows.Storage</a><b></b>. Esta classe oferece acesso ao repositório de dados do aplicativo. Este repositório de dados consiste de arquivos e configurações que são locais ao dispositivo, que são transferidos por múltiplos dispositivos ou que são temporários.</p>

<p>Arquivos são ideais para armazenar grandes conjuntos de dados, bancos de dados ou dados que estejam em um formato de arquivo comum. Arquivos podem existir em pastas roaming, locais ou temporárias. O que isso significa é o seguinte:</p>

<ul>
  <li>Arquivos Roaming são sincronizados em múltiplas máquinas e dispositivos nos quais os usuários entraram com contas conectadas. O Roaming de arquivos não é instantâneo; o sistema avalia vários fatores para determinar quando enviar informações. Mantenha o uso de dados de roaming abaixo da cota (disponível por meio da propriedade <a href="http://msdn.microsoft.com/pt-br/library/windows/apps/windows.storage.applicationdata.roamingstoragequota.aspx" target="_blank">RoamingStorageQuota</a><b></b> ). Se a cota for excedida, o roaming de dados será suspenso. Arquivos não podem ser transferidos enquanto um aplicativo os estiver gravando. Portanto, certifique-se de fechar os objetos de arquivos do seu aplicativo quando eles não forem mais necessários. </li>

  <li>Arquivos locais não são sincronizados em múltiplas máquinas. Eles permanecem na máquina onde foram originalmente gravados. </li>

  <li>Arquivos temporários estão sujeitos a serem excluídos quando não estiverem em uso. O sistema considera fatores como capacidade disponível do disco e idade de um arquivo, para determinar quando ou se deve excluir um arquivo temporário.</li>
</ul>

<p>Estes códigos de exemplo fazem o cache de conteúdo no disco. Fazer o cache da resposta do servidor permite que o seu aplicativo exiba imediatamente o conteúdo ao usuário após um término ou um reinício de sessão. Por uma questão de concisão, estes exemplos não mostram como gravar configurações para o repositório de dados de aplicativo ou como reagir a eventos de roaming. A <a href="http://code.msdn.microsoft.com/windowsapps/ApplicationData-sample-fb043eb2" target="_blank">Application data sample</a> (Amostra de dados do aplicativo) cobre estes detalhes.</p>

<p><strong>JavaScript</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);"><span style="color: rgb(0, 0, 255);">var</span> roamingFolder = Windows.Storage.ApplicationData.current.roamingFolder;<br /><span style="color: rgb(0, 0, 255);">var</span> filename = <span style="color: rgb(0, 96, 128);">&quot;serverResponse.txt&quot;</span>;<br /><br /><span style="color: rgb(0, 0, 255);">function</span> cacheResponse(strResponse) {<br />    roamingFolder.createFileAsync(filename, Windows.Storage.CreationCollisionOption.replaceExisting)<br />        .done(<span style="color: rgb(0, 0, 255);">function</span> (file) {<br />            <span style="color: rgb(0, 0, 255);">return</span> Windows.Storage.FileIO.writeTextAsync(file, strResponse);<br />        });<br />}<br /><br /><span style="color: rgb(0, 0, 255);">function</span> getCachedResponse() {<br />    roamingFolder.getFileAsync(filename)<br />        .then(<span style="color: rgb(0, 0, 255);">function</span> (file) {<br />            <span style="color: rgb(0, 0, 255);">return</span> Windows.Storage.FileIO.readTextAsync(file);<br />        }).done(<span style="color: rgb(0, 0, 255);">function</span> (response) {<br />            print(response);<br />        }, <span style="color: rgb(0, 0, 255);">function</span> () {<br />            <span style="color: rgb(0, 128, 0);">// getFileAsync or readTextAsync failed. </span><br />            <span style="color: rgb(0, 128, 0);">// No cached response.</span><br />        });<br />}<br /></pre>

    <br /></div>
</blockquote>

<p><strong>C#</strong></p>

<blockquote>
  <div id="codeSnippetWrapper">
    <pre id="codeSnippet" style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &quot;Courier New&quot;, courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);">MainPage rootPage = MainPage.Current;<br />StorageFolder roamingFolder = <span style="color: rgb(0, 0, 255);">null</span>;<br /><span style="color: rgb(0, 0, 255);">const</span> <span style="color: rgb(0, 0, 255);">string</span> filename = <span style="color: rgb(0, 96, 128);">&quot;serverResponse.txt&quot;</span>;<br /><br />async <span style="color: rgb(0, 0, 255);">void</span> cacheResponse(<span style="color: rgb(0, 0, 255);">string</span> strResponse)<br />{<br />    StorageFile file = await roamingFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);<br />    await FileIO.WriteTextAsync(file, strResponse);<br />}<br /><br />async <span style="color: rgb(0, 0, 255);">void</span> getCachedResponse()<br />{<br />    <span style="color: rgb(0, 0, 255);">try</span><br />    {<br />        StorageFile file = await roamingFolder.GetFileAsync(filename);<br />        <span style="color: rgb(0, 0, 255);">string</span> response = await FileIO.ReadTextAsync(file);<br />    }<br />    <span style="color: rgb(0, 0, 255);">catch</span> (Exception)<br />    {<br />        <span style="color: rgb(0, 128, 0);">// getFileAsync or readTextAsync failed.</span><br />        <span style="color: rgb(0, 128, 0);">// No cached response.</span><br />    }<br />}<br /></pre>

    <br /></div>
</blockquote>

<p>Para obter mais informações sobre o repositório de dados de aplicativo, consulte a postagem <a href="http://blogs.msdn.com/b/windowsappdev_br/archive/2012/07/24/roaming.aspx" target="_blank">Transferindo os dados de seu aplicativo</a> e experimente a <a href="http://code.msdn.microsoft.com/windowsapps/ApplicationData-sample-fb043eb2" target="_blank">Application data sample</a> (Amostra de dados do aplicativo).</p>

<h2>Resumindo</h2>

<p>Quando estiver planejando os seus aplicativos da Windows Store, use as diretrizes nesta postagem para fornecer uma experiência de conexão excelente e sem problemas. Estas dicas podem facilitar o seu processo de desenvolvimento e ao mesmo tempo manter a fluidez e aumentar a confiança dos usuários nos seus aplicativos.</p>

<p>- Suhail Khalid, gerente de programa II, Windows</p>

<p>Com a contribuição de: Steven Baker e Peter Smith</p>
<!-- Title: “Criando aplicativos conectados da Windows Store” Tags: “aplicativos da Windows Store, HttpClient, aplicativos conectados, XMLHTTPRequest, IXHR2, XML HTTP Request 2, WinJS.xhr” -->
</div>]]></content:encoded>
    </item>
    <item>
      <title>Registre-se agora na //build/ 2013!</title>
      <link>https://docs.microsoft.com/archive/blogs/windowsappdev_br/registre-se-agora-na-build-2013</link>
      <pubDate>Fri, 05 Apr 2013 10:34:03 GMT</pubDate>
      <dc:creator><![CDATA[Windows 8 Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windowsappdev_br/2013/04/05/registre-se-agora-na-build-2013/</guid>
      <description><![CDATA[Na última semana, Steve Guggenheimer anunciou a //build/ 2013. A conferência acontecerá entre os...]]></description>
      <content:encoded><![CDATA[<div class="PostContent"><p>Na última semana, Steve Guggenheimer <a href="http://blogs.technet.com/b/microsoft_blog/archive/2013/03/26/announcing-build-2013.aspx" target="_blank">anunciou</a> a //build/ 2013. A conferência acontecerá entre os dias 26 e 28 de junho de 2013, no Moscone Center, em São Francisco. A //build/ é uma ótima oportunidade para você aprender mais sobre como desenvolver aplicativos da Windows Store. Na conferência você assistirá a excelentes apresentações, demonstrações, sessões de informações e muito mais. Muitos membros da nossa equipe de engenharia estão viajando para São Francisco para apresentar essas demonstrações e responder às suas perguntas. Se você quiser ficar por dentro das últimas (e melhores) informações sobre o desenvolvimento de aplicativo da Windows Store, não existe lugar melhor. </p>  <p>As inscrições começaram na terça-feira, 2 de abril<sup></sup>. Você pode ver todos os detalhes sobre a conferência e se registrar em <a href="http://www.buildwindows.com" target="_blank">www.buildwindows.com</a>. </p>  <p>Encontramos você lá!</p> <!-- Title: “Registre-se agora na //build/ 2013!” Tags: “build” --></div>]]></content:encoded>
    </item>
  </channel>
</rss>